From b9ac87624b0f8fb158766958af5674b535fa7d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Mon, 9 Oct 2023 18:06:49 +0800 Subject: [PATCH 001/127] add pg-boss --- packages/server/package.json | 3 +- packages/server/src/main.ts | 2 +- .../_test_/ceramic.subscriber.service.spec.ts | 2 +- .../src/stream/ceramic.subscriber.service.ts | 273 ------------------ packages/server/src/stream/stream.module.ts | 2 +- .../subscriber/ceramic.subscriber.service.ts | 106 +++++++ .../src/stream/subscriber/store.worker.ts | 232 +++++++++++++++ packages/server/test/stream.e2e-spec.ts | 2 +- packages/server/yarn.lock | 84 +++++- 9 files changed, 427 insertions(+), 279 deletions(-) delete mode 100644 packages/server/src/stream/ceramic.subscriber.service.ts create mode 100644 packages/server/src/stream/subscriber/ceramic.subscriber.service.ts create mode 100644 packages/server/src/stream/subscriber/store.worker.ts diff --git a/packages/server/package.json b/packages/server/package.json index 971564be..d1fefe6f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -23,6 +23,7 @@ "dependencies": { "@ceramicnetwork/common": "^2.35.0", "@ceramicnetwork/http-client": "^2.32.0", + "@ceramicnetwork/job-queue": "^1.2.0", "@chainsafe/libp2p-gossipsub": "^6.1.0", "@chainsafe/libp2p-noise": "^11.0.0", "@composedb/devtools": "^0.5.0", @@ -136,4 +137,4 @@ "engines": { "node": "^v16.0.0" } -} \ No newline at end of file +} diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index b4c4e959..54dd5286 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -4,7 +4,7 @@ import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; import { Network } from './entities/stream/stream.entity'; -import CeramicSubscriberService from './stream/ceramic.subscriber.service'; +import CeramicSubscriberService from './stream/subscriber/ceramic.subscriber.service'; async function bootstrap() { // init the apm diff --git a/packages/server/src/stream/_test_/ceramic.subscriber.service.spec.ts b/packages/server/src/stream/_test_/ceramic.subscriber.service.spec.ts index 62a01cf6..1d755b97 100644 --- a/packages/server/src/stream/_test_/ceramic.subscriber.service.spec.ts +++ b/packages/server/src/stream/_test_/ceramic.subscriber.service.spec.ts @@ -1,7 +1,7 @@ import { Network, Status, Stream } from '../../entities/stream/stream.entity'; import { getRepositoryToken } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import CeramicSubscriberService from '../ceramic.subscriber.service'; +import CeramicSubscriberService from '../subscriber/ceramic.subscriber.service'; import { Test, TestingModule } from '@nestjs/testing'; describe('CeramicSubscriberService Logic Test', () => { diff --git a/packages/server/src/stream/ceramic.subscriber.service.ts b/packages/server/src/stream/ceramic.subscriber.service.ts deleted file mode 100644 index 2977b658..00000000 --- a/packages/server/src/stream/ceramic.subscriber.service.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { Injectable, Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Network, Status, Stream } from '../entities/stream/stream.entity'; -import { StreamRepository } from '../entities/stream/stream.repository'; -import e from 'express'; -const _importDynamic = new Function('modulePath', 'return import(modulePath)'); - -@Injectable() -export default class CeramicSubscriberService { - private readonly logger = new Logger(CeramicSubscriberService.name); - - constructor( - @InjectRepository(Stream, 'testnet') - private readonly streamRepository: StreamRepository, - ) { } - async subCeramic( - network: Network, - bootstrapMultiaddrs: string[], - listen: string[], - topic: string, - ceramicNetworkUrl: string, - ) { - const node = await this.createP2PNode(bootstrapMultiaddrs, listen); - node.pubsub.subscribe(topic); - - const ceramic = await this.createCeramicClient(ceramicNetworkUrl); - node.pubsub.addEventListener('message', async (message) => { - try { - const textDecoder = new TextDecoder('utf-8'); - const asString = textDecoder.decode(message.detail.data); - const parsed = JSON.parse(asString); - if (parsed.typ == 0) { - // MsgType: UPDATE - this.logger.log( - `${network}, sub p2p message: ${JSON.stringify(parsed)}`, - ); - await this.store(ceramic, network, parsed.stream); - } - // else if (parsed.typ == 2) { - // // MsgType: RESPONSE - // const streamIds = Object.keys(parsed.tips); - // await Promise.all( - // streamIds?.map(async (streamId) => { - // await this.store(ceramic, network, streamId); - // }), - // ); - // } - } catch (error) { - this.logger.error( - `${network} ceramic sub err, messgage:${message} error:${error}`, - ); - } - }); - } - - async getCacao(cid: any): Promise { - let cacaoDag; - try { - const ipfsHttpClient = await _importDynamic('ipfs-http-client'); - const ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io', - }); - - const genesisDag = await ipfs.dag.get(cid, { timeout: 6000 }); - if (!genesisDag.value || !genesisDag.value.signatures) { - return; - } - this.logger.log(`[CACAO] Getting genesis cacao value:${JSON.stringify(genesisDag.value)} cid:${cid}`); - - const { base64urlToJSON } = await _importDynamic( - '@ceramicnetwork/common', - ); - const decodedProtectedHeader = base64urlToJSON( - genesisDag.value.signatures[0].protected, - ); - const capIPFSUri = decodedProtectedHeader.cap; - this.logger.log(`[CACAO] Getting capIPFSUri:${capIPFSUri} cid:${cid}`); - if (!capIPFSUri) return; - - const { CID } = await _importDynamic('multiformats/cid'); - const cacaoCid = CID.parse(capIPFSUri.replace('ipfs://', '')); - if (!cacaoCid) return; - - cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); - } catch (error) { - const ipfsErr = 'Error 500 (Internal server error) when trying to fetch content from the IPFS network.'; - if (error.toString().includes(ipfsErr)) { - this.logger.warn(`Getting cacao err, cid:${cid} error:${ipfsErr}`); - } else { - this.logger.warn(`Getting cacao err, cid:${cid} error:${JSON.stringify(error)}`); - } - } - - return cacaoDag; - } - - async createP2PNode(bootstrapMultiaddrs: string[], listen: string[]) { - const libp2p = await _importDynamic('libp2p'); - const webSockets = await _importDynamic('@libp2p/websockets'); - const mplex = await _importDynamic('@libp2p/mplex'); - const noise = await _importDynamic('@chainsafe/libp2p-noise'); - const gossipsub = await _importDynamic('@chainsafe/libp2p-gossipsub'); - const bootstrap = await _importDynamic('@libp2p/bootstrap'); - - return await libp2p.createLibp2p({ - peerDiscovery: [ - bootstrap.bootstrap({ - list: bootstrapMultiaddrs, // provide array of multiaddrs - }), - ], - connectionManager: { - autoDial: true, // Auto connect to discovered peers (limited by ConnectionManager minConnections) - // The `tag` property will be searched when creating the instance of your Peer Discovery service. - // The associated object, will be passed to the service when it is instantiated. - }, - addresses: { - listen: listen, - }, - transports: [webSockets.webSockets()], - streamMuxers: [mplex.mplex()], - connectionEncryption: [noise.noise()], - pubsub: gossipsub.gossipsub(), - }); - } - - async createCeramicClient(ceramicNetworkUrl: string) { - const CeramicClient = await _importDynamic('@ceramicnetwork/http-client'); - return new CeramicClient.CeramicClient(ceramicNetworkUrl); - } - - async loadStream(ceramic: any, streamId: string) { - let remainRetires = 3; - while (remainRetires > 0) { - try { - const stream = await ceramic.loadStream(streamId); - return stream; - } catch (error) { - remainRetires--; - this.logger.error( - `load stream err, remainRetires:${remainRetires} streamId:${streamId} error:${error}`, - ); - } - } - } - - // Store all streams. - async store(ceramic: any, network: Network, streamId: string) { - const stream = await this.loadStream(ceramic, streamId); - if (!stream) return; - - await this.storeStream( - network, - streamId, - stream.allCommitIds, - stream.state, - stream.id.cid, - ); - // save schema stream - if (stream?.metadata?.schema) { - const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); - const schemaStream = await this.loadStream(ceramic, schemaStreamId); - if (schemaStream) { - await this.storeStream( - network, - schemaStreamId, - schemaStream.allCommitIds, - schemaStream.state, - ); - } - } - // save model stream - if (stream?.metadata?.model) { - const modelStreamId = stream.metadata.model.toString(); - const modelStream = await this.loadStream(ceramic, modelStreamId); - if (modelStream) { - await this.storeStream( - network, - modelStreamId, - modelStream.allCommitIds, - modelStream.state, - ); - } - } - } - - async storeStream( - network: Network, - streamId: string, - commitIds: string[], - streamState: any, - genesisCid?: any, - ) { - try { - let domain: string; - if (genesisCid && streamState?.metadata?.model) { - this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); - - const cacao = await this.getCacao(genesisCid); - this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); - - domain = cacao?.value?.p?.domain; - this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); - } - - const stream = this.convertToStreamEntity( - network, - streamId, - commitIds, - streamState, - domain, - ); - if (!stream) return; - - const savedStream = await this.streamRepository.upsert(stream, [ - 'network', - 'stream_id', - ]); - this.logger.log(`Saved network(${network}) stream id(${streamId})`); - return savedStream; - } catch (error) { - // this.logger.error( - // `To store network(${network}) stream(${streamId}) err:${JSON.stringify( - // error, - // )}`, - // ); - } - } - - convertToStreamEntity( - network: Network, - streamId: string, - commitIds: string[], - streamState: any, - domain?: string, - ): Stream { - const stream = new Stream(); - stream.setStreamId = streamId; - stream.setNetwork = network; - if (streamState?.metadata?.family) - stream.setFamily = streamState.metadata.family; - stream.setType = streamState.type; - stream.setDid = streamState?.metadata?.controllers[0]; - if (streamState.anchorStatus == 3) { - stream.setAnchorStatus = Status.ANCHORED; - } else { - stream.setAnchorStatus = Status.NOT_ANCHORED; - } - if (streamState?.anchorProof && streamState.anchorProof.blockTimestamp) { - stream.setAnchorDate = new Date( - streamState.anchorProof.blockTimestamp * 1000, - ); - stream.setAnchorHash = streamState.anchorProof.txHash.toString(); - } - if (streamState?.metadata?.schema) - stream.setSchema = streamState.metadata.schema.replace('ceramic://', ''); - if (streamState?.metadata?.model) { - stream.setModel = streamState.metadata.model.toString(); - } - if (streamState?.metadata?.tags) stream.setTags = streamState.metadata.tags; - stream.setCommitIds = commitIds?.map((id) => - id.toString().replace('CommitID(', '').replace(')', ''), - ); - if (domain) { - // this.logger.log(`The stream(${streamId}) has the domain:${domain}`); - stream.setDomain = domain; - } - stream.setContent = streamState.content; - stream.setMetadata = streamState.metadata; - stream.setOriginData = JSON.parse(JSON.stringify(streamState)); - stream.setLastModifiedAt = new Date(); - return stream; - } -} diff --git a/packages/server/src/stream/stream.module.ts b/packages/server/src/stream/stream.module.ts index ccd47574..563ca673 100644 --- a/packages/server/src/stream/stream.module.ts +++ b/packages/server/src/stream/stream.module.ts @@ -3,7 +3,7 @@ import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Stream } from '../entities/stream/stream.entity'; import StreamService from './stream.service'; -import CeramicSubscriberService from './ceramic.subscriber.service'; +import CeramicSubscriberService from './subscriber/ceramic.subscriber.service'; import { ModelModule } from 'src/model/model.module'; @Module({ diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts new file mode 100644 index 00000000..364b4e41 --- /dev/null +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -0,0 +1,106 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Network, Stream } from '../../entities/stream/stream.entity'; +import { StreamRepository } from '../../entities/stream/stream.repository'; +import { IJobQueue, Job, JobQueue } from '@ceramicnetwork/job-queue'; +import StoreWorker, { StoreStreamJob, StreamStoreData, createStreamStoreJob } from './store.worker'; +const _importDynamic = new Function('modulePath', 'return import(modulePath)'); + +@Injectable() +export default class CeramicSubscriberService { + private readonly logger = new Logger(CeramicSubscriberService.name); + private readonly jobQueue!: IJobQueue + + constructor( + @InjectRepository(Stream, 'testnet') + private readonly streamRepository: StreamRepository, + ) { + // TODO + this.jobQueue = new JobQueue('', null) + } + async subCeramic( + network: Network, + bootstrapMultiaddrs: string[], + listen: string[], + topic: string, + ceramicNetworkUrl: string, + ) { + const node = await this.createP2PNode(bootstrapMultiaddrs, listen); + node.pubsub.subscribe(topic); + // init ceramic client + const ceramicClient = await this.createCeramicClient(ceramicNetworkUrl); + + // init job queue + await this.jobQueue.init({ + [StoreStreamJob]: new StoreWorker( + this.streamRepository, ceramicClient + ), + }); + + node.pubsub.addEventListener('message', async (message) => { + try { + const textDecoder = new TextDecoder('utf-8'); + const asString = textDecoder.decode(message.detail.data); + const parsed = JSON.parse(asString); + if (parsed.typ == 0) { + // MsgType: UPDATE + this.logger.log( + `${network}, sub p2p message: ${JSON.stringify(parsed)}`, + ); + const job: Job = createStreamStoreJob(StoreStreamJob, { + network: network, + streamId: parsed.stream, + }); + await this.jobQueue.addJob(job); + } + // else if (parsed.typ == 2) { + // // MsgType: RESPONSE + // const streamIds = Object.keys(parsed.tips); + // await Promise.all( + // streamIds?.map(async (streamId) => { + // await this.store(ceramic, network, streamId); + // }), + // ); + // } + } catch (error) { + this.logger.error( + `${network} ceramic sub err, messgage:${message} error:${error}`, + ); + } + }); + } + + async createCeramicClient(ceramicNetworkUrl: string) { + const CeramicClient = await _importDynamic('@ceramicnetwork/http-client'); + return new CeramicClient.CeramicClient(ceramicNetworkUrl); + } + + async createP2PNode(bootstrapMultiaddrs: string[], listen: string[]) { + const libp2p = await _importDynamic('libp2p'); + const webSockets = await _importDynamic('@libp2p/websockets'); + const mplex = await _importDynamic('@libp2p/mplex'); + const noise = await _importDynamic('@chainsafe/libp2p-noise'); + const gossipsub = await _importDynamic('@chainsafe/libp2p-gossipsub'); + const bootstrap = await _importDynamic('@libp2p/bootstrap'); + + return await libp2p.createLibp2p({ + peerDiscovery: [ + bootstrap.bootstrap({ + list: bootstrapMultiaddrs, // provide array of multiaddrs + }), + ], + connectionManager: { + autoDial: true, // Auto connect to discovered peers (limited by ConnectionManager minConnections) + // The `tag` property will be searched when creating the instance of your Peer Discovery service. + // The associated object, will be passed to the service when it is instantiated. + }, + addresses: { + listen: listen, + }, + transports: [webSockets.webSockets()], + streamMuxers: [mplex.mplex()], + connectionEncryption: [noise.noise()], + pubsub: gossipsub.gossipsub(), + }); + } +} diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts new file mode 100644 index 00000000..447c0c55 --- /dev/null +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -0,0 +1,232 @@ +import { default as PgBoss } from 'pg-boss' +import { type SendOptions } from 'pg-boss' +import type { Worker, Job } from '@ceramicnetwork/job-queue' +import { Network, Status, Stream } from '../../entities/stream/stream.entity'; +import { Logger } from '@nestjs/common'; +import { StreamRepository } from 'src/entities/stream/stream.repository'; +const _importDynamic = new Function('modulePath', 'return import(modulePath)'); + +export const StoreStreamJob = 'storeStreamJob'; + +const JobOption: SendOptions = { + retryLimit: 5, + retryDelay: 60, // 1 minute + retryBackoff: true, + expireInHours: 12, + retentionDays: 3, +} + +export interface StreamStoreData { + network: Network + streamId: string +} + +export function createStreamStoreJob( + name: string, + data: StreamStoreData, + options?: SendOptions +): Job { + return { + name, + data, + options: options || JobOption, + } +} + +export default class StoreWorker implements Worker { + private readonly logger = new Logger(StoreWorker.name); + constructor( + private readonly streamRepository: StreamRepository, + private readonly ceramicClient: any, + ) { } + + async handler(job: PgBoss.Job) { + const jobData = job.data as StreamStoreData; + await this.store(jobData.network, jobData.streamId); + } + + async getCacao(cid: any): Promise { + let cacaoDag; + try { + const ipfsHttpClient = await _importDynamic('ipfs-http-client'); + const ipfs = await ipfsHttpClient.create({ + url: 'https://gateway.ipfs.io', + }); + + const genesisDag = await ipfs.dag.get(cid, { timeout: 6000 }); + if (!genesisDag.value || !genesisDag.value.signatures) { + return; + } + this.logger.log(`[CACAO] Getting genesis cacao value:${JSON.stringify(genesisDag.value)} cid:${cid}`); + + const { base64urlToJSON } = await _importDynamic( + '@ceramicnetwork/common', + ); + const decodedProtectedHeader = base64urlToJSON( + genesisDag.value.signatures[0].protected, + ); + const capIPFSUri = decodedProtectedHeader.cap; + this.logger.log(`[CACAO] Getting capIPFSUri:${capIPFSUri} cid:${cid}`); + if (!capIPFSUri) return; + + const { CID } = await _importDynamic('multiformats/cid'); + const cacaoCid = CID.parse(capIPFSUri.replace('ipfs://', '')); + if (!cacaoCid) return; + + cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); + } catch (error) { + const ipfsErr = 'Error 500 (Internal server error) when trying to fetch content from the IPFS network.'; + if (error.toString().includes(ipfsErr)) { + this.logger.warn(`Getting cacao err, cid:${cid} error:${ipfsErr}`); + } else { + this.logger.warn(`Getting cacao err, cid:${cid} error:${JSON.stringify(error)}`); + } + } + + return cacaoDag; + } + + async loadStream(streamId: string) { + let remainRetires = 3; + while (remainRetires > 0) { + try { + const stream = await this.ceramicClient.loadStream(streamId); + return stream; + } catch (error) { + remainRetires--; + this.logger.error( + `load stream err, remainRetires:${remainRetires} streamId:${streamId} error:${error}`, + ); + } + } + } + + // Store all streams. + async store(network: Network, streamId: string) { + const stream = await this.loadStream(streamId); + if (!stream) return; + + await this.storeStream( + network, + streamId, + stream.allCommitIds, + stream.state, + stream.id.cid, + ); + // save schema stream + if (stream?.metadata?.schema) { + const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); + const schemaStream = await this.loadStream(schemaStreamId); + if (schemaStream) { + await this.storeStream( + network, + schemaStreamId, + schemaStream.allCommitIds, + schemaStream.state, + ); + } + } + // save model stream + if (stream?.metadata?.model) { + const modelStreamId = stream.metadata.model.toString(); + const modelStream = await this.loadStream(modelStreamId); + if (modelStream) { + await this.storeStream( + network, + modelStreamId, + modelStream.allCommitIds, + modelStream.state, + ); + } + } + } + + async storeStream( + network: Network, + streamId: string, + commitIds: string[], + streamState: any, + genesisCid?: any, + ) { + try { + let domain: string; + if (genesisCid && streamState?.metadata?.model) { + this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); + + const cacao = await this.getCacao(genesisCid); + this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); + + domain = cacao?.value?.p?.domain; + this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); + } + + const stream = this.convertToStreamEntity( + network, + streamId, + commitIds, + streamState, + domain, + ); + if (!stream) return; + + const savedStream = await this.streamRepository.upsert(stream, [ + 'network', + 'stream_id', + ]); + this.logger.log(`Saved network(${network}) stream id(${streamId})`); + return savedStream; + } catch (error) { + // this.logger.error( + // `To store network(${network}) stream(${streamId}) err:${JSON.stringify( + // error, + // )}`, + // ); + } + } + + convertToStreamEntity( + network: Network, + streamId: string, + commitIds: string[], + streamState: any, + domain?: string, + ): Stream { + const stream = new Stream(); + stream.setStreamId = streamId; + stream.setNetwork = network; + if (streamState?.metadata?.family) + stream.setFamily = streamState.metadata.family; + stream.setType = streamState.type; + stream.setDid = streamState?.metadata?.controllers[0]; + if (streamState.anchorStatus == 3) { + stream.setAnchorStatus = Status.ANCHORED; + } else { + stream.setAnchorStatus = Status.NOT_ANCHORED; + } + if (streamState?.anchorProof && streamState.anchorProof.blockTimestamp) { + stream.setAnchorDate = new Date( + streamState.anchorProof.blockTimestamp * 1000, + ); + stream.setAnchorHash = streamState.anchorProof.txHash.toString(); + } + if (streamState?.metadata?.schema) + stream.setSchema = streamState.metadata.schema.replace('ceramic://', ''); + if (streamState?.metadata?.model) { + stream.setModel = streamState.metadata.model.toString(); + } + if (streamState?.metadata?.tags) stream.setTags = streamState.metadata.tags; + stream.setCommitIds = commitIds?.map((id) => + id.toString().replace('CommitID(', '').replace(')', ''), + ); + if (domain) { + // this.logger.log(`The stream(${streamId}) has the domain:${domain}`); + stream.setDomain = domain; + } + stream.setContent = streamState.content; + stream.setMetadata = streamState.metadata; + stream.setOriginData = JSON.parse(JSON.stringify(streamState)); + stream.setLastModifiedAt = new Date(); + return stream; + } + +} \ No newline at end of file diff --git a/packages/server/test/stream.e2e-spec.ts b/packages/server/test/stream.e2e-spec.ts index a95a8371..b31d317f 100644 --- a/packages/server/test/stream.e2e-spec.ts +++ b/packages/server/test/stream.e2e-spec.ts @@ -7,7 +7,7 @@ import { Network, Stream } from '../src/entities/stream/stream.entity'; import { StreamModule } from '../src/stream/stream.module'; import { ConfigModule } from '@nestjs/config'; import StreamService from '../src/stream/stream.service'; -import CeramicSubscriberService from '../src/stream/ceramic.subscriber.service'; +import CeramicSubscriberService from '../src/stream/subscriber/ceramic.subscriber.service'; import { StreamRepository } from '../src/entities/stream/stream.repository'; describe('BookmarkController (e2e)', () => { diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 85e5156c..c20f5ca6 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -788,6 +788,16 @@ query-string "^7.1.0" rxjs "^7.5.2" +"@ceramicnetwork/job-queue@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ceramicnetwork/job-queue/-/job-queue-1.2.0.tgz#32775cad03fd4aeca23488d3052d970f2573a5dd" + integrity sha512-KFUPbDcTkORmVQOXdG0UDeIEQP1iV8j4TSbNdnFzhVoelimmJA1Y6ZCC0/CESQWD22V8ecYgXZ4qxLn5ltC2SQ== + dependencies: + "@ceramicnetwork/common" "^2.35.0" + pg "^8.11.3" + pg-boss "^8.2.0" + rxjs "^7.8.1" + "@ceramicnetwork/stream-caip10-link@^2.0.0", "@ceramicnetwork/stream-caip10-link@^2.21.0": version "2.21.0" resolved "https://registry.yarnpkg.com/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-2.21.0.tgz#47466dac80cfb62e8603ec374f92f9949dfe8bad" @@ -6291,6 +6301,13 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cron-parser@^4.0.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5" + integrity sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q== + dependencies: + luxon "^3.2.1" + cron@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cron/-/cron-2.3.0.tgz#20df6da18d4f7d2f8937def2eb5fc0d1a320c526" @@ -6428,6 +6445,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -9239,6 +9261,11 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -10311,16 +10338,39 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pg-boss@^8.2.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/pg-boss/-/pg-boss-8.4.2.tgz#4c300e3683e6acd7c157481544a49b8f565fe5e5" + integrity sha512-xcl/G8C7qlCyrcvlQvgLVBIe68zO0XfZc6K86/G9fq/mL+YQMEo1spW6lHqsPpNi2KGlpXwBEL/XZxkMa19eRA== + dependencies: + cron-parser "^4.0.0" + delay "^5.0.0" + lodash.debounce "^4.0.8" + p-map "^4.0.0" + pg "^8.5.1" + serialize-error "^8.1.0" + uuid "^9.0.0" + pg-cloudflare@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0" integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + pg-connection-string@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8" integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg== +pg-connection-string@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" + integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== + pg-int8@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" @@ -10336,6 +10386,11 @@ pg-pool@^3.6.0: resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== +pg-pool@^3.6.1: + version "3.6.1" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" + integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== + pg-protocol@*, pg-protocol@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" @@ -10365,6 +10420,21 @@ pg-types@^4.0.1: postgres-interval "^3.0.0" postgres-range "^1.1.1" +pg@^8.11.3, pg@^8.5.1: + version "8.11.3" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" + integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== + dependencies: + buffer-writer "2.0.0" + packet-reader "1.0.0" + pg-connection-string "^2.6.2" + pg-pool "^3.6.1" + pg-protocol "^1.6.0" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + pg@^8.7.3: version "8.11.0" resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9" @@ -11012,7 +11082,7 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.2, rxjs@^7.5.5, rxjs@^7.8.0: +rxjs@^7.5.2, rxjs@^7.5.5, rxjs@^7.8.0, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== @@ -11119,6 +11189,13 @@ sentence-case@^3.0.4: tslib "^2.0.3" upper-case-first "^2.0.2" +serialize-error@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -12104,6 +12181,11 @@ uuid@9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache@^2.0.3: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" From e7059d005e45f291f55712a85364e3d37028a2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Mon, 9 Oct 2023 18:16:11 +0800 Subject: [PATCH 002/127] add json stringify --- packages/server/src/model/model.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/model/model.service.ts b/packages/server/src/model/model.service.ts index 49701988..47b80853 100644 --- a/packages/server/src/model/model.service.ts +++ b/packages/server/src/model/model.service.ts @@ -182,7 +182,7 @@ export default class ModelService { schema.push(...graphqls); createModelGraphqlsMap.set(model, schema); - this.logger.log(`Creating ${model} ${schema} the composite...`); + this.logger.log(`Creating ${model} ${JSON.stringify(schema)} the composite...`); let composite = await Composite.create({ ceramic: ceramic, schema: schema, From a82930398db34d60566a807f45aed75b11ecaa14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Mon, 9 Oct 2023 18:47:16 +0800 Subject: [PATCH 003/127] fix logs --- packages/server/src/model/model.service.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/server/src/model/model.service.ts b/packages/server/src/model/model.service.ts index 47b80853..209251d9 100644 --- a/packages/server/src/model/model.service.ts +++ b/packages/server/src/model/model.service.ts @@ -259,11 +259,7 @@ export default class ModelService { ); if (composite && runtimeDefinition && graphqlSchema) { this.logger.log( - `Getting ${network} model ${model} graph cache conposite ${JSON.parse( - composite, - )}, runtimeDefinition ${JSON.parse( - runtimeDefinition, - )}, graphqlSchema ${graphqlSchema}`, + `Getting ${network} model ${model} graph cache conposite ${composite}, runtimeDefinition ${runtimeDefinition}, graphqlSchema ${graphqlSchema}`, ); return { composite: JSON.parse(composite), From 9747a82250d6c135894c83054c4de06e074dcee8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 10 Oct 2023 10:15:58 +0800 Subject: [PATCH 004/127] add logs for runtime definiton --- packages/server/src/model/model.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/model/model.service.ts b/packages/server/src/model/model.service.ts index 209251d9..b6cc8042 100644 --- a/packages/server/src/model/model.service.ts +++ b/packages/server/src/model/model.service.ts @@ -207,13 +207,14 @@ export default class ModelService { // Merge composites const mergedComposite = Composite.from(composites); + console.log(`Merged composite: ${mergedComposite.toJSON()}`); // Compile composites let runtimeDefinition; try { this.logger.log('Compiling the composite...'); runtimeDefinition = mergedComposite.toRuntime(); - this.logger.log(JSON.stringify(runtimeDefinition)); + this.logger.log(`RuntimeDefinition: ${JSON.stringify(runtimeDefinition)}`); this.logger.log(`Compiling the composite... Done!`); } catch (e) { this.logger.error((e as Error).message); From 9bfb1dd4e357d7925b5adb9265eaa3ffad388fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 10 Oct 2023 10:38:01 +0800 Subject: [PATCH 005/127] add logs --- packages/server/src/model/model.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/model/model.service.ts b/packages/server/src/model/model.service.ts index b6cc8042..796f360f 100644 --- a/packages/server/src/model/model.service.ts +++ b/packages/server/src/model/model.service.ts @@ -200,14 +200,14 @@ export default class ModelService { schema: dto.graphql, }); this.logger.log( - `Creating the composite... Done! The encoded representation:${composite.toJSON()}`, + `Creating the composite... Done! The encoded representation:${JSON.stringify(composite.toJSON())}`, ); composites.push(composite); } // Merge composites const mergedComposite = Composite.from(composites); - console.log(`Merged composite: ${mergedComposite.toJSON()}`); + console.log(`Merged composite: ${JSON.stringify(mergedComposite.toJSON())}`); // Compile composites let runtimeDefinition; From e0112af41b581742070e30c6dfeb273f42d5aa92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 10 Oct 2023 16:55:28 +0800 Subject: [PATCH 006/127] replace jobqueue --- packages/server/package.json | 4 +- .../subscriber/ceramic.subscriber.service.ts | 5 +- .../server/src/stream/subscriber/job-queue.ts | 241 ++++++++++++++++++ .../src/stream/subscriber/store.worker.ts | 2 +- packages/server/yarn.lock | 22 +- 5 files changed, 252 insertions(+), 22 deletions(-) create mode 100644 packages/server/src/stream/subscriber/job-queue.ts diff --git a/packages/server/package.json b/packages/server/package.json index d1fefe6f..bc767394 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -23,7 +23,6 @@ "dependencies": { "@ceramicnetwork/common": "^2.35.0", "@ceramicnetwork/http-client": "^2.32.0", - "@ceramicnetwork/job-queue": "^1.2.0", "@chainsafe/libp2p-gossipsub": "^6.1.0", "@chainsafe/libp2p-noise": "^11.0.0", "@composedb/devtools": "^0.5.0", @@ -79,9 +78,10 @@ "key-did-provider-ed25519": "^3.0.0", "libp2p": "^0.42.2", "pg": "^8.7.3", + "pg-boss": "^9.0.3", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", - "rxjs": "^7.8.0", + "rxjs": "^7.8.1", "sqlite3": "^5.0.1", "swagger-ui-express": "^4.4.0", "typeorm": "^0.2.31", diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index 364b4e41..aee3dafa 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Network, Stream } from '../../entities/stream/stream.entity'; import { StreamRepository } from '../../entities/stream/stream.repository'; -import { IJobQueue, Job, JobQueue } from '@ceramicnetwork/job-queue'; +import { IJobQueue, Job, JobQueue } from './job-queue'; import StoreWorker, { StoreStreamJob, StreamStoreData, createStreamStoreJob } from './store.worker'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @@ -15,8 +15,7 @@ export default class CeramicSubscriberService { @InjectRepository(Stream, 'testnet') private readonly streamRepository: StreamRepository, ) { - // TODO - this.jobQueue = new JobQueue('', null) + this.jobQueue = new JobQueue(process.env.PG_BOSS_DATABASE_URL); } async subCeramic( network: Network, diff --git a/packages/server/src/stream/subscriber/job-queue.ts b/packages/server/src/stream/subscriber/job-queue.ts new file mode 100644 index 00000000..7cde8baf --- /dev/null +++ b/packages/server/src/stream/subscriber/job-queue.ts @@ -0,0 +1,241 @@ +import { + default as PgBoss, + type SendOptions, + JobWithMetadata as PgBossJobWithMetadata, + } from 'pg-boss' + import Pg from 'pg' + import { fromEvent, firstValueFrom, timeout, throwError, filter, interval, mergeMap } from 'rxjs' +import { Logger } from '@nestjs/common' + + export interface Job> { + name: string + data: T + id?: string + options?: SendOptions + } + + export interface JobWithMetadata extends Job { + startedOn: Date + createdOn: Date + completedOn: Date | null + } + + export type JobState = + | 'created' + | 'retry' + | 'active' + | 'completed' + | 'expired' + | 'cancelled' + | 'failed' + + export interface IJobQueue> { + init: (workersByJob: Record>) => Promise + addJob: (job: Job) => Promise + addJobs: (jobs: Job[]) => Promise + updateJob: (jobId: string, data: T) => Promise + stop: () => Promise + getJobs( + state: JobState, + jobTypes: Array + ): Promise>>> + } + + export type Worker = { + handler: (job: PgBoss.Job) => any + } + + class PgWrapper implements PgBoss.Db { + constructor(private readonly db: Pg.Pool) {} + + executeSql(text: string, values: any[]): Promise<{ rows: any[]; rowCount: number }> { + return this.db.query(text, values) + } + } + + /** + * Job queue which provides background processing by workers + */ + export class JobQueue> implements IJobQueue { + private readonly logger = new Logger(JobQueue.name); + private queue: PgBoss + private dbConnection: Pg.Pool + private jobs: string[] = [] + + constructor(db: string) { + this.dbConnection = new Pg.Pool({ + connectionString: db, + }) + + this.queue = new PgBoss({ db: new PgWrapper(this.dbConnection) }) + this.queue.on('error', (err) => { + this.logger.error(`Error received by job queue: ${err}`) + }) + } + + async _getJobIds(state: JobState = 'active', jobTypes = this.jobs): Promise { + const result = await this.dbConnection.query( + `SELECT id FROM pgboss.job WHERE state = '${state}' and name IN (${jobTypes + .map((jobName) => `'${jobName}'`) + .join(', ')})` + ) + + return result.rows.map(({ id }) => id) + } + + /** + * Retrieves the active jobs being worked on organized by job name + * @returns Promise for an object where the keys reprsent the job names, and the values are arrays of jobs. + */ + async getJobs( + state: JobState = 'active', + jobTypes = this.jobs + ): Promise>>> { + const activeJobsIds = await this._getJobIds(state, jobTypes) + + const jobs = await Promise.all(activeJobsIds.map((jobId) => this.queue.getJobById(jobId))) + + return jobs.reduce( + ( + jobsByJobName: Record>>, + job: PgBossJobWithMetadata | null + ) => { + if (job == null) { + return jobsByJobName + } + + if (!jobsByJobName[job.name]) jobsByJobName[job.name] = [] + jobsByJobName[job.name]!.push({ + name: job.name, + data: job.data as T, + id: job.id, + startedOn: job.startedon, + createdOn: job.createdon, + completedOn: job.completedon, + }) + + return jobsByJobName + }, + {} as Record>> + ) + } + + /** + * Starts the job queue and adds workers for each job + */ + async init(workersByJob: Record>, resumeActive = true): Promise { + this.jobs = Object.keys(workersByJob) + + await this.dbConnection.query('CREATE EXTENSION IF NOT EXISTS "pgcrypto"') + await this.queue.start() + + if (resumeActive) { + const activeJobsIds = await this._getJobIds('active') + + if (activeJobsIds.length > 0) { + await this.queue.cancel(activeJobsIds) + await this.queue.resume(activeJobsIds) + } + } + + await Promise.all( + Object.entries(workersByJob).map(([jobName, worker]) => + this.queue.work(jobName, { teamRefill: true }, worker.handler.bind(worker)) + ) + ) + } + + _workerExistsForJob(jobName: string): boolean { + return this.jobs.includes(jobName) + } + + /** + * Adds a job to the job queue + * @param jobName + * @param data + */ + async addJob(job: Job): Promise { + if (!this._workerExistsForJob(job.name)) { + throw Error(`Cannot add job ${job.name} to queue because no workers for that job exist`) + } + + await this.queue.send(job.name, job.data, job.options!) + } + + /** + * Adds multiple jobs to the job queue + * @param jobName + * @param data + */ + async addJobs(jobs: Job[]): Promise { + const jobWithoutWorker = jobs.find((job) => !this._workerExistsForJob(job.name)) + if (jobWithoutWorker) { + throw Error( + `Cannot add job ${jobWithoutWorker.name} to queue because no workers for that job exist` + ) + } + + await this.queue.insert( + jobs.map((job) => ({ + name: job.name, + data: job.data, + })) + ) + } + + /** + * Stops the job queue. Waits up to 30000 ms for active jobs to complete + */ + async stop(): Promise { + await this.queue.stop({ graceful: true }) + // If there are active workers, pgBoss does not clean up. This function must be called to do the clean up. + await (this.queue as any).boss.stop() + await firstValueFrom(fromEvent(this.queue, 'stopped')) + + if (this.dbConnection) { + await this.dbConnection.end() + // @ts-ignore null connection + this.dbConnection = null + } + } + + /** + * Updates the job data for a particular job + * @param jobId id of the job + * @param data data to update + * @returns promise that resolves if the job was successfully updated + */ + async updateJob(jobId: string, data: T): Promise { + const text = 'UPDATE pgboss.job set data = $1 WHERE id = $2' + const values = [data, jobId] + const result = await this.dbConnection.query(text, values) + + if (result.rowCount !== 1) { + throw Error(`Unable to update job with id ${jobId}`) + } + } + + async _clearAllJobs(): Promise { + await this.queue.clearStorage() + } + + async _waitForAllJobsToComplete(): Promise { + await firstValueFrom( + interval(500).pipe( + mergeMap(() => + Promise.all( + this.jobs.map(async (jobName) => + this.queue.getQueueSize(jobName, { before: 'completed' }) + ) + ) + ), + filter((jobCounts) => jobCounts.every((count) => count === 0)), + timeout({ + each: 30000, + with: () => throwError(() => new Error(`Timeout waiting for jobs to complete`)), + }) + ) + ) + } + } + \ No newline at end of file diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 447c0c55..7fee346b 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -1,6 +1,6 @@ import { default as PgBoss } from 'pg-boss' import { type SendOptions } from 'pg-boss' -import type { Worker, Job } from '@ceramicnetwork/job-queue' +import type { Worker, Job } from './job-queue' import { Network, Status, Stream } from '../../entities/stream/stream.entity'; import { Logger } from '@nestjs/common'; import { StreamRepository } from 'src/entities/stream/stream.repository'; diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index c20f5ca6..b5b490b7 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -788,16 +788,6 @@ query-string "^7.1.0" rxjs "^7.5.2" -"@ceramicnetwork/job-queue@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ceramicnetwork/job-queue/-/job-queue-1.2.0.tgz#32775cad03fd4aeca23488d3052d970f2573a5dd" - integrity sha512-KFUPbDcTkORmVQOXdG0UDeIEQP1iV8j4TSbNdnFzhVoelimmJA1Y6ZCC0/CESQWD22V8ecYgXZ4qxLn5ltC2SQ== - dependencies: - "@ceramicnetwork/common" "^2.35.0" - pg "^8.11.3" - pg-boss "^8.2.0" - rxjs "^7.8.1" - "@ceramicnetwork/stream-caip10-link@^2.0.0", "@ceramicnetwork/stream-caip10-link@^2.21.0": version "2.21.0" resolved "https://registry.yarnpkg.com/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-2.21.0.tgz#47466dac80cfb62e8603ec374f92f9949dfe8bad" @@ -10338,10 +10328,10 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pg-boss@^8.2.0: - version "8.4.2" - resolved "https://registry.yarnpkg.com/pg-boss/-/pg-boss-8.4.2.tgz#4c300e3683e6acd7c157481544a49b8f565fe5e5" - integrity sha512-xcl/G8C7qlCyrcvlQvgLVBIe68zO0XfZc6K86/G9fq/mL+YQMEo1spW6lHqsPpNi2KGlpXwBEL/XZxkMa19eRA== +pg-boss@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/pg-boss/-/pg-boss-9.0.3.tgz#518ca7217d2d17f3ac5499f4f1ba2c289a4633c5" + integrity sha512-cUWUiv3sr563yNy0nCZ25Tv5U0m59Y9MhX/flm0vTR012yeVCrqpfboaZP4xFOQPdWipMJpuu4g94HR0SncTgw== dependencies: cron-parser "^4.0.0" delay "^5.0.0" @@ -10420,7 +10410,7 @@ pg-types@^4.0.1: postgres-interval "^3.0.0" postgres-range "^1.1.1" -pg@^8.11.3, pg@^8.5.1: +pg@^8.5.1: version "8.11.3" resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== @@ -11082,7 +11072,7 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.0" -rxjs@^7.5.2, rxjs@^7.5.5, rxjs@^7.8.0, rxjs@^7.8.1: +rxjs@^7.5.2, rxjs@^7.5.5, rxjs@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== From 1534b3003832e1b469ce0fc5d3e4d84717d7be84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 11 Oct 2023 11:20:56 +0800 Subject: [PATCH 007/127] add job queue for p2p sub --- packages/server/package.json | 2 +- packages/server/src/main.ts | 1 + .../subscriber/ceramic.subscriber.service.ts | 9 +- .../server/src/stream/subscriber/job-queue.ts | 311 +++++++------- .../src/stream/subscriber/store.worker.ts | 406 +++++++++--------- packages/server/yarn.lock | 32 +- 6 files changed, 371 insertions(+), 390 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index bc767394..fa48ef54 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -77,7 +77,7 @@ "jsonwebtoken": "^8.5.1", "key-did-provider-ed25519": "^3.0.0", "libp2p": "^0.42.2", - "pg": "^8.7.3", + "pg": "^8.11.3", "pg-boss": "^9.0.3", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 54dd5286..c06f4d91 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -27,6 +27,7 @@ async function bootstrap() { const ceramicSubscriberService = app.get(CeramicSubscriberService); // Sub ceramic test network. + if (!process.env.DISABLE_P2P_SUB){ await ceramicSubscriberService.subCeramic( Network.TESTNET, diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index aee3dafa..77412c8d 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -3,7 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Network, Stream } from '../../entities/stream/stream.entity'; import { StreamRepository } from '../../entities/stream/stream.repository'; import { IJobQueue, Job, JobQueue } from './job-queue'; -import StoreWorker, { StoreStreamJob, StreamStoreData, createStreamStoreJob } from './store.worker'; +import StoreWorker, { getStreamStoreJob, StreamStoreData, createStreamStoreJob } from './store.worker'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() @@ -30,12 +30,13 @@ export default class CeramicSubscriberService { const ceramicClient = await this.createCeramicClient(ceramicNetworkUrl); // init job queue + const storeStreamJob = getStreamStoreJob(network); await this.jobQueue.init({ - [StoreStreamJob]: new StoreWorker( + [storeStreamJob]: new StoreWorker( this.streamRepository, ceramicClient ), }); - + this.logger.log(`init job queue ${storeStreamJob} success`) node.pubsub.addEventListener('message', async (message) => { try { const textDecoder = new TextDecoder('utf-8'); @@ -46,7 +47,7 @@ export default class CeramicSubscriberService { this.logger.log( `${network}, sub p2p message: ${JSON.stringify(parsed)}`, ); - const job: Job = createStreamStoreJob(StoreStreamJob, { + const job: Job = createStreamStoreJob(storeStreamJob, { network: network, streamId: parsed.stream, }); diff --git a/packages/server/src/stream/subscriber/job-queue.ts b/packages/server/src/stream/subscriber/job-queue.ts index 7cde8baf..332b66b4 100644 --- a/packages/server/src/stream/subscriber/job-queue.ts +++ b/packages/server/src/stream/subscriber/job-queue.ts @@ -1,26 +1,26 @@ import { - default as PgBoss, type SendOptions, JobWithMetadata as PgBossJobWithMetadata, - } from 'pg-boss' - import Pg from 'pg' - import { fromEvent, firstValueFrom, timeout, throwError, filter, interval, mergeMap } from 'rxjs' +} from 'pg-boss' +import PgBoss = require("pg-boss") +import { Pool as PgPool } from 'pg' +import { fromEvent, firstValueFrom, timeout, throwError, filter, interval, mergeMap } from 'rxjs' import { Logger } from '@nestjs/common' - - export interface Job> { + +export interface Job> { name: string data: T id?: string options?: SendOptions - } - - export interface JobWithMetadata extends Job { +} + +export interface JobWithMetadata extends Job { startedOn: Date createdOn: Date completedOn: Date | null - } - - export type JobState = +} + +export type JobState = | 'created' | 'retry' | 'active' @@ -28,177 +28,177 @@ import { Logger } from '@nestjs/common' | 'expired' | 'cancelled' | 'failed' - - export interface IJobQueue> { + +export interface IJobQueue> { init: (workersByJob: Record>) => Promise addJob: (job: Job) => Promise addJobs: (jobs: Job[]) => Promise updateJob: (jobId: string, data: T) => Promise stop: () => Promise getJobs( - state: JobState, - jobTypes: Array + state: JobState, + jobTypes: Array ): Promise>>> - } - - export type Worker = { +} + +export type Worker = { handler: (job: PgBoss.Job) => any - } - - class PgWrapper implements PgBoss.Db { - constructor(private readonly db: Pg.Pool) {} - +} + +class PgWrapper implements PgBoss.Db { + constructor(private readonly db: PgPool) { } + executeSql(text: string, values: any[]): Promise<{ rows: any[]; rowCount: number }> { - return this.db.query(text, values) + return this.db.query(text, values) } - } - - /** - * Job queue which provides background processing by workers - */ - export class JobQueue> implements IJobQueue { +} + +/** + * Job queue which provides background processing by workers + */ +export class JobQueue> implements IJobQueue { private readonly logger = new Logger(JobQueue.name); private queue: PgBoss - private dbConnection: Pg.Pool + private dbConnection: PgPool private jobs: string[] = [] - + constructor(db: string) { - this.dbConnection = new Pg.Pool({ - connectionString: db, - }) - - this.queue = new PgBoss({ db: new PgWrapper(this.dbConnection) }) - this.queue.on('error', (err) => { - this.logger.error(`Error received by job queue: ${err}`) - }) + this.dbConnection = new PgPool({ + connectionString: db, + }) + + this.queue = new PgBoss({ db: new PgWrapper(this.dbConnection) }) + this.queue.on('error', (err) => { + this.logger.error(`Error received by job queue: ${err}`) + }) } - + async _getJobIds(state: JobState = 'active', jobTypes = this.jobs): Promise { - const result = await this.dbConnection.query( - `SELECT id FROM pgboss.job WHERE state = '${state}' and name IN (${jobTypes - .map((jobName) => `'${jobName}'`) - .join(', ')})` - ) - - return result.rows.map(({ id }) => id) + const result = await this.dbConnection.query( + `SELECT id FROM pgboss.job WHERE state = '${state}' and name IN (${jobTypes + .map((jobName) => `'${jobName}'`) + .join(', ')})` + ) + + return result.rows.map(({ id }) => id) } - + /** * Retrieves the active jobs being worked on organized by job name * @returns Promise for an object where the keys reprsent the job names, and the values are arrays of jobs. */ async getJobs( - state: JobState = 'active', - jobTypes = this.jobs + state: JobState = 'active', + jobTypes = this.jobs ): Promise>>> { - const activeJobsIds = await this._getJobIds(state, jobTypes) - - const jobs = await Promise.all(activeJobsIds.map((jobId) => this.queue.getJobById(jobId))) - - return jobs.reduce( - ( - jobsByJobName: Record>>, - job: PgBossJobWithMetadata | null - ) => { - if (job == null) { - return jobsByJobName - } - - if (!jobsByJobName[job.name]) jobsByJobName[job.name] = [] - jobsByJobName[job.name]!.push({ - name: job.name, - data: job.data as T, - id: job.id, - startedOn: job.startedon, - createdOn: job.createdon, - completedOn: job.completedon, - }) - - return jobsByJobName - }, - {} as Record>> - ) + const activeJobsIds = await this._getJobIds(state, jobTypes) + + const jobs = await Promise.all(activeJobsIds.map((jobId) => this.queue.getJobById(jobId))) + + return jobs.reduce( + ( + jobsByJobName: Record>>, + job: PgBossJobWithMetadata | null + ) => { + if (job == null) { + return jobsByJobName + } + + if (!jobsByJobName[job.name]) jobsByJobName[job.name] = [] + jobsByJobName[job.name]!.push({ + name: job.name, + data: job.data as T, + id: job.id, + startedOn: job.startedon, + createdOn: job.createdon, + completedOn: job.completedon, + }) + + return jobsByJobName + }, + {} as Record>> + ) } - + /** * Starts the job queue and adds workers for each job */ async init(workersByJob: Record>, resumeActive = true): Promise { - this.jobs = Object.keys(workersByJob) - - await this.dbConnection.query('CREATE EXTENSION IF NOT EXISTS "pgcrypto"') - await this.queue.start() - - if (resumeActive) { - const activeJobsIds = await this._getJobIds('active') - - if (activeJobsIds.length > 0) { - await this.queue.cancel(activeJobsIds) - await this.queue.resume(activeJobsIds) + this.jobs = Object.keys(workersByJob) + + await this.dbConnection.query('CREATE EXTENSION IF NOT EXISTS "pgcrypto"') + await this.queue.start() + + if (resumeActive) { + const activeJobsIds = await this._getJobIds('active') + + if (activeJobsIds.length > 0) { + await this.queue.cancel(activeJobsIds) + await this.queue.resume(activeJobsIds) + } } - } - - await Promise.all( - Object.entries(workersByJob).map(([jobName, worker]) => - this.queue.work(jobName, { teamRefill: true }, worker.handler.bind(worker)) + + await Promise.all( + Object.entries(workersByJob).map(([jobName, worker]) => + this.queue.work(jobName, { teamRefill: true }, worker.handler.bind(worker)) + ) ) - ) } - + _workerExistsForJob(jobName: string): boolean { - return this.jobs.includes(jobName) + return this.jobs.includes(jobName) } - + /** * Adds a job to the job queue * @param jobName * @param data */ async addJob(job: Job): Promise { - if (!this._workerExistsForJob(job.name)) { - throw Error(`Cannot add job ${job.name} to queue because no workers for that job exist`) - } - - await this.queue.send(job.name, job.data, job.options!) + if (!this._workerExistsForJob(job.name)) { + throw Error(`Cannot add job ${job.name} to queue because no workers for that job exist`) + } + + await this.queue.send(job.name, job.data, job.options!) } - + /** * Adds multiple jobs to the job queue * @param jobName * @param data */ async addJobs(jobs: Job[]): Promise { - const jobWithoutWorker = jobs.find((job) => !this._workerExistsForJob(job.name)) - if (jobWithoutWorker) { - throw Error( - `Cannot add job ${jobWithoutWorker.name} to queue because no workers for that job exist` + const jobWithoutWorker = jobs.find((job) => !this._workerExistsForJob(job.name)) + if (jobWithoutWorker) { + throw Error( + `Cannot add job ${jobWithoutWorker.name} to queue because no workers for that job exist` + ) + } + + await this.queue.insert( + jobs.map((job) => ({ + name: job.name, + data: job.data, + })) ) - } - - await this.queue.insert( - jobs.map((job) => ({ - name: job.name, - data: job.data, - })) - ) } - + /** * Stops the job queue. Waits up to 30000 ms for active jobs to complete */ async stop(): Promise { - await this.queue.stop({ graceful: true }) - // If there are active workers, pgBoss does not clean up. This function must be called to do the clean up. - await (this.queue as any).boss.stop() - await firstValueFrom(fromEvent(this.queue, 'stopped')) - - if (this.dbConnection) { - await this.dbConnection.end() - // @ts-ignore null connection - this.dbConnection = null - } + await this.queue.stop({ graceful: true }) + // If there are active workers, pgBoss does not clean up. This function must be called to do the clean up. + await (this.queue as any).boss.stop() + await firstValueFrom(fromEvent(this.queue, 'stopped')) + + if (this.dbConnection) { + await this.dbConnection.end() + // @ts-ignore null connection + this.dbConnection = null + } } - + /** * Updates the job data for a particular job * @param jobId id of the job @@ -206,36 +206,35 @@ import { Logger } from '@nestjs/common' * @returns promise that resolves if the job was successfully updated */ async updateJob(jobId: string, data: T): Promise { - const text = 'UPDATE pgboss.job set data = $1 WHERE id = $2' - const values = [data, jobId] - const result = await this.dbConnection.query(text, values) - - if (result.rowCount !== 1) { - throw Error(`Unable to update job with id ${jobId}`) - } + const text = 'UPDATE pgboss.job set data = $1 WHERE id = $2' + const values = [data, jobId] + const result = await this.dbConnection.query(text, values) + + if (result.rowCount !== 1) { + throw Error(`Unable to update job with id ${jobId}`) + } } - + async _clearAllJobs(): Promise { - await this.queue.clearStorage() + await this.queue.clearStorage() } - + async _waitForAllJobsToComplete(): Promise { - await firstValueFrom( - interval(500).pipe( - mergeMap(() => - Promise.all( - this.jobs.map(async (jobName) => - this.queue.getQueueSize(jobName, { before: 'completed' }) - ) + await firstValueFrom( + interval(500).pipe( + mergeMap(() => + Promise.all( + this.jobs.map(async (jobName) => + this.queue.getQueueSize(jobName, { before: 'completed' }) + ) + ) + ), + filter((jobCounts) => jobCounts.every((count) => count === 0)), + timeout({ + each: 30000, + with: () => throwError(() => new Error(`Timeout waiting for jobs to complete`)), + }) ) - ), - filter((jobCounts) => jobCounts.every((count) => count === 0)), - timeout({ - each: 30000, - with: () => throwError(() => new Error(`Timeout waiting for jobs to complete`)), - }) ) - ) } - } - \ No newline at end of file +} diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 7fee346b..3f52dc02 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -1,4 +1,4 @@ -import { default as PgBoss } from 'pg-boss' +import PgBoss = require("pg-boss") import { type SendOptions } from 'pg-boss' import type { Worker, Job } from './job-queue' import { Network, Status, Stream } from '../../entities/stream/stream.entity'; @@ -6,227 +6,237 @@ import { Logger } from '@nestjs/common'; import { StreamRepository } from 'src/entities/stream/stream.repository'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); -export const StoreStreamJob = 'storeStreamJob'; - const JobOption: SendOptions = { - retryLimit: 5, - retryDelay: 60, // 1 minute - retryBackoff: true, - expireInHours: 12, - retentionDays: 3, + retryLimit: 5, + retryDelay: 60, // 1 minute + retryBackoff: true, + expireInHours: 12, + retentionDays: 3, } export interface StreamStoreData { - network: Network - streamId: string + network: Network + streamId: string } export function createStreamStoreJob( - name: string, - data: StreamStoreData, - options?: SendOptions + name: string, + data: StreamStoreData, + options?: SendOptions ): Job { - return { - name, - data, - options: options || JobOption, - } + return { + name, + data, + options: options || JobOption, + } } +export function getStreamStoreJob(network: Network) { + return 'store_stream_job_for_' + network.toLowerCase(); +} export default class StoreWorker implements Worker { - private readonly logger = new Logger(StoreWorker.name); - constructor( + private readonly logger = new Logger(StoreWorker.name); + constructor( private readonly streamRepository: StreamRepository, private readonly ceramicClient: any, - ) { } + ) { } - async handler(job: PgBoss.Job) { - const jobData = job.data as StreamStoreData; - await this.store(jobData.network, jobData.streamId); + async handler(job: PgBoss.Job) { + const jobData = job.data as StreamStoreData; + this.logger.log('Reived job: ' + JSON.stringify(jobData)); + try { + await this.store(jobData.network, jobData.streamId); + } catch (error) { + this.logger.error( + `To store network(${jobData.network}) stream(${jobData.streamId}) err:${JSON.stringify( + error, + )}`, + ); } + } - async getCacao(cid: any): Promise { - let cacaoDag; - try { - const ipfsHttpClient = await _importDynamic('ipfs-http-client'); - const ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io', - }); - - const genesisDag = await ipfs.dag.get(cid, { timeout: 6000 }); - if (!genesisDag.value || !genesisDag.value.signatures) { - return; - } - this.logger.log(`[CACAO] Getting genesis cacao value:${JSON.stringify(genesisDag.value)} cid:${cid}`); - - const { base64urlToJSON } = await _importDynamic( - '@ceramicnetwork/common', - ); - const decodedProtectedHeader = base64urlToJSON( - genesisDag.value.signatures[0].protected, - ); - const capIPFSUri = decodedProtectedHeader.cap; - this.logger.log(`[CACAO] Getting capIPFSUri:${capIPFSUri} cid:${cid}`); - if (!capIPFSUri) return; - - const { CID } = await _importDynamic('multiformats/cid'); - const cacaoCid = CID.parse(capIPFSUri.replace('ipfs://', '')); - if (!cacaoCid) return; - - cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); - } catch (error) { - const ipfsErr = 'Error 500 (Internal server error) when trying to fetch content from the IPFS network.'; - if (error.toString().includes(ipfsErr)) { - this.logger.warn(`Getting cacao err, cid:${cid} error:${ipfsErr}`); - } else { - this.logger.warn(`Getting cacao err, cid:${cid} error:${JSON.stringify(error)}`); - } - } - - return cacaoDag; + async getCacao(cid: any): Promise { + let cacaoDag; + try { + const ipfsHttpClient = await _importDynamic('ipfs-http-client'); + const ipfs = await ipfsHttpClient.create({ + url: 'https://gateway.ipfs.io', + }); + + const genesisDag = await ipfs.dag.get(cid, { timeout: 6000 }); + if (!genesisDag.value || !genesisDag.value.signatures) { + return; } + this.logger.log(`[CACAO] Getting genesis cacao value:${JSON.stringify(genesisDag.value)} cid:${cid}`); + + const { base64urlToJSON } = await _importDynamic( + '@ceramicnetwork/common', + ); + const decodedProtectedHeader = base64urlToJSON( + genesisDag.value.signatures[0].protected, + ); + const capIPFSUri = decodedProtectedHeader.cap; + this.logger.log(`[CACAO] Getting capIPFSUri:${capIPFSUri} cid:${cid}`); + if (!capIPFSUri) return; - async loadStream(streamId: string) { - let remainRetires = 3; - while (remainRetires > 0) { - try { - const stream = await this.ceramicClient.loadStream(streamId); - return stream; - } catch (error) { - remainRetires--; - this.logger.error( - `load stream err, remainRetires:${remainRetires} streamId:${streamId} error:${error}`, - ); - } - } + const { CID } = await _importDynamic('multiformats/cid'); + const cacaoCid = CID.parse(capIPFSUri.replace('ipfs://', '')); + if (!cacaoCid) return; + + cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); + } catch (error) { + const ipfsErr = 'Error 500 (Internal server error) when trying to fetch content from the IPFS network.'; + if (error.toString().includes(ipfsErr)) { + this.logger.warn(`Getting cacao err, cid:${cid} error:${ipfsErr}`); + } else { + this.logger.warn(`Getting cacao err, cid:${cid} error:${JSON.stringify(error)}`); } - - // Store all streams. - async store(network: Network, streamId: string) { - const stream = await this.loadStream(streamId); - if (!stream) return; - + } + + return cacaoDag; + } + + async loadStream(streamId: string) { + let remainRetires = 3; + while (remainRetires > 0) { + try { + const stream = await this.ceramicClient.loadStream(streamId); + return stream; + } catch (error) { + remainRetires--; + this.logger.error( + `load stream err, remainRetires:${remainRetires} streamId:${streamId} error:${error}`, + ); + } + } + } + + // Store all streams. + async store(network: Network, streamId: string) { + const stream = await this.loadStream(streamId); + if (!stream) return; + + await this.storeStream( + network, + streamId, + stream.allCommitIds, + stream.state, + stream.id.cid, + ); + // save schema stream + if (stream?.metadata?.schema) { + const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); + const schemaStream = await this.loadStream(schemaStreamId); + if (schemaStream) { await this.storeStream( network, - streamId, - stream.allCommitIds, - stream.state, - stream.id.cid, + schemaStreamId, + schemaStream.allCommitIds, + schemaStream.state, ); - // save schema stream - if (stream?.metadata?.schema) { - const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); - const schemaStream = await this.loadStream(schemaStreamId); - if (schemaStream) { - await this.storeStream( - network, - schemaStreamId, - schemaStream.allCommitIds, - schemaStream.state, - ); - } - } - // save model stream - if (stream?.metadata?.model) { - const modelStreamId = stream.metadata.model.toString(); - const modelStream = await this.loadStream(modelStreamId); - if (modelStream) { - await this.storeStream( - network, - modelStreamId, - modelStream.allCommitIds, - modelStream.state, - ); - } - } } - - async storeStream( - network: Network, - streamId: string, - commitIds: string[], - streamState: any, - genesisCid?: any, - ) { - try { - let domain: string; - if (genesisCid && streamState?.metadata?.model) { - this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); - - const cacao = await this.getCacao(genesisCid); - this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); - - domain = cacao?.value?.p?.domain; - this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); - } - - const stream = this.convertToStreamEntity( - network, - streamId, - commitIds, - streamState, - domain, - ); - if (!stream) return; - - const savedStream = await this.streamRepository.upsert(stream, [ - 'network', - 'stream_id', - ]); - this.logger.log(`Saved network(${network}) stream id(${streamId})`); - return savedStream; - } catch (error) { - // this.logger.error( - // `To store network(${network}) stream(${streamId}) err:${JSON.stringify( - // error, - // )}`, - // ); - } - } - - convertToStreamEntity( - network: Network, - streamId: string, - commitIds: string[], - streamState: any, - domain?: string, - ): Stream { - const stream = new Stream(); - stream.setStreamId = streamId; - stream.setNetwork = network; - if (streamState?.metadata?.family) - stream.setFamily = streamState.metadata.family; - stream.setType = streamState.type; - stream.setDid = streamState?.metadata?.controllers[0]; - if (streamState.anchorStatus == 3) { - stream.setAnchorStatus = Status.ANCHORED; - } else { - stream.setAnchorStatus = Status.NOT_ANCHORED; - } - if (streamState?.anchorProof && streamState.anchorProof.blockTimestamp) { - stream.setAnchorDate = new Date( - streamState.anchorProof.blockTimestamp * 1000, - ); - stream.setAnchorHash = streamState.anchorProof.txHash.toString(); - } - if (streamState?.metadata?.schema) - stream.setSchema = streamState.metadata.schema.replace('ceramic://', ''); - if (streamState?.metadata?.model) { - stream.setModel = streamState.metadata.model.toString(); - } - if (streamState?.metadata?.tags) stream.setTags = streamState.metadata.tags; - stream.setCommitIds = commitIds?.map((id) => - id.toString().replace('CommitID(', '').replace(')', ''), + } + // save model stream + if (stream?.metadata?.model) { + const modelStreamId = stream.metadata.model.toString(); + const modelStream = await this.loadStream(modelStreamId); + if (modelStream) { + await this.storeStream( + network, + modelStreamId, + modelStream.allCommitIds, + modelStream.state, ); - if (domain) { - // this.logger.log(`The stream(${streamId}) has the domain:${domain}`); - stream.setDomain = domain; - } - stream.setContent = streamState.content; - stream.setMetadata = streamState.metadata; - stream.setOriginData = JSON.parse(JSON.stringify(streamState)); - stream.setLastModifiedAt = new Date(); - return stream; } + } + } + + async storeStream( + network: Network, + streamId: string, + commitIds: string[], + streamState: any, + genesisCid?: any, + ) { + try { + let domain: string; + if (genesisCid && streamState?.metadata?.model) { + this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); + + const cacao = await this.getCacao(genesisCid); + this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); + + domain = cacao?.value?.p?.domain; + this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); + } + + const stream = this.convertToStreamEntity( + network, + streamId, + commitIds, + streamState, + domain, + ); + if (!stream) return; + + const savedStream = await this.streamRepository.upsert(stream, [ + 'network', + 'stream_id', + ]); + this.logger.log(`Saved network(${network}) stream id(${streamId})`); + return savedStream; + } catch (error) { + // this.logger.error( + // `To store network(${network}) stream(${streamId}) err:${JSON.stringify( + // error, + // )}`, + // ); + } + } + + convertToStreamEntity( + network: Network, + streamId: string, + commitIds: string[], + streamState: any, + domain?: string, + ): Stream { + const stream = new Stream(); + stream.setStreamId = streamId; + stream.setNetwork = network; + if (streamState?.metadata?.family) + stream.setFamily = streamState.metadata.family; + stream.setType = streamState.type; + stream.setDid = streamState?.metadata?.controllers[0]; + if (streamState.anchorStatus == 3) { + stream.setAnchorStatus = Status.ANCHORED; + } else { + stream.setAnchorStatus = Status.NOT_ANCHORED; + } + if (streamState?.anchorProof && streamState.anchorProof.blockTimestamp) { + stream.setAnchorDate = new Date( + streamState.anchorProof.blockTimestamp * 1000, + ); + stream.setAnchorHash = streamState.anchorProof.txHash.toString(); + } + if (streamState?.metadata?.schema) + stream.setSchema = streamState.metadata.schema.replace('ceramic://', ''); + if (streamState?.metadata?.model) { + stream.setModel = streamState.metadata.model.toString(); + } + if (streamState?.metadata?.tags) stream.setTags = streamState.metadata.tags; + stream.setCommitIds = commitIds?.map((id) => + id.toString().replace('CommitID(', '').replace(')', ''), + ); + if (domain) { + // this.logger.log(`The stream(${streamId}) has the domain:${domain}`); + stream.setDomain = domain; + } + stream.setContent = streamState.content; + stream.setMetadata = streamState.metadata; + stream.setOriginData = JSON.parse(JSON.stringify(streamState)); + stream.setLastModifiedAt = new Date(); + return stream; + } } \ No newline at end of file diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index b5b490b7..88ff02a7 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -10341,21 +10341,11 @@ pg-boss@^9.0.3: serialize-error "^8.1.0" uuid "^9.0.0" -pg-cloudflare@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz#833d70870d610d14bf9df7afb40e1cba310c17a0" - integrity sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA== - pg-cloudflare@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== -pg-connection-string@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.0.tgz#12a36cc4627df19c25cc1b9b736cc39ee1f73ae8" - integrity sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg== - pg-connection-string@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" @@ -10371,11 +10361,6 @@ pg-numeric@1.0.2: resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== -pg-pool@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.0.tgz#3190df3e4747a0d23e5e9e8045bcd99bda0a712e" - integrity sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ== - pg-pool@^3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" @@ -10410,7 +10395,7 @@ pg-types@^4.0.1: postgres-interval "^3.0.0" postgres-range "^1.1.1" -pg@^8.5.1: +pg@^8.11.3, pg@^8.5.1: version "8.11.3" resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== @@ -10425,21 +10410,6 @@ pg@^8.5.1: optionalDependencies: pg-cloudflare "^1.1.1" -pg@^8.7.3: - version "8.11.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.0.tgz#a37e534e94b57a7ed811e926f23a7c56385f55d9" - integrity sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA== - dependencies: - buffer-writer "2.0.0" - packet-reader "1.0.0" - pg-connection-string "^2.6.0" - pg-pool "^3.6.0" - pg-protocol "^1.6.0" - pg-types "^2.1.0" - pgpass "1.x" - optionalDependencies: - pg-cloudflare "^1.1.0" - pgpass@1.x: version "1.0.5" resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" From 51cf018948f1bca19db711b4d7eaa09409f2d99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 11 Oct 2023 11:32:32 +0800 Subject: [PATCH 008/127] update job queue name for testnet and mainnet --- .../src/stream/subscriber/ceramic.subscriber.service.ts | 2 +- packages/server/src/stream/subscriber/store.worker.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index 77412c8d..d8976088 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -30,7 +30,7 @@ export default class CeramicSubscriberService { const ceramicClient = await this.createCeramicClient(ceramicNetworkUrl); // init job queue - const storeStreamJob = getStreamStoreJob(network); + const storeStreamJob = getStreamStoreJob(); await this.jobQueue.init({ [storeStreamJob]: new StoreWorker( this.streamRepository, ceramicClient diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 3f52dc02..2d859970 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -31,8 +31,8 @@ export function createStreamStoreJob( } } -export function getStreamStoreJob(network: Network) { - return 'store_stream_job_for_' + network.toLowerCase(); +export function getStreamStoreJob() { + return 'store_stream_job'; } export default class StoreWorker implements Worker { private readonly logger = new Logger(StoreWorker.name); From 04ec1801b96ceb118f48ccb48427a4b03d0f4ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 11 Oct 2023 11:47:11 +0800 Subject: [PATCH 009/127] remove unused logs --- packages/server/src/model/model.controller.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/model/model.controller.ts b/packages/server/src/model/model.controller.ts index 8e95a526..1cce0f07 100644 --- a/packages/server/src/model/model.controller.ts +++ b/packages/server/src/model/model.controller.ts @@ -244,7 +244,6 @@ export class ModelController { if (!useCount) { useCountMap.set(m, 0); } - this.logger.log(`model ${m} usecount: ${useCountMap.get(m)}`); }); this.logger.log(`${network} model usecount size: ${useCountMap.size}`); await this.modelService.updateModelUseCount(network, useCountMap); From b25f24fe2fd8ce6f1becb75ede6b7c996e526b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 10:10:23 +0800 Subject: [PATCH 010/127] udpate queue init --- packages/server/src/main.ts | 5 ++-- .../subscriber/ceramic.subscriber.service.ts | 30 +++++++++++-------- .../src/stream/subscriber/store.worker.ts | 4 +-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index c06f4d91..ff3acc6f 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -27,8 +27,9 @@ async function bootstrap() { const ceramicSubscriberService = app.get(CeramicSubscriberService); // Sub ceramic test network. - if (!process.env.DISABLE_P2P_SUB){ + await ceramicSubscriberService.initJobQueue(); + await ceramicSubscriberService.subCeramic( Network.TESTNET, [ @@ -38,7 +39,6 @@ async function bootstrap() { ], ['/ip4/127.0.0.1/tcp/20000/ws'], '/ceramic/testnet-clay', - 'http://34.92.232.17:7007/', ); // Sub ceramic main network. @@ -50,7 +50,6 @@ async function bootstrap() { ], ['/ip4/127.0.0.1/tcp/30000/ws'], '/ceramic/mainnet', - 'http://35.220.227.2:7007/', ); } } diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index d8976088..11de8e6f 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -17,26 +17,30 @@ export default class CeramicSubscriberService { ) { this.jobQueue = new JobQueue(process.env.PG_BOSS_DATABASE_URL); } + + async initJobQueue() { + // init ceramic clients + const ceramicMiannetClient = await this.createCeramicClient('http://35.220.227.2:7007/'); + const ceramicTestnetClient = await this.createCeramicClient('http://34.92.232.17:7007/'); + await this.jobQueue.init({ + [getStreamStoreJob(Network.MAINNET)]: new StoreWorker( + this.streamRepository, ceramicMiannetClient + ), + [getStreamStoreJob(Network.TESTNET)]: new StoreWorker( + this.streamRepository, ceramicTestnetClient + ), + }); + } + async subCeramic( network: Network, bootstrapMultiaddrs: string[], listen: string[], - topic: string, - ceramicNetworkUrl: string, - ) { + topic: string) { const node = await this.createP2PNode(bootstrapMultiaddrs, listen); node.pubsub.subscribe(topic); - // init ceramic client - const ceramicClient = await this.createCeramicClient(ceramicNetworkUrl); // init job queue - const storeStreamJob = getStreamStoreJob(); - await this.jobQueue.init({ - [storeStreamJob]: new StoreWorker( - this.streamRepository, ceramicClient - ), - }); - this.logger.log(`init job queue ${storeStreamJob} success`) node.pubsub.addEventListener('message', async (message) => { try { const textDecoder = new TextDecoder('utf-8'); @@ -47,7 +51,7 @@ export default class CeramicSubscriberService { this.logger.log( `${network}, sub p2p message: ${JSON.stringify(parsed)}`, ); - const job: Job = createStreamStoreJob(storeStreamJob, { + const job: Job = createStreamStoreJob(getStreamStoreJob(network), { network: network, streamId: parsed.stream, }); diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 2d859970..878f2c65 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -31,8 +31,8 @@ export function createStreamStoreJob( } } -export function getStreamStoreJob() { - return 'store_stream_job'; +export function getStreamStoreJob(network: Network) { + return 'store_stream_job_from_' + network.toLowerCase(); } export default class StoreWorker implements Worker { private readonly logger = new Logger(StoreWorker.name); From edbba44a1b86314d430eac5475b320dbd5c3bc67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 10:13:41 +0800 Subject: [PATCH 011/127] add logs --- packages/server/src/main.ts | 3 +-- .../server/src/stream/subscriber/ceramic.subscriber.service.ts | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index ff3acc6f..65448f84 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -24,10 +24,9 @@ async function bootstrap() { await app.listen(3000); - const ceramicSubscriberService = app.get(CeramicSubscriberService); - // Sub ceramic test network. if (!process.env.DISABLE_P2P_SUB){ + const ceramicSubscriberService = app.get(CeramicSubscriberService); await ceramicSubscriberService.initJobQueue(); await ceramicSubscriberService.subCeramic( diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index 11de8e6f..ef349ac6 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -40,7 +40,6 @@ export default class CeramicSubscriberService { const node = await this.createP2PNode(bootstrapMultiaddrs, listen); node.pubsub.subscribe(topic); - // init job queue node.pubsub.addEventListener('message', async (message) => { try { const textDecoder = new TextDecoder('utf-8'); From d8a7f81d2d4ea087af45ac5d3e32cfbfc4d7b9c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 10:44:45 +0800 Subject: [PATCH 012/127] close cacao --- .../server/src/stream/subscriber/store.worker.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 878f2c65..c53ca267 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -160,15 +160,15 @@ export default class StoreWorker implements Worker { ) { try { let domain: string; - if (genesisCid && streamState?.metadata?.model) { - this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); + // if (genesisCid && streamState?.metadata?.model) { + // this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); - const cacao = await this.getCacao(genesisCid); - this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); + // const cacao = await this.getCacao(genesisCid); + // this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); - domain = cacao?.value?.p?.domain; - this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); - } + // domain = cacao?.value?.p?.domain; + // this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); + // } const stream = this.convertToStreamEntity( network, From 16b9dc616312aa3b50ce30bae17c3688e8813f40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 11:10:18 +0800 Subject: [PATCH 013/127] enable cacao --- .../subscriber/ceramic.subscriber.service.ts | 1 + .../src/stream/subscriber/store.worker.ts | 34 +++++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index ef349ac6..6f358b5f 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -30,6 +30,7 @@ export default class CeramicSubscriberService { this.streamRepository, ceramicTestnetClient ), }); + this.logger.log('init job queue success'); } async subCeramic( diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index c53ca267..d4be5d49 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -55,8 +55,8 @@ export default class StoreWorker implements Worker { } } - async getCacao(cid: any): Promise { - let cacaoDag; + async storeCacao(network: Network, + streamId: string, cid: any): Promise { try { const ipfsHttpClient = await _importDynamic('ipfs-http-client'); const ipfs = await ipfsHttpClient.create({ @@ -83,7 +83,21 @@ export default class StoreWorker implements Worker { const cacaoCid = CID.parse(capIPFSUri.replace('ipfs://', '')); if (!cacaoCid) return; - cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); + const cacaoDag = await ipfs.dag.get(cacaoCid, { timeout: 6000 }); + this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacaoDag)}) stream(${streamId}) network:${network}`); + + const domain = cacaoDag?.value?.p?.domain; + this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); + if (domain) { + const stream = new Stream(); + stream.setStreamId = streamId; + stream.setNetwork = network; + stream.setDomain = domain; + const savedStream = await this.streamRepository.upsert(stream, [ + 'network', + 'stream_id', + ]); + } } catch (error) { const ipfsErr = 'Error 500 (Internal server error) when trying to fetch content from the IPFS network.'; if (error.toString().includes(ipfsErr)) { @@ -92,8 +106,6 @@ export default class StoreWorker implements Worker { this.logger.warn(`Getting cacao err, cid:${cid} error:${JSON.stringify(error)}`); } } - - return cacaoDag; } async loadStream(streamId: string) { @@ -160,15 +172,9 @@ export default class StoreWorker implements Worker { ) { try { let domain: string; - // if (genesisCid && streamState?.metadata?.model) { - // this.logger.log(`[CACAO] Getting cacao stream(${streamId}) network:${network}`); - - // const cacao = await this.getCacao(genesisCid); - // this.logger.log(`[CACAO] Getting cacao(${JSON.stringify(cacao)}) stream(${streamId}) network:${network}`); - - // domain = cacao?.value?.p?.domain; - // this.logger.log(`[CACAO] Getting domain(${domain}) stream(${streamId}) network:${network}`); - // } + if (genesisCid && streamState?.metadata?.model) { + this.storeCacao(network, streamId, genesisCid); + } const stream = this.convertToStreamEntity( network, From 472b2090f2d94e066a21869d4511bbdba4ad2650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 11:32:05 +0800 Subject: [PATCH 014/127] close cacao --- packages/server/src/stream/subscriber/store.worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index d4be5d49..e1c36278 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -173,7 +173,7 @@ export default class StoreWorker implements Worker { try { let domain: string; if (genesisCid && streamState?.metadata?.model) { - this.storeCacao(network, streamId, genesisCid); + // this.storeCacao(network, streamId, genesisCid); } const stream = this.convertToStreamEntity( From 048fda9e99e5c63e58056ac9e30892e491018964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 11:38:41 +0800 Subject: [PATCH 015/127] change sub handle to async --- .../src/stream/subscriber/store.worker.ts | 87 ++++++++++--------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index e1c36278..9230f6f7 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -44,15 +44,7 @@ export default class StoreWorker implements Worker { async handler(job: PgBoss.Job) { const jobData = job.data as StreamStoreData; this.logger.log('Reived job: ' + JSON.stringify(jobData)); - try { - await this.store(jobData.network, jobData.streamId); - } catch (error) { - this.logger.error( - `To store network(${jobData.network}) stream(${jobData.streamId}) err:${JSON.stringify( - error, - )}`, - ); - } + this.store(jobData.network, jobData.streamId); } async storeCacao(network: Network, @@ -125,42 +117,51 @@ export default class StoreWorker implements Worker { // Store all streams. async store(network: Network, streamId: string) { - const stream = await this.loadStream(streamId); - if (!stream) return; - - await this.storeStream( - network, - streamId, - stream.allCommitIds, - stream.state, - stream.id.cid, - ); - // save schema stream - if (stream?.metadata?.schema) { - const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); - const schemaStream = await this.loadStream(schemaStreamId); - if (schemaStream) { - await this.storeStream( - network, - schemaStreamId, - schemaStream.allCommitIds, - schemaStream.state, - ); + try { + const stream = await this.loadStream(streamId); + if (!stream) return; + + await this.storeStream( + network, + streamId, + stream.allCommitIds, + stream.state, + stream.id.cid, + ); + // save schema stream + if (stream?.metadata?.schema) { + const schemaStreamId = stream.metadata.schema.replace('ceramic://', ''); + const schemaStream = await this.loadStream(schemaStreamId); + if (schemaStream) { + await this.storeStream( + network, + schemaStreamId, + schemaStream.allCommitIds, + schemaStream.state, + ); + } } - } - // save model stream - if (stream?.metadata?.model) { - const modelStreamId = stream.metadata.model.toString(); - const modelStream = await this.loadStream(modelStreamId); - if (modelStream) { - await this.storeStream( - network, - modelStreamId, - modelStream.allCommitIds, - modelStream.state, - ); + // save model stream + if (stream?.metadata?.model) { + const modelStreamId = stream.metadata.model.toString(); + const modelStream = await this.loadStream(modelStreamId); + if (modelStream) { + await this.storeStream( + network, + modelStreamId, + modelStream.allCommitIds, + modelStream.state, + ); + } } + } catch (error) { + this.logger.error( + `To store network(${network}) stream(${streamId}) err:${JSON.stringify( + error, + )}`, + ); } + } async storeStream( @@ -173,7 +174,7 @@ export default class StoreWorker implements Worker { try { let domain: string; if (genesisCid && streamState?.metadata?.model) { - // this.storeCacao(network, streamId, genesisCid); + this.storeCacao(network, streamId, genesisCid); } const stream = this.convertToStreamEntity( From 777c6367f477c86ca1b969a012552c1c701233b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 12:15:16 +0800 Subject: [PATCH 016/127] add cacao --- packages/server/src/stream/subscriber/store.worker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/subscriber/store.worker.ts b/packages/server/src/stream/subscriber/store.worker.ts index 9230f6f7..b63f445f 100644 --- a/packages/server/src/stream/subscriber/store.worker.ts +++ b/packages/server/src/stream/subscriber/store.worker.ts @@ -7,8 +7,8 @@ import { StreamRepository } from 'src/entities/stream/stream.repository'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); const JobOption: SendOptions = { - retryLimit: 5, - retryDelay: 60, // 1 minute + retryLimit: 0, + retryDelay: 0, // 1 minute retryBackoff: true, expireInHours: 12, retentionDays: 3, From 42b8db1c4da8b38cbd3afc9f51e5d9ddc705c1aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Thu, 12 Oct 2023 14:09:08 +0800 Subject: [PATCH 017/127] close scheduleModule --- packages/server/src/app.module.ts | 13 +++++++++---- .../stream/subscriber/ceramic.subscriber.service.ts | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/server/src/app.module.ts b/packages/server/src/app.module.ts index bacf44de..5d9d1d02 100644 --- a/packages/server/src/app.module.ts +++ b/packages/server/src/app.module.ts @@ -12,7 +12,12 @@ import { HealthModule } from './health/health.module'; import { DappModule } from './dapp/dapp.module'; const env: string | undefined = process.env.NODE_ENV; - +function scheduleModule(){ + if(process.env.SCHEDULED){ + return [ScheduleModule.forRoot()]; + } + return []; +} @Module({ imports: [ TypeOrmModule.forRoot({ @@ -95,8 +100,7 @@ const env: string | undefined = process.env.NODE_ENV; url: process.env.REDIS_URL, }, }), - ScheduleModule.forRoot(), - ], + ].concat(scheduleModule()), controllers: [], providers: [ { @@ -105,4 +109,5 @@ const env: string | undefined = process.env.NODE_ENV; }, ], }) -export class AppModule {} + +export class AppModule { } diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index 6f358b5f..2db7c2ee 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -55,7 +55,7 @@ export default class CeramicSubscriberService { network: network, streamId: parsed.stream, }); - await this.jobQueue.addJob(job); + this.jobQueue.addJob(job); } // else if (parsed.typ == 2) { // // MsgType: RESPONSE From c54d4bbf7261a3badc702f71f2d35945490e1fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 17 Oct 2023 17:32:38 +0800 Subject: [PATCH 018/127] modify p2p node to private var --- .../subscriber/ceramic.subscriber.service.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index 2db7c2ee..f0678260 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -10,6 +10,7 @@ const _importDynamic = new Function('modulePath', 'return import(modulePath)'); export default class CeramicSubscriberService { private readonly logger = new Logger(CeramicSubscriberService.name); private readonly jobQueue!: IJobQueue + private p2pNode: any; constructor( @InjectRepository(Stream, 'testnet') @@ -22,14 +23,14 @@ export default class CeramicSubscriberService { // init ceramic clients const ceramicMiannetClient = await this.createCeramicClient('http://35.220.227.2:7007/'); const ceramicTestnetClient = await this.createCeramicClient('http://34.92.232.17:7007/'); - await this.jobQueue.init({ - [getStreamStoreJob(Network.MAINNET)]: new StoreWorker( - this.streamRepository, ceramicMiannetClient - ), - [getStreamStoreJob(Network.TESTNET)]: new StoreWorker( - this.streamRepository, ceramicTestnetClient - ), - }); + // await this.jobQueue.init({ + // [getStreamStoreJob(Network.MAINNET)]: new StoreWorker( + // this.streamRepository, ceramicMiannetClient + // ), + // [getStreamStoreJob(Network.TESTNET)]: new StoreWorker( + // this.streamRepository, ceramicTestnetClient + // ), + // }); this.logger.log('init job queue success'); } @@ -38,10 +39,10 @@ export default class CeramicSubscriberService { bootstrapMultiaddrs: string[], listen: string[], topic: string) { - const node = await this.createP2PNode(bootstrapMultiaddrs, listen); - node.pubsub.subscribe(topic); + this.p2pNode = await this.createP2PNode(bootstrapMultiaddrs, listen); + this.p2pNode.pubsub.subscribe(topic); - node.pubsub.addEventListener('message', async (message) => { + this.p2pNode.pubsub.addEventListener('message', async (message) => { try { const textDecoder = new TextDecoder('utf-8'); const asString = textDecoder.decode(message.detail.data); From 8a4933b2e6872bc4a45f9c6353dd4ad68258a409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 17 Oct 2023 17:52:26 +0800 Subject: [PATCH 019/127] modify p2p node to private var --- .../subscriber/ceramic.subscriber.service.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index f0678260..e34bd82e 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -23,14 +23,14 @@ export default class CeramicSubscriberService { // init ceramic clients const ceramicMiannetClient = await this.createCeramicClient('http://35.220.227.2:7007/'); const ceramicTestnetClient = await this.createCeramicClient('http://34.92.232.17:7007/'); - // await this.jobQueue.init({ - // [getStreamStoreJob(Network.MAINNET)]: new StoreWorker( - // this.streamRepository, ceramicMiannetClient - // ), - // [getStreamStoreJob(Network.TESTNET)]: new StoreWorker( - // this.streamRepository, ceramicTestnetClient - // ), - // }); + await this.jobQueue.init({ + [getStreamStoreJob(Network.MAINNET)]: new StoreWorker( + this.streamRepository, ceramicMiannetClient + ), + [getStreamStoreJob(Network.TESTNET)]: new StoreWorker( + this.streamRepository, ceramicTestnetClient + ), + }); this.logger.log('init job queue success'); } From 761642eedbd3e6263997fc61cda26dcfe3742018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Fri, 20 Oct 2023 09:56:54 +0800 Subject: [PATCH 020/127] init history sync code --- packages/server/package.json | 1 + packages/server/src/stream/stream.module.ts | 5 +-- packages/server/src/stream/sync/constants.ts | 35 ++++++++++++++++++ .../src/stream/sync/history-sync.service.ts | 25 +++++++++++++ packages/server/yarn.lock | 36 +++++++++++++++++++ 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 packages/server/src/stream/sync/constants.ts create mode 100644 packages/server/src/stream/sync/history-sync.service.ts diff --git a/packages/server/package.json b/packages/server/package.json index fa48ef54..30b451e4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -31,6 +31,7 @@ "@didtools/cacao": "^2.0.0", "@didtools/pkh-ethereum": "^0.3.0", "@didtools/pkh-solana": "^0.1.1", + "@ethersproject/providers": "^5.7.2", "@graphql-codegen/cli": "^4.0.1", "@graphql-codegen/client-preset": "^4.0.1", "@graphql-codegen/typescript-react-apollo": "^3.3.7", diff --git a/packages/server/src/stream/stream.module.ts b/packages/server/src/stream/stream.module.ts index 563ca673..740019c8 100644 --- a/packages/server/src/stream/stream.module.ts +++ b/packages/server/src/stream/stream.module.ts @@ -5,6 +5,7 @@ import { Stream } from '../entities/stream/stream.entity'; import StreamService from './stream.service'; import CeramicSubscriberService from './subscriber/ceramic.subscriber.service'; import { ModelModule } from 'src/model/model.module'; +import HistorySyncService from './sync/history-sync.service'; @Module({ imports: [ @@ -12,7 +13,7 @@ import { ModelModule } from 'src/model/model.module'; forwardRef(() => ModelModule), ], controllers: [StreamController], - providers: [StreamService, CeramicSubscriberService], - exports: [StreamService, CeramicSubscriberService], + providers: [StreamService, CeramicSubscriberService, HistorySyncService], + exports: [StreamService, CeramicSubscriberService, HistorySyncService], }) export class StreamModule {} diff --git a/packages/server/src/stream/sync/constants.ts b/packages/server/src/stream/sync/constants.ts new file mode 100644 index 00000000..e86bf85f --- /dev/null +++ b/packages/server/src/stream/sync/constants.ts @@ -0,0 +1,35 @@ +export interface EthNetwork { + network: string + chain: string + chainId: number + networkId: number + type: string + endpoint?: string +} + +export const EthChainIdMappings: Record = { + 'eip155:1': { network: 'mainnet', chain: 'ETH', chainId: 1, networkId: 1, type: 'Production' }, + 'eip155:3': { network: 'ropsten', chain: 'ETH', chainId: 3, networkId: 3, type: 'Test' }, + 'eip155:4': { network: 'rinkeby', chain: 'ETH', chainId: 4, networkId: 4, type: 'Test' }, + 'eip155:5': { network: 'goerli', chain: 'ETH', chainId: 5, networkId: 5, type: 'Test' }, + 'eip155:100': { + network: 'mainnet', + chain: 'Gnosis', + chainId: 100, + networkId: 100, + type: 'Test', + endpoint: 'https://rpc.ankr.com/gnosis', + }, +} + +export const InitialIndexingBlocks: Record = { + 'eip155:1': 16695723, + 'eip155:5': 8503000, + 'eip155:100': 26511896, +} + +export interface SyncJobData { + currentBlock?: number + fromBlock: number + toBlock: number +} \ No newline at end of file diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts new file mode 100644 index 00000000..77c4432a --- /dev/null +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -0,0 +1,25 @@ +import { Injectable } from "@nestjs/common"; +import type { Provider } from '@ethersproject/providers' +import { IJobQueue, JobQueue } from "../subscriber/job-queue"; +import { SyncJobData } from "./constants"; + + +@Injectable() +export default class HistorySyncService { + private provider!: Provider; + private readonly jobQueue!: IJobQueue; + + constructor() { + // TODO: pass in the job queue name + this.jobQueue = new JobQueue(''); + } + + async init(provider: Provider): Promise { + this.provider = provider; + } + + async startHistorySync(){ + + } + +} \ No newline at end of file diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 88ff02a7..04c84909 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1358,6 +1358,32 @@ dependencies: "@ethersproject/logger" "^5.7.0" +"@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -5509,6 +5535,11 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + bech32@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" @@ -12361,6 +12392,11 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@8.13.0, ws@^8.12.0, ws@^8.12.1, ws@^8.4.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" From 60bb2540a908373cdbbcd8205d9efea8896f29f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Mon, 23 Oct 2023 14:25:14 +0800 Subject: [PATCH 021/127] add the logic code for fatching data from eth --- packages/server/package.json | 2 + .../src/entities/stream/stream.entity.ts | 34 +++++ .../src/entities/stream/stream.repository.ts | 7 +- .../subscriber/ceramic.subscriber.service.ts | 2 +- packages/server/src/stream/sync/constants.ts | 20 ++- .../src/stream/sync/history-sync.service.ts | 135 ++++++++++++++++-- packages/server/yarn.lock | 74 ++++++++++ 7 files changed, 257 insertions(+), 17 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index 30b451e4..6a15fd83 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -21,6 +21,7 @@ "test:e2e": "jest --config ./test/jest-e2e.json --detectOpenHandles --runInBand --forceExit" }, "dependencies": { + "@ceramicnetwork/anchor-utils": "^1.20.0", "@ceramicnetwork/common": "^2.35.0", "@ceramicnetwork/http-client": "^2.32.0", "@chainsafe/libp2p-gossipsub": "^6.1.0", @@ -78,6 +79,7 @@ "jsonwebtoken": "^8.5.1", "key-did-provider-ed25519": "^3.0.0", "libp2p": "^0.42.2", + "p-queue": "^7.4.1", "pg": "^8.11.3", "pg-boss": "^9.0.3", "reflect-metadata": "^0.1.13", diff --git a/packages/server/src/entities/stream/stream.entity.ts b/packages/server/src/entities/stream/stream.entity.ts index 85885d9e..59e5e460 100644 --- a/packages/server/src/entities/stream/stream.entity.ts +++ b/packages/server/src/entities/stream/stream.entity.ts @@ -232,3 +232,37 @@ export class Stream extends BaseEntity { this.last_modified_at = LastModifiedAt; } } + +@Entity({ name: 'history_sync_state' }) +export class HistorySyncState extends BaseEntity { + + @Column({ nullable: false }) + private chain_id: string; + + @Column({ nullable: true }) + private processed_block_hash: string; + + @Column({ nullable: false }) + private processed_block_number: string; + + get getChainId(): string { + return this.chain_id; + } + set setChainId(chainId: string) { + this.chain_id = chainId; + } + + get getProcessedBlockHash(): string { + return this.processed_block_hash; + } + set setProcessedBlockHash(processedBlockHash: string) { + this.processed_block_hash = processedBlockHash; + } + + get getProcessedBlockNumber(): string { + return this.processed_block_number; + } + set setProcessedBlockNumber(processedBlockNumber: string) { + this.processed_block_number = processedBlockNumber; + } +} \ No newline at end of file diff --git a/packages/server/src/entities/stream/stream.repository.ts b/packages/server/src/entities/stream/stream.repository.ts index 3e96ed2f..4cf09ca4 100644 --- a/packages/server/src/entities/stream/stream.repository.ts +++ b/packages/server/src/entities/stream/stream.repository.ts @@ -1,5 +1,8 @@ -import { EntityRepository, Repository } from 'typeorm'; -import { Stream } from './stream.entity'; +import { EntityRepository, EntityRepository, Repository } from 'typeorm'; +import { HistorySyncState, Stream } from './stream.entity'; @EntityRepository(Stream) export class StreamRepository extends Repository {} + +@EntityRepository(HistorySyncState) +export class HistorySyncStateRepository extends Repository {} diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index e34bd82e..b78e6238 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -9,7 +9,7 @@ const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() export default class CeramicSubscriberService { private readonly logger = new Logger(CeramicSubscriberService.name); - private readonly jobQueue!: IJobQueue + public jobQueue!: IJobQueue private p2pNode: any; constructor( diff --git a/packages/server/src/stream/sync/constants.ts b/packages/server/src/stream/sync/constants.ts index e86bf85f..6625b4e0 100644 --- a/packages/server/src/stream/sync/constants.ts +++ b/packages/server/src/stream/sync/constants.ts @@ -7,6 +7,22 @@ export interface EthNetwork { endpoint?: string } +export type SupportedNetwork = + | 'eip155:1' // mainnet + | 'eip155:3' // ropsten + | 'eip155:5' // goerli + | 'eip155:100' // gnosis + | 'eip155:1337' // ganache + + +export const ChainIdEnum = { + MAINNET: 'eip155:1', + ROPSTEN: 'eip155:3', + RINKEBY: 'eip155:4', + GOERLI: 'eip155:5', + GNOSIS: 'eip155:100', +} + export const EthChainIdMappings: Record = { 'eip155:1': { network: 'mainnet', chain: 'ETH', chainId: 1, networkId: 1, type: 'Production' }, 'eip155:3': { network: 'ropsten', chain: 'ETH', chainId: 3, networkId: 3, type: 'Test' }, @@ -32,4 +48,6 @@ export interface SyncJobData { currentBlock?: number fromBlock: number toBlock: number -} \ No newline at end of file +} + +export const CeramicAnchorContractAddress = '0x231055a0852d67c7107ad0d0dfeab60278fe6adc'; \ No newline at end of file diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 77c4432a..02fcc4ff 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -1,25 +1,134 @@ -import { Injectable } from "@nestjs/common"; +import { Injectable, Logger } from "@nestjs/common"; import type { Provider } from '@ethersproject/providers' import { IJobQueue, JobQueue } from "../subscriber/job-queue"; -import { SyncJobData } from "./constants"; - +import { CeramicAnchorContractAddress, ChainIdEnum, EthChainIdMappings, EthNetwork, InitialIndexingBlocks, SyncJobData } from "./constants"; +import { InjectRepository } from "@nestjs/typeorm"; +import { HistorySyncState, Stream } from "src/entities/stream/stream.entity"; +import { HistorySyncStateRepository, StreamRepository } from "src/entities/stream/stream.repository"; +import { StreamStoreData } from "../subscriber/store.worker"; +import * as providers from '@ethersproject/providers'; +import { + getCidFromAnchorEventLog, +} from '@ceramicnetwork/anchor-utils' +import PQueue from 'p-queue'; +const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() export default class HistorySyncService { - private provider!: Provider; - private readonly jobQueue!: IJobQueue; + private readonly logger = new Logger(HistorySyncService.name); + public streamJobQueue!: IJobQueue + private mainnetProvider: Provider; + private testnetProvider: Provider; + private ipfs: any; + + constructor(@InjectRepository(HistorySyncState, 'testnet') + private readonly historySyncStateRepository: HistorySyncStateRepository, + @InjectRepository(Stream, 'testnet') + private readonly streamRepository: StreamRepository,) { + } + + async init(streamJobQueue: IJobQueue): Promise { + this.streamJobQueue = streamJobQueue; + + // init eth providers + this.mainnetProvider = this.getProvider(ChainIdEnum.MAINNET.toString()); + this.testnetProvider = this.getProvider(ChainIdEnum.GNOSIS.toString()); + + // init state table data + await this.initStatetable(ChainIdEnum.MAINNET.toString()); + await this.initStatetable(ChainIdEnum.GNOSIS.toString()); + + // init ipfs client + const ipfsHttpClient = await _importDynamic('ipfs-http-client'); + this.ipfs = await ipfsHttpClient.create({ + url: 'https://gateway.ipfs.io', + }); + } + + async startHistorySync() { + // start history sync for each chain + await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); + } + + async startHistorySyncForChain(chainId: string) { + const historySyncState = await this.historySyncStateRepository.findOne({ + where: { + chain_id: chainId + } + }) + this.logger.log('Start history sync state:' + JSON.stringify(historySyncState) + 'for chain id:' + chainId); + if (historySyncState == null) { + this.logger.error('History sync state is null, please check the history sync state table'); + return; + } + + const currentBlockNumber = historySyncState.getProcessedBlockNumber; + // get block log data from the provider + // and parse anchor proof root for ETH logs + const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; + const logs = await provider.getLogs({ + address: CeramicAnchorContractAddress, + fromBlock: historySyncState.getProcessedBlockNumber, + toBlock: +historySyncState.getProcessedBlockNumber + 1, + }); + this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); + if (logs?.length == 0) { + return; + } + // anchor proof root is a CID + const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) + this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); + if (anchorProofRoots?.length == 0) { + return; + } + + // parse stream id by ipfs + + // add stream id to queue - constructor() { - // TODO: pass in the job queue name - this.jobQueue = new JobQueue(''); + // update state table data } - async init(provider: Provider): Promise { - this.provider = provider; + async initStatetable(chainId: string) { + const historySyncState = await this.historySyncStateRepository.findOne({ + where: { + chain_id: chainId + } + }) + this.logger.log('Init history sync state data, the current data is:' + JSON.stringify(historySyncState)); + if (historySyncState == null) { + const newHistorySyncState = new HistorySyncState() + newHistorySyncState.setChainId = chainId + newHistorySyncState.setProcessedBlockNumber = InitialIndexingBlocks[chainId].toString(); + await this.historySyncStateRepository.save(newHistorySyncState) + } } - async startHistorySync(){ - + /** + * Gets Ethereum provider based on chain ID + * @param chain - CAIP-2 Chain ID + * @private + */ + getProvider(chainId: string | null): providers.BaseProvider { + + if (!chainId.startsWith('eip155')) { + throw new Error(`Unsupported chainId '${chainId}' - must be eip155 namespace`) + } + + const ethNetwork: EthNetwork = EthChainIdMappings[chainId] + const endpoint = ethNetwork?.endpoint + + let provider + if (endpoint) { + provider = new providers.StaticJsonRpcProvider(endpoint) + } else { + if (ethNetwork == null) { + throw new Error(`No ethereum provider available for chainId ${chainId}`) + } + + provider = providers.getDefaultProvider(ethNetwork.network) + } + return provider } - } \ No newline at end of file diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 04c84909..f4ab5142 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -689,6 +689,16 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" +"@ceramicnetwork/anchor-utils@^1.20.0": + version "1.20.0" + resolved "https://registry.yarnpkg.com/@ceramicnetwork/anchor-utils/-/anchor-utils-1.20.0.tgz#0465fcc1f68ad2d8517bf841e26adefbfd46530a" + integrity sha512-5z/0nqQoqAkxentqsVzCRIiqmR9/zSkf9Bzv0B+qhzGEGc8VfihMNSEOOMY2+trwgXIBiET51fulOUOgcvULfQ== + dependencies: + "@ceramicnetwork/common" "^2.37.0" + "@ethersproject/abi" "^5.7.0" + multiformats "^11.0.1" + uint8arrays "^4.0.3" + "@ceramicnetwork/codecs@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@ceramicnetwork/codecs/-/codecs-1.1.0.tgz#ab4ac5703f8afd18986a41ef6dd9c8cd68755749" @@ -711,6 +721,18 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" +"@ceramicnetwork/codecs@^1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@ceramicnetwork/codecs/-/codecs-1.12.0.tgz#ade572676363468d566a9ea7b29dcf7f369434a8" + integrity sha512-LpQzhfPRsMAyNOltMXsk5AuBh+g6VixlkH9JfLaRYnjJuVPiMPl/t/ezL+25jPWndW69qPvmCPEedePq9WTFkA== + dependencies: + "@ceramicnetwork/streamid" "^2.17.0" + cartonne "^2.1.1" + codeco "^1.1.0" + dag-jose "^4.0.0" + multiformats "^11.0.1" + uint8arrays "^4.0.3" + "@ceramicnetwork/common@^2.26.0": version "2.26.0" resolved "https://registry.yarnpkg.com/@ceramicnetwork/common/-/common-2.26.0.tgz#b0b6d10ec08b1cb40ff387e5ca143224914ff3c0" @@ -759,6 +781,30 @@ rxjs "^7.5.2" uint8arrays "^4.0.3" +"@ceramicnetwork/common@^2.37.0": + version "2.37.0" + resolved "https://registry.yarnpkg.com/@ceramicnetwork/common/-/common-2.37.0.tgz#81b1cc7ccad567f342c700b235f5f0aa180b7bd1" + integrity sha512-8v6mIu6xq6j/E0pK5EW/LPpZTqfUlk7iu97rZPrPdjxtNiOFxW1YX5jjDe9SYTjGZNOi/89MRzCLA1tzab8a9Q== + dependencies: + "@ceramicnetwork/codecs" "^1.12.0" + "@ceramicnetwork/streamid" "^2.17.0" + "@didtools/cacao" "^2.1.0" + "@didtools/pkh-ethereum" "^0.1.0" + "@didtools/pkh-solana" "^0.1.0" + "@didtools/pkh-stacks" "^0.1.0" + "@didtools/pkh-tezos" "^0.2.1" + "@stablelib/random" "^1.0.1" + caip "~1.1.0" + cross-fetch "^3.1.4" + flat "^5.0.2" + it-first "^1.0.7" + jet-logger "1.2.2" + lodash.clonedeep "^4.5.0" + logfmt "^1.3.2" + multiformats "^11.0.1" + rxjs "^7.5.2" + uint8arrays "^4.0.3" + "@ceramicnetwork/http-client@^2.0.0": version "2.23.0" resolved "https://registry.yarnpkg.com/@ceramicnetwork/http-client/-/http-client-2.23.0.tgz#a90a34337aedd3298b92c2bcf3256d4c5024a5e5" @@ -1198,6 +1244,21 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" @@ -7000,6 +7061,11 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -10194,6 +10260,14 @@ p-queue@^7.2.0: eventemitter3 "^4.0.7" p-timeout "^5.0.2" +p-queue@^7.4.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-7.4.1.tgz#7f86f853048beca8272abdbb7cec1ed2afc0f265" + integrity sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^5.0.2" + p-reflect@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-reflect/-/p-reflect-3.1.0.tgz#bba22747439b5fc50a7f626e8e909dc9b888218d" From fd6e13279afccfdce1661729947d6e4eca82b181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 24 Oct 2023 11:02:30 +0800 Subject: [PATCH 022/127] parse chain logs for streams --- .../src/entities/stream/stream.entity.ts | 12 +- .../src/stream/sync/history-sync.service.ts | 121 ++++++++++++------ packages/server/src/stream/sync/utils.ts | 1 + 3 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 packages/server/src/stream/sync/utils.ts diff --git a/packages/server/src/entities/stream/stream.entity.ts b/packages/server/src/entities/stream/stream.entity.ts index 59e5e460..eb222f85 100644 --- a/packages/server/src/entities/stream/stream.entity.ts +++ b/packages/server/src/entities/stream/stream.entity.ts @@ -237,13 +237,13 @@ export class Stream extends BaseEntity { export class HistorySyncState extends BaseEntity { @Column({ nullable: false }) - private chain_id: string; + chain_id: string; @Column({ nullable: true }) - private processed_block_hash: string; + processed_block_hash: string; @Column({ nullable: false }) - private processed_block_number: string; + processed_block_number: string; get getChainId(): string { return this.chain_id; @@ -254,8 +254,8 @@ export class HistorySyncState extends BaseEntity { get getProcessedBlockHash(): string { return this.processed_block_hash; - } - set setProcessedBlockHash(processedBlockHash: string) { + } + set setProcessedBlockHash(processedBlockHash: string) { this.processed_block_hash = processedBlockHash; } @@ -263,6 +263,6 @@ export class HistorySyncState extends BaseEntity { return this.processed_block_number; } set setProcessedBlockNumber(processedBlockNumber: string) { - this.processed_block_number = processedBlockNumber; + this.processed_block_number = processedBlockNumber; } } \ No newline at end of file diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 02fcc4ff..4bc44384 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -1,16 +1,18 @@ import { Injectable, Logger } from "@nestjs/common"; import type { Provider } from '@ethersproject/providers' -import { IJobQueue, JobQueue } from "../subscriber/job-queue"; +import { IJobQueue, Job, JobQueue } from "../subscriber/job-queue"; import { CeramicAnchorContractAddress, ChainIdEnum, EthChainIdMappings, EthNetwork, InitialIndexingBlocks, SyncJobData } from "./constants"; import { InjectRepository } from "@nestjs/typeorm"; -import { HistorySyncState, Stream } from "src/entities/stream/stream.entity"; +import { HistorySyncState, Network, Stream } from "src/entities/stream/stream.entity"; import { HistorySyncStateRepository, StreamRepository } from "src/entities/stream/stream.repository"; -import { StreamStoreData } from "../subscriber/store.worker"; +import { StreamStoreData, createStreamStoreJob, getStreamStoreJob } from "../subscriber/store.worker"; import * as providers from '@ethersproject/providers'; import { getCidFromAnchorEventLog, -} from '@ceramicnetwork/anchor-utils' +} from '@ceramicnetwork/anchor-utils'; +import { CID } from 'multiformats/cid'; import PQueue from 'p-queue'; +import { sleep } from "./utils"; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() @@ -41,7 +43,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io', + url: 'https://gateway.ipfs.io', }); } @@ -52,44 +54,91 @@ export default class HistorySyncService { } async startHistorySyncForChain(chainId: string) { - const historySyncState = await this.historySyncStateRepository.findOne({ - where: { - chain_id: chainId + while (true) { + try { + const historySyncState = await this.historySyncStateRepository.findOne({ + where: { + chain_id: chainId + } + }) + this.logger.log('Start history sync state:' + JSON.stringify(historySyncState) + 'for chain id:' + chainId); + if (historySyncState == null) { + this.logger.error('History sync state is null, please check the history sync state table'); + break; + } + const currentBlockNumber = historySyncState.getProcessedBlockNumber; + // TODO verify the history sync state, if the state exceed the max block number, then return; + + try { + // get block log data from the provider + // and parse anchor proof root for ETH logs + const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; + const logs = await provider.getLogs({ + address: CeramicAnchorContractAddress, + fromBlock: historySyncState.getProcessedBlockNumber, + toBlock: +historySyncState.getProcessedBlockNumber + 1, + }); + this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); + if (logs?.length > 0) { + // anchor proof root is a CID + const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) + this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); + if (anchorProofRoots?.length > 0) { + // parse stream id from anchor proof roots by ipfs + const streamIdsFromBlockLogs: string[] = []; + for await (const cid of anchorProofRoots) { + try { + const streamIds = await this.getStreamIdsFromIpfs(cid); + streamIdsFromBlockLogs.push(...streamIds); + this.logger.log(`[${chainId}] Stream ids' length: ${streamIds?.length} for cid: ${cid}`); + } catch (error) { + this.logger.error(`[${chainId}] Error: ${error.message}`); + } + } + this.logger.log(`[${chainId}] Stream ids' length: ${streamIdsFromBlockLogs?.length} for block number: ${currentBlockNumber}`); + // add stream id to queue + const network = chainId == ChainIdEnum.MAINNET.toString() ? Network.MAINNET : Network.TESTNET; + for await (const streamId of streamIdsFromBlockLogs) { + const job: Job = createStreamStoreJob(getStreamStoreJob(network), { + network: network, + streamId: streamId, + }); + await this.streamJobQueue.addJob(job); + } + } + } + } catch (error) { + this.logger.error(`[${chainId}] Error: ${error.message}`); + } + // update state table data + historySyncState.setProcessedBlockNumber = currentBlockNumber + 1; + await this.historySyncStateRepository.update({ chain_id: chainId }, historySyncState); + + // sleep 10 seconds + await sleep(10000); + } catch (error) { + this.logger.error(`[${chainId}] Error: ${error.message}`); } - }) - this.logger.log('Start history sync state:' + JSON.stringify(historySyncState) + 'for chain id:' + chainId); - if (historySyncState == null) { - this.logger.error('History sync state is null, please check the history sync state table'); - return; } + } - const currentBlockNumber = historySyncState.getProcessedBlockNumber; - // get block log data from the provider - // and parse anchor proof root for ETH logs - const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; - const logs = await provider.getLogs({ - address: CeramicAnchorContractAddress, - fromBlock: historySyncState.getProcessedBlockNumber, - toBlock: +historySyncState.getProcessedBlockNumber + 1, + async getStreamIdsFromIpfs(cid: CID | string): Promise { + const metedataPath = '2' + const resolution = this.ipfs.dag.resolve(cid, { + timeout: 30000, + path: metedataPath, }); - this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); - if (logs?.length == 0) { - return; - } - // anchor proof root is a CID - const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) - this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); - if (anchorProofRoots?.length == 0) { - return; - } - - // parse stream id by ipfs + const blockCid = resolution.cid - // add stream id to queue - - // update state table data + const codec = await this.ipfs.codecs.getCodec(blockCid.code); + const block = this.ipfs.block.get(blockCid, { + timeout: 30000, + }); + const metadata = codec.decode(block) + return metadata?.streamIds; } + async initStatetable(chainId: string) { const historySyncState = await this.historySyncStateRepository.findOne({ where: { diff --git a/packages/server/src/stream/sync/utils.ts b/packages/server/src/stream/sync/utils.ts new file mode 100644 index 00000000..c7e0237a --- /dev/null +++ b/packages/server/src/stream/sync/utils.ts @@ -0,0 +1 @@ +export const sleep = (t) => new Promise((r) => setTimeout(r, t)); From 8bbbef1cbd438876f0df623b79c0ed95bf17482f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 24 Oct 2023 16:13:21 +0800 Subject: [PATCH 023/127] save code --- packages/server/src/app.module.ts | 9 +++++---- packages/server/src/common/constants.ts | 2 ++ packages/server/src/dapp/dapp.module.ts | 3 ++- packages/server/src/dapp/dapp.service.ts | 7 ++++--- .../src/entities/stream/stream.repository.ts | 2 +- packages/server/src/main.ts | 11 +++++++++-- packages/server/src/model/model.module.ts | 4 ++-- packages/server/src/model/model.service.ts | 7 ++++--- packages/server/src/stream/stream.module.ts | 5 +++-- packages/server/src/stream/stream.service.ts | 4 ++-- .../subscriber/ceramic.subscriber.service.ts | 3 ++- packages/server/src/stream/sync/constants.ts | 4 +++- .../src/stream/sync/history-sync.service.ts | 18 ++++++++++++------ 13 files changed, 51 insertions(+), 28 deletions(-) diff --git a/packages/server/src/app.module.ts b/packages/server/src/app.module.ts index 5d9d1d02..e2606d0e 100644 --- a/packages/server/src/app.module.ts +++ b/packages/server/src/app.module.ts @@ -10,10 +10,11 @@ import 'dotenv/config'; import { ScheduleModule } from '@nestjs/schedule'; import { HealthModule } from './health/health.module'; import { DappModule } from './dapp/dapp.module'; +import { S3SeverBizDbName } from './common/constants'; const env: string | undefined = process.env.NODE_ENV; -function scheduleModule(){ - if(process.env.SCHEDULED){ +function scheduleModule() { + if (process.env.SCHEDULED) { return [ScheduleModule.forRoot()]; } return []; @@ -21,14 +22,14 @@ function scheduleModule(){ @Module({ imports: [ TypeOrmModule.forRoot({ - name: 's3-server-db', + name: S3SeverBizDbName, port: 5432, host: process.env.DATABASE_HOST, username: process.env.DATABASE_USER, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE, logging: false, - entities: ['dist/**/dapp.entity{.ts,.js}'], + entities: ['dist/**/dapp.entity{.ts,.js}', 'dist/**/stream.entity{.ts,.js}'], type: 'postgres', pool: { max: 70, diff --git a/packages/server/src/common/constants.ts b/packages/server/src/common/constants.ts index 29be4390..95e9991c 100644 --- a/packages/server/src/common/constants.ts +++ b/packages/server/src/common/constants.ts @@ -7,3 +7,5 @@ export const S3_MODEL_GRAPHQL_RUNTIMEDEFINITION_CACHE_PREFIX = 's3:model:graphql:runtimeDefinition:cache:'; export const S3_MODEL_GRAPHQL_GRAPHQLSCHEMA_CACHE_PREFIX = 's3:model:graphql:graphqlSchema:cache:'; + +export const S3SeverBizDbName = 's3-server-db'; \ No newline at end of file diff --git a/packages/server/src/dapp/dapp.module.ts b/packages/server/src/dapp/dapp.module.ts index e8102402..698cb7b4 100644 --- a/packages/server/src/dapp/dapp.module.ts +++ b/packages/server/src/dapp/dapp.module.ts @@ -6,9 +6,10 @@ import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/c import { UserAuthMiddleware } from 'src/middlewares/user-auth.middleware'; import { ModelModule } from 'src/model/model.module'; import { StreamModule } from 'src/stream/stream.module'; +import { S3SeverBizDbName } from 'src/common/constants'; @Module({ - imports: [TypeOrmModule.forFeature([Dapp, DappComposite, DappDomain], 's3-server-db'), ModelModule, StreamModule], + imports: [TypeOrmModule.forFeature([Dapp, DappComposite, DappDomain], S3SeverBizDbName), ModelModule, StreamModule], controllers: [DappController], providers: [DappService], exports: [DappService], diff --git a/packages/server/src/dapp/dapp.service.ts b/packages/server/src/dapp/dapp.service.ts index a43f11e2..878fc202 100644 --- a/packages/server/src/dapp/dapp.service.ts +++ b/packages/server/src/dapp/dapp.service.ts @@ -6,16 +6,17 @@ import StreamService from 'src/stream/stream.service'; import { ILike } from 'typeorm'; import { Network as StreamNetwork } from 'src/entities/stream/stream.entity'; import ModelService from 'src/model/model.service'; +import { S3SeverBizDbName } from 'src/common/constants'; @Injectable() export default class DappService { private readonly logger = new Logger(DappService.name); constructor( - @InjectRepository(Dapp, 's3-server-db') + @InjectRepository(Dapp, S3SeverBizDbName) private readonly dappRepository: DappRepository, - @InjectRepository(DappComposite, 's3-server-db') + @InjectRepository(DappComposite, S3SeverBizDbName) private readonly dappCompositeRepository: DappCompositeRepository, - @InjectRepository(DappDomain, 's3-server-db') + @InjectRepository(DappDomain, S3SeverBizDbName) private readonly dappDomainRepository: DappDomainRepository, private readonly streamService: StreamService, private readonly modelService: ModelService, diff --git a/packages/server/src/entities/stream/stream.repository.ts b/packages/server/src/entities/stream/stream.repository.ts index 4cf09ca4..0b288344 100644 --- a/packages/server/src/entities/stream/stream.repository.ts +++ b/packages/server/src/entities/stream/stream.repository.ts @@ -1,4 +1,4 @@ -import { EntityRepository, EntityRepository, Repository } from 'typeorm'; +import { EntityRepository, Repository } from 'typeorm'; import { HistorySyncState, Stream } from './stream.entity'; @EntityRepository(Stream) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 65448f84..f23f6ec0 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -5,6 +5,7 @@ import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; import { Network } from './entities/stream/stream.entity'; import CeramicSubscriberService from './stream/subscriber/ceramic.subscriber.service'; +import HistorySyncService from './stream/sync/history-sync.service'; async function bootstrap() { // init the apm @@ -24,11 +25,17 @@ async function bootstrap() { await app.listen(3000); - // Sub ceramic test network. + // Sync and subscribe to ceramic. if (!process.env.DISABLE_P2P_SUB){ const ceramicSubscriberService = app.get(CeramicSubscriberService); await ceramicSubscriberService.initJobQueue(); + // Sync history data from ceramic. + const historySyncService = app.get(HistorySyncService); + historySyncService.init(ceramicSubscriberService.jobQueue); + await historySyncService.startHistorySync(); + + // Subsciber ceramic test network. await ceramicSubscriberService.subCeramic( Network.TESTNET, [ @@ -40,7 +47,7 @@ async function bootstrap() { '/ceramic/testnet-clay', ); - // Sub ceramic main network. + // Subsciber ceramic main network. await ceramicSubscriberService.subCeramic( Network.MAINNET, [ diff --git a/packages/server/src/model/model.module.ts b/packages/server/src/model/model.module.ts index a226c39f..e8896b13 100644 --- a/packages/server/src/model/model.module.ts +++ b/packages/server/src/model/model.module.ts @@ -11,6 +11,7 @@ import { ModelController } from './model.controller'; import { StreamModule } from '../stream/stream.module'; import { Stream } from 'src/entities/stream/stream.entity'; import { Dapp, DappDomain } from 'src/entities/dapp/dapp.entity'; +import { S3SeverBizDbName } from 'src/common/constants'; @Module({ imports: [ @@ -22,8 +23,7 @@ import { Dapp, DappDomain } from 'src/entities/dapp/dapp.entity'; [MetaModelMainnet, CeramicModelMainNet], 'mainnet', ), - TypeOrmModule.forFeature([Stream], 'testnet'), - TypeOrmModule.forFeature([Dapp, DappDomain], 's3-server-db'), + TypeOrmModule.forFeature([Stream, Dapp, DappDomain], S3SeverBizDbName), forwardRef(() => StreamModule), ], controllers: [ModelController], diff --git a/packages/server/src/model/model.service.ts b/packages/server/src/model/model.service.ts index 796f360f..b87c8d5c 100644 --- a/packages/server/src/model/model.service.ts +++ b/packages/server/src/model/model.service.ts @@ -18,6 +18,7 @@ import { Network as DappNetwork } from 'src/entities/dapp/dapp.entity'; import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; import { + S3SeverBizDbName, S3_MAINNET_MODELS_USE_COUNT_ZSET, S3_MODEL_GRAPHQL_COMPOSITE_CACHE_PREFIX, S3_MODEL_GRAPHQL_GRAPHQLSCHEMA_CACHE_PREFIX, @@ -58,13 +59,13 @@ export default class ModelService { @InjectEntityManager('mainnet') private mainnetCeramicEntityManager: EntityManager, - @InjectRepository(Stream, 'testnet') + @InjectRepository(Stream, S3SeverBizDbName) private readonly streamRepository: StreamRepository, - @InjectRepository(DappDomain, 's3-server-db') + @InjectRepository(DappDomain, S3SeverBizDbName) private readonly dappDomainRepository: DappDomainRepository, - @InjectRepository(Dapp, 's3-server-db') + @InjectRepository(Dapp, S3SeverBizDbName) private readonly dappRepository: DappRepository, @InjectRedis() private readonly redis: Redis, diff --git a/packages/server/src/stream/stream.module.ts b/packages/server/src/stream/stream.module.ts index 740019c8..9fe006b4 100644 --- a/packages/server/src/stream/stream.module.ts +++ b/packages/server/src/stream/stream.module.ts @@ -1,15 +1,16 @@ import { StreamController } from './stream.controller'; import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { Stream } from '../entities/stream/stream.entity'; +import { HistorySyncState, Stream } from '../entities/stream/stream.entity'; import StreamService from './stream.service'; import CeramicSubscriberService from './subscriber/ceramic.subscriber.service'; import { ModelModule } from 'src/model/model.module'; import HistorySyncService from './sync/history-sync.service'; +import { S3SeverBizDbName } from 'src/common/constants'; @Module({ imports: [ - TypeOrmModule.forFeature([Stream], 'testnet'), + TypeOrmModule.forFeature([Stream, HistorySyncState], S3SeverBizDbName), forwardRef(() => ModelModule), ], controllers: [StreamController], diff --git a/packages/server/src/stream/stream.service.ts b/packages/server/src/stream/stream.service.ts index 616490d2..7bdf916a 100644 --- a/packages/server/src/stream/stream.service.ts +++ b/packages/server/src/stream/stream.service.ts @@ -7,15 +7,15 @@ import { StatsDto } from './dtos/common.dto'; import { InjectRedis } from '@liaoliaots/nestjs-redis'; import Redis from 'ioredis'; import { Cron } from '@nestjs/schedule'; -import { number } from 'joi'; import { IsNull, MoreThan, Not, In } from 'typeorm'; +import { S3SeverBizDbName } from 'src/common/constants'; @Injectable() export default class StreamService { private readonly logger = new Logger(StreamService.name); constructor( - @InjectRepository(Stream, 'testnet') + @InjectRepository(Stream, S3SeverBizDbName) private readonly streamRepository: StreamRepository, private readonly modelService: ModelService, @InjectRedis() private readonly redis: Redis, diff --git a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts index b78e6238..bf165960 100644 --- a/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts +++ b/packages/server/src/stream/subscriber/ceramic.subscriber.service.ts @@ -4,6 +4,7 @@ import { Network, Stream } from '../../entities/stream/stream.entity'; import { StreamRepository } from '../../entities/stream/stream.repository'; import { IJobQueue, Job, JobQueue } from './job-queue'; import StoreWorker, { getStreamStoreJob, StreamStoreData, createStreamStoreJob } from './store.worker'; +import { S3SeverBizDbName } from 'src/common/constants'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() @@ -13,7 +14,7 @@ export default class CeramicSubscriberService { private p2pNode: any; constructor( - @InjectRepository(Stream, 'testnet') + @InjectRepository(Stream, S3SeverBizDbName) private readonly streamRepository: StreamRepository, ) { this.jobQueue = new JobQueue(process.env.PG_BOSS_DATABASE_URL); diff --git a/packages/server/src/stream/sync/constants.ts b/packages/server/src/stream/sync/constants.ts index 6625b4e0..66330017 100644 --- a/packages/server/src/stream/sync/constants.ts +++ b/packages/server/src/stream/sync/constants.ts @@ -50,4 +50,6 @@ export interface SyncJobData { toBlock: number } -export const CeramicAnchorContractAddress = '0x231055a0852d67c7107ad0d0dfeab60278fe6adc'; \ No newline at end of file +export const CeramicAnchorContractAddress = '0x231055a0852d67c7107ad0d0dfeab60278fe6adc'; + +export const BlockConfirmations = 20; \ No newline at end of file diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 4bc44384..4b4bd8bf 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from "@nestjs/common"; import type { Provider } from '@ethersproject/providers' import { IJobQueue, Job, JobQueue } from "../subscriber/job-queue"; -import { CeramicAnchorContractAddress, ChainIdEnum, EthChainIdMappings, EthNetwork, InitialIndexingBlocks, SyncJobData } from "./constants"; +import { BlockConfirmations, CeramicAnchorContractAddress, ChainIdEnum, EthChainIdMappings, EthNetwork, InitialIndexingBlocks, SyncJobData } from "./constants"; import { InjectRepository } from "@nestjs/typeorm"; import { HistorySyncState, Network, Stream } from "src/entities/stream/stream.entity"; import { HistorySyncStateRepository, StreamRepository } from "src/entities/stream/stream.repository"; @@ -13,6 +13,7 @@ import { import { CID } from 'multiformats/cid'; import PQueue from 'p-queue'; import { sleep } from "./utils"; +import { S3SeverBizDbName } from "src/common/constants"; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() @@ -23,9 +24,9 @@ export default class HistorySyncService { private testnetProvider: Provider; private ipfs: any; - constructor(@InjectRepository(HistorySyncState, 'testnet') + constructor(@InjectRepository(HistorySyncState, S3SeverBizDbName) private readonly historySyncStateRepository: HistorySyncStateRepository, - @InjectRepository(Stream, 'testnet') + @InjectRepository(Stream, S3SeverBizDbName) private readonly streamRepository: StreamRepository,) { } @@ -67,12 +68,17 @@ export default class HistorySyncService { break; } const currentBlockNumber = historySyncState.getProcessedBlockNumber; - // TODO verify the history sync state, if the state exceed the max block number, then return; + // verify the history sync state, if the state exceed the max block number, then skip; + const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; + const confirmedBlock = await provider.getBlock(-BlockConfirmations); + if (confirmedBlock.number <= +currentBlockNumber){ + this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); + continue; + } try { // get block log data from the provider // and parse anchor proof root for ETH logs - const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; const logs = await provider.getLogs({ address: CeramicAnchorContractAddress, fromBlock: historySyncState.getProcessedBlockNumber, @@ -164,7 +170,7 @@ export default class HistorySyncService { if (!chainId.startsWith('eip155')) { throw new Error(`Unsupported chainId '${chainId}' - must be eip155 namespace`) } - + this.logger.log(`[${chainId}] Get ethereum provider`) const ethNetwork: EthNetwork = EthChainIdMappings[chainId] const endpoint = ethNetwork?.endpoint From 27d98c1615407842424a559a20691659e021ad06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 24 Oct 2023 16:47:58 +0800 Subject: [PATCH 024/127] update ESM to dynamic import --- .../src/stream/sync/history-sync.service.ts | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 4b4bd8bf..e5daa7ec 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -1,17 +1,12 @@ import { Injectable, Logger } from "@nestjs/common"; import type { Provider } from '@ethersproject/providers' -import { IJobQueue, Job, JobQueue } from "../subscriber/job-queue"; +import { IJobQueue, Job } from "../subscriber/job-queue"; import { BlockConfirmations, CeramicAnchorContractAddress, ChainIdEnum, EthChainIdMappings, EthNetwork, InitialIndexingBlocks, SyncJobData } from "./constants"; import { InjectRepository } from "@nestjs/typeorm"; import { HistorySyncState, Network, Stream } from "src/entities/stream/stream.entity"; import { HistorySyncStateRepository, StreamRepository } from "src/entities/stream/stream.repository"; import { StreamStoreData, createStreamStoreJob, getStreamStoreJob } from "../subscriber/store.worker"; -import * as providers from '@ethersproject/providers'; -import { - getCidFromAnchorEventLog, -} from '@ceramicnetwork/anchor-utils'; -import { CID } from 'multiformats/cid'; -import PQueue from 'p-queue'; + import { sleep } from "./utils"; import { S3SeverBizDbName } from "src/common/constants"; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @@ -34,8 +29,8 @@ export default class HistorySyncService { this.streamJobQueue = streamJobQueue; // init eth providers - this.mainnetProvider = this.getProvider(ChainIdEnum.MAINNET.toString()); - this.testnetProvider = this.getProvider(ChainIdEnum.GNOSIS.toString()); + this.mainnetProvider = await this.getProvider(ChainIdEnum.MAINNET.toString()); + this.testnetProvider = await this.getProvider(ChainIdEnum.GNOSIS.toString()); // init state table data await this.initStatetable(ChainIdEnum.MAINNET.toString()); @@ -87,6 +82,7 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); if (logs?.length > 0) { // anchor proof root is a CID + const {getCidFromAnchorEventLog} = await _importDynamic('@ceramicnetwork/anchor-utils'); const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); if (anchorProofRoots?.length > 0) { @@ -128,7 +124,7 @@ export default class HistorySyncService { } } - async getStreamIdsFromIpfs(cid: CID | string): Promise { + async getStreamIdsFromIpfs(cid: any): Promise { const metedataPath = '2' const resolution = this.ipfs.dag.resolve(cid, { timeout: 30000, @@ -165,7 +161,9 @@ export default class HistorySyncService { * @param chain - CAIP-2 Chain ID * @private */ - getProvider(chainId: string | null): providers.BaseProvider { + async getProvider(chainId: string | null) { + const providers = await _importDynamic('@ethersproject/providers'); + this.logger.log(`[${chainId}] Dynamic import of @ethersproject/providers ${JSON.stringify(providers)}`) if (!chainId.startsWith('eip155')) { throw new Error(`Unsupported chainId '${chainId}' - must be eip155 namespace`) From d1a43ae33f8362d5f0fa9f2703c6cb14e39e32dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Tue, 24 Oct 2023 17:40:49 +0800 Subject: [PATCH 025/127] fix bugs for fetching cid data from ipfs --- .../src/entities/stream/stream.entity.ts | 3 +- packages/server/src/main.ts | 46 +++++++++---------- .../src/stream/sync/history-sync.service.ts | 27 +++++------ 3 files changed, 37 insertions(+), 39 deletions(-) diff --git a/packages/server/src/entities/stream/stream.entity.ts b/packages/server/src/entities/stream/stream.entity.ts index eb222f85..a3a32fc9 100644 --- a/packages/server/src/entities/stream/stream.entity.ts +++ b/packages/server/src/entities/stream/stream.entity.ts @@ -4,6 +4,7 @@ import { CreateDateColumn, Entity, Index, + PrimaryColumn, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; @@ -236,7 +237,7 @@ export class Stream extends BaseEntity { @Entity({ name: 'history_sync_state' }) export class HistorySyncState extends BaseEntity { - @Column({ nullable: false }) + @PrimaryColumn() chain_id: string; @Column({ nullable: true }) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index f23f6ec0..7915b5f7 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -28,35 +28,35 @@ async function bootstrap() { // Sync and subscribe to ceramic. if (!process.env.DISABLE_P2P_SUB){ const ceramicSubscriberService = app.get(CeramicSubscriberService); - await ceramicSubscriberService.initJobQueue(); + // await ceramicSubscriberService.initJobQueue(); // Sync history data from ceramic. const historySyncService = app.get(HistorySyncService); - historySyncService.init(ceramicSubscriberService.jobQueue); + await historySyncService.init(ceramicSubscriberService.jobQueue); await historySyncService.startHistorySync(); - // Subsciber ceramic test network. - await ceramicSubscriberService.subCeramic( - Network.TESTNET, - [ - '/dns4/go-ipfs-ceramic-public-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmWiY3CbNawZjWnHXx3p3DXsg21pZYTj4CRY1iwMkhP8r3', - '/dns4/go-ipfs-ceramic-private-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmQotCKxiMWt935TyCBFTN23jaivxwrZ3uD58wNxeg5npi', - '/dns4/go-ipfs-ceramic-private-cas-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmbeBTzSccH8xYottaYeyVX8QsKyox1ExfRx7T1iBqRyCd', - ], - ['/ip4/127.0.0.1/tcp/20000/ws'], - '/ceramic/testnet-clay', - ); + // // Subsciber ceramic test network. + // await ceramicSubscriberService.subCeramic( + // Network.TESTNET, + // [ + // '/dns4/go-ipfs-ceramic-public-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmWiY3CbNawZjWnHXx3p3DXsg21pZYTj4CRY1iwMkhP8r3', + // '/dns4/go-ipfs-ceramic-private-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmQotCKxiMWt935TyCBFTN23jaivxwrZ3uD58wNxeg5npi', + // '/dns4/go-ipfs-ceramic-private-cas-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmbeBTzSccH8xYottaYeyVX8QsKyox1ExfRx7T1iBqRyCd', + // ], + // ['/ip4/127.0.0.1/tcp/20000/ws'], + // '/ceramic/testnet-clay', + // ); - // Subsciber ceramic main network. - await ceramicSubscriberService.subCeramic( - Network.MAINNET, - [ - '/dns4/go-ipfs-ceramic-private-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmXALVsXZwPWTUbsT8G6VVzzgTJaAWRUD7FWL5f7d5ubAL', - '/dns4/go-ipfs-ceramic-private-cas-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmUvEKXuorR7YksrVgA7yKGbfjWHuCRisw2cH9iqRVM9P8', - ], - ['/ip4/127.0.0.1/tcp/30000/ws'], - '/ceramic/mainnet', - ); + // // Subsciber ceramic main network. + // await ceramicSubscriberService.subCeramic( + // Network.MAINNET, + // [ + // '/dns4/go-ipfs-ceramic-private-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmXALVsXZwPWTUbsT8G6VVzzgTJaAWRUD7FWL5f7d5ubAL', + // '/dns4/go-ipfs-ceramic-private-cas-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmUvEKXuorR7YksrVgA7yKGbfjWHuCRisw2cH9iqRVM9P8', + // ], + // ['/ip4/127.0.0.1/tcp/30000/ws'], + // '/ceramic/mainnet', + // ); } } bootstrap(); diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index e5daa7ec..fdb8be92 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -57,7 +57,7 @@ export default class HistorySyncService { chain_id: chainId } }) - this.logger.log('Start history sync state:' + JSON.stringify(historySyncState) + 'for chain id:' + chainId); + this.logger.log('Start history sync state:' + JSON.stringify(historySyncState) + ' for chain id:' + chainId); if (historySyncState == null) { this.logger.error('History sync state is null, please check the history sync state table'); break; @@ -66,7 +66,7 @@ export default class HistorySyncService { // verify the history sync state, if the state exceed the max block number, then skip; const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; const confirmedBlock = await provider.getBlock(-BlockConfirmations); - if (confirmedBlock.number <= +currentBlockNumber){ + if (confirmedBlock.number <= +currentBlockNumber) { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } @@ -76,13 +76,13 @@ export default class HistorySyncService { // and parse anchor proof root for ETH logs const logs = await provider.getLogs({ address: CeramicAnchorContractAddress, - fromBlock: historySyncState.getProcessedBlockNumber, - toBlock: +historySyncState.getProcessedBlockNumber + 1, + fromBlock: +historySyncState.getProcessedBlockNumber, + toBlock: +historySyncState.getProcessedBlockNumber + 100, }); this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); if (logs?.length > 0) { // anchor proof root is a CID - const {getCidFromAnchorEventLog} = await _importDynamic('@ceramicnetwork/anchor-utils'); + const { getCidFromAnchorEventLog } = await _importDynamic('@ceramicnetwork/anchor-utils'); const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); if (anchorProofRoots?.length > 0) { @@ -113,7 +113,7 @@ export default class HistorySyncService { this.logger.error(`[${chainId}] Error: ${error.message}`); } // update state table data - historySyncState.setProcessedBlockNumber = currentBlockNumber + 1; + historySyncState.setProcessedBlockNumber = (+currentBlockNumber + 1).toString(); await this.historySyncStateRepository.update({ chain_id: chainId }, historySyncState); // sleep 10 seconds @@ -126,7 +126,7 @@ export default class HistorySyncService { async getStreamIdsFromIpfs(cid: any): Promise { const metedataPath = '2' - const resolution = this.ipfs.dag.resolve(cid, { + const resolution = await this.ipfs.dag.resolve(cid, { timeout: 30000, path: metedataPath, }); @@ -148,7 +148,7 @@ export default class HistorySyncService { } }) this.logger.log('Init history sync state data, the current data is:' + JSON.stringify(historySyncState)); - if (historySyncState == null) { + if (!historySyncState) { const newHistorySyncState = new HistorySyncState() newHistorySyncState.setChainId = chainId newHistorySyncState.setProcessedBlockNumber = InitialIndexingBlocks[chainId].toString(); @@ -161,26 +161,23 @@ export default class HistorySyncService { * @param chain - CAIP-2 Chain ID * @private */ - async getProvider(chainId: string | null) { - const providers = await _importDynamic('@ethersproject/providers'); - this.logger.log(`[${chainId}] Dynamic import of @ethersproject/providers ${JSON.stringify(providers)}`) - + async getProvider(chainId: string | null) { + const { StaticJsonRpcProvider, getDefaultProvider } = await _importDynamic('@ethersproject/providers'); if (!chainId.startsWith('eip155')) { throw new Error(`Unsupported chainId '${chainId}' - must be eip155 namespace`) } - this.logger.log(`[${chainId}] Get ethereum provider`) const ethNetwork: EthNetwork = EthChainIdMappings[chainId] const endpoint = ethNetwork?.endpoint let provider if (endpoint) { - provider = new providers.StaticJsonRpcProvider(endpoint) + provider = new StaticJsonRpcProvider(endpoint) } else { if (ethNetwork == null) { throw new Error(`No ethereum provider available for chainId ${chainId}`) } - provider = providers.getDefaultProvider(ethNetwork.network) + provider = getDefaultProvider(ethNetwork.network) } return provider } From be2994fe2d8888bde829d196a8fc75ada1b58800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 10:36:01 +0800 Subject: [PATCH 026/127] debug ipfs --- .../src/stream/sync/history-sync.service.ts | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index fdb8be92..bdf2f39a 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -9,6 +9,7 @@ import { StreamStoreData, createStreamStoreJob, getStreamStoreJob } from "../sub import { sleep } from "./utils"; import { S3SeverBizDbName } from "src/common/constants"; +import { timeout } from 'rxjs'; const _importDynamic = new Function('modulePath', 'return import(modulePath)'); @Injectable() @@ -45,7 +46,7 @@ export default class HistorySyncService { async startHistorySync() { // start history sync for each chain - await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + // await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); } @@ -70,21 +71,21 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } - + const blockDelta = 100; try { // get block log data from the provider // and parse anchor proof root for ETH logs const logs = await provider.getLogs({ address: CeramicAnchorContractAddress, fromBlock: +historySyncState.getProcessedBlockNumber, - toBlock: +historySyncState.getProcessedBlockNumber + 100, + toBlock: +historySyncState.getProcessedBlockNumber + blockDelta, }); - this.logger.log(`[${chainId}] Logs' length: ${logs?.length}`); + this.logger.log(`[${chainId}] Logs' length: ${logs?.length}, ${JSON.stringify(logs)}`); if (logs?.length > 0) { // anchor proof root is a CID const { getCidFromAnchorEventLog } = await _importDynamic('@ceramicnetwork/anchor-utils'); const anchorProofRoots = logs.map(log => getCidFromAnchorEventLog(log)) - this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}`); + this.logger.log(`[${chainId}] Anchor proof roots' length: ${anchorProofRoots?.length}, ${JSON.stringify(anchorProofRoots)}`); if (anchorProofRoots?.length > 0) { // parse stream id from anchor proof roots by ipfs const streamIdsFromBlockLogs: string[] = []; @@ -113,11 +114,11 @@ export default class HistorySyncService { this.logger.error(`[${chainId}] Error: ${error.message}`); } // update state table data - historySyncState.setProcessedBlockNumber = (+currentBlockNumber + 1).toString(); + historySyncState.setProcessedBlockNumber = (+currentBlockNumber + blockDelta).toString(); await this.historySyncStateRepository.update({ chain_id: chainId }, historySyncState); // sleep 10 seconds - await sleep(10000); + await sleep(1000); } catch (error) { this.logger.error(`[${chainId}] Error: ${error.message}`); } @@ -126,15 +127,17 @@ export default class HistorySyncService { async getStreamIdsFromIpfs(cid: any): Promise { const metedataPath = '2' + const timeoutMs = 3000; const resolution = await this.ipfs.dag.resolve(cid, { - timeout: 30000, + timeout: timeoutMs, path: metedataPath, }); + this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid const codec = await this.ipfs.codecs.getCodec(blockCid.code); const block = this.ipfs.block.get(blockCid, { - timeout: 30000, + timeout: timeoutMs, }); const metadata = codec.decode(block) return metadata?.streamIds; From fab30b80efc7d236f64065b4925c0485352fdd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:05:04 +0800 Subject: [PATCH 027/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index bdf2f39a..5e5e2358 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -130,7 +130,7 @@ export default class HistorySyncService { const timeoutMs = 3000; const resolution = await this.ipfs.dag.resolve(cid, { timeout: timeoutMs, - path: metedataPath, + // path: metedataPath, }); this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid From bfc8e49f6119f3ca3b3b54d725e07b5750dedf9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:10:21 +0800 Subject: [PATCH 028/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 5e5e2358..6a1279e2 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -134,8 +134,9 @@ export default class HistorySyncService { }); this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid - + this.logger.log(`[${cid}] Block CID: ${JSON.stringify(blockCid)}`); const codec = await this.ipfs.codecs.getCodec(blockCid.code); + this.logger.log(`[${cid}] Codec: ${JSON.stringify(codec)}`); const block = this.ipfs.block.get(blockCid, { timeout: timeoutMs, }); From cc34b9cd5d43cc17dfcdbbbd82336af6dcbec53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:17:04 +0800 Subject: [PATCH 029/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 6a1279e2..6edeeb94 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -130,14 +130,14 @@ export default class HistorySyncService { const timeoutMs = 3000; const resolution = await this.ipfs.dag.resolve(cid, { timeout: timeoutMs, - // path: metedataPath, + path: metedataPath, }); this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid this.logger.log(`[${cid}] Block CID: ${JSON.stringify(blockCid)}`); const codec = await this.ipfs.codecs.getCodec(blockCid.code); this.logger.log(`[${cid}] Codec: ${JSON.stringify(codec)}`); - const block = this.ipfs.block.get(blockCid, { + const block = await this.ipfs.block.get(blockCid, { timeout: timeoutMs, }); const metadata = codec.decode(block) From 5391ffa82ddf7c6b9629fb39a7cdd0867c01be6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:22:34 +0800 Subject: [PATCH 030/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 6edeeb94..cc2bd759 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -130,7 +130,7 @@ export default class HistorySyncService { const timeoutMs = 3000; const resolution = await this.ipfs.dag.resolve(cid, { timeout: timeoutMs, - path: metedataPath, + // path: metedataPath, }); this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid From f033c7f408ede50c47c29e9d3157fe9017367a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:50:52 +0800 Subject: [PATCH 031/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index cc2bd759..6aaf1e7f 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io', + url: 'https://4everland.io', }); } @@ -130,7 +130,7 @@ export default class HistorySyncService { const timeoutMs = 3000; const resolution = await this.ipfs.dag.resolve(cid, { timeout: timeoutMs, - // path: metedataPath, + path: metedataPath, }); this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); const blockCid = resolution.cid From eeec53a8ae61729168e9b79b6183904e9b8a4cd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:56:09 +0800 Subject: [PATCH 032/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 6aaf1e7f..35fc29ef 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://4everland.io', + url: 'https://cloudflare-ipfs.com/', }); } @@ -67,6 +67,7 @@ export default class HistorySyncService { // verify the history sync state, if the state exceed the max block number, then skip; const provider = chainId == ChainIdEnum.MAINNET.toString() ? this.mainnetProvider : this.testnetProvider; const confirmedBlock = await provider.getBlock(-BlockConfirmations); + this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number}, processed block number: ${currentBlockNumber}`); if (confirmedBlock.number <= +currentBlockNumber) { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; From f70b014f61a3cc7085a4b79eb348576e34d20766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 11:59:54 +0800 Subject: [PATCH 033/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 35fc29ef..98c65e9c 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://cloudflare-ipfs.com/', + url: 'https://gateway.ipfs.io/', }); } From eaf5e1ccdf062b5914e15ebf5f25829cf6191118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 13:48:26 +0800 Subject: [PATCH 034/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 98c65e9c..d180c910 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io/', + url: 'https://ipfs.io/', }); } @@ -141,7 +141,7 @@ export default class HistorySyncService { const block = await this.ipfs.block.get(blockCid, { timeout: timeoutMs, }); - const metadata = codec.decode(block) + const metadata = codec.decode(block); return metadata?.streamIds; } From ea005633e7498da6450f4119816f5a93847222c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 13:50:57 +0800 Subject: [PATCH 035/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index d180c910..9166a68f 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://ipfs.io/', + url: 'https://gateway.ipfs.io/', }); } From 1912150e45b5f0b11dd4ee07d5902bb8354990a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 13:55:05 +0800 Subject: [PATCH 036/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 9166a68f..c37dde2b 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io/', + url: 'https://gateway.ipfs.io', }); } @@ -72,7 +72,7 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } - const blockDelta = 100; + const blockDelta = 10; try { // get block log data from the provider // and parse anchor proof root for ETH logs From 8f5725bd5018131ca1b5df33afcd523c90582b7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:02:54 +0800 Subject: [PATCH 037/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index c37dde2b..8ec05f63 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -103,6 +103,7 @@ export default class HistorySyncService { // add stream id to queue const network = chainId == ChainIdEnum.MAINNET.toString() ? Network.MAINNET : Network.TESTNET; for await (const streamId of streamIdsFromBlockLogs) { + this.logger.log(`[${chainId}] network: ${network} Add stream id: ${streamId} to queue`); const job: Job = createStreamStoreJob(getStreamStoreJob(network), { network: network, streamId: streamId, From 5e3d97ba810678ea3b0a9b74619ba0a4d057a1b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:10:56 +0800 Subject: [PATCH 038/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 8ec05f63..e5195823 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,7 +40,7 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://gateway.ipfs.io', + url: 'https://4everland.io', }); } From 1424e5d9111c51df9c25e944f48cfc57a7dcfb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:15:31 +0800 Subject: [PATCH 039/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index e5195823..5c1b7302 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -40,14 +40,14 @@ export default class HistorySyncService { // init ipfs client const ipfsHttpClient = await _importDynamic('ipfs-http-client'); this.ipfs = await ipfsHttpClient.create({ - url: 'https://4everland.io', + url: 'https://gateway.ipfs.io', }); } async startHistorySync() { // start history sync for each chain - // await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); - await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); + await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + // await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); } async startHistorySyncForChain(chainId: string) { From 725dca029a071d51379a414b09e5c3d4dda764a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:27:07 +0800 Subject: [PATCH 040/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 5c1b7302..3c90801c 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -72,7 +72,7 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } - const blockDelta = 10; + const blockDelta = 100; try { // get block log data from the provider // and parse anchor proof root for ETH logs From 0671695d0af64fded86e9afca883b597c8cdff7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:39:31 +0800 Subject: [PATCH 041/127] debug ipfs --- .../src/stream/sync/history-sync.service.ts | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 3c90801c..41cbd16d 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -72,7 +72,7 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } - const blockDelta = 100; + const blockDelta = 100; try { // get block log data from the provider // and parse anchor proof root for ETH logs @@ -128,22 +128,35 @@ export default class HistorySyncService { } async getStreamIdsFromIpfs(cid: any): Promise { - const metedataPath = '2' - const timeoutMs = 3000; - const resolution = await this.ipfs.dag.resolve(cid, { - timeout: timeoutMs, - path: metedataPath, - }); - this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); - const blockCid = resolution.cid - this.logger.log(`[${cid}] Block CID: ${JSON.stringify(blockCid)}`); - const codec = await this.ipfs.codecs.getCodec(blockCid.code); - this.logger.log(`[${cid}] Codec: ${JSON.stringify(codec)}`); - const block = await this.ipfs.block.get(blockCid, { - timeout: timeoutMs, - }); - const metadata = codec.decode(block); - return metadata?.streamIds; + let retryTimes = 2; + let streamIds: string[] = []; + while (retryTimes > 0) { + try { + + const metedataPath = '2' + const timeoutMs = 30000; + const resolution = await this.ipfs.dag.resolve(cid, { + timeout: timeoutMs, + path: metedataPath, + }); + this.logger.log(`[${cid}] Block resolution: ${JSON.stringify(resolution)}`); + const blockCid = resolution.cid + this.logger.log(`[${cid}] Block CID: ${JSON.stringify(blockCid)}`); + const codec = await this.ipfs.codecs.getCodec(blockCid.code); + this.logger.log(`[${cid}] Codec: ${JSON.stringify(codec)}`); + const block = await this.ipfs.block.get(blockCid, { + timeout: timeoutMs, + }); + const metadata = codec.decode(block); + streamIds = metadata?.streamIds; + break; + } catch (error) { + retryTimes--; + this.logger.error(`[${cid}] Error: ${JSON.stringify(error)}`); + } + } + return streamIds; + } From 5d1b0952b17a9bc28d2dbf37abb9270a651ba4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:46:21 +0800 Subject: [PATCH 042/127] debug ipfs --- packages/server/src/stream/sync/history-sync.service.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 41cbd16d..5e710402 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -46,8 +46,8 @@ export default class HistorySyncService { async startHistorySync() { // start history sync for each chain - await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); - // await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); + // await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); } async startHistorySyncForChain(chainId: string) { @@ -132,7 +132,6 @@ export default class HistorySyncService { let streamIds: string[] = []; while (retryTimes > 0) { try { - const metedataPath = '2' const timeoutMs = 30000; const resolution = await this.ipfs.dag.resolve(cid, { @@ -152,7 +151,7 @@ export default class HistorySyncService { break; } catch (error) { retryTimes--; - this.logger.error(`[${cid}] Error: ${JSON.stringify(error)}`); + this.logger.error(`Fetching cid:[${cid}] Error: ${JSON.stringify(error)} from ipfs, retry times remain: ${retryTimes}`); } } return streamIds; From f56475048a56e622c16d5c364ad0d4796030ba87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 14:55:15 +0800 Subject: [PATCH 043/127] debug ipfs --- packages/server/src/main.ts | 42 ++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index 7915b5f7..e4c7b53f 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -35,28 +35,28 @@ async function bootstrap() { await historySyncService.init(ceramicSubscriberService.jobQueue); await historySyncService.startHistorySync(); - // // Subsciber ceramic test network. - // await ceramicSubscriberService.subCeramic( - // Network.TESTNET, - // [ - // '/dns4/go-ipfs-ceramic-public-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmWiY3CbNawZjWnHXx3p3DXsg21pZYTj4CRY1iwMkhP8r3', - // '/dns4/go-ipfs-ceramic-private-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmQotCKxiMWt935TyCBFTN23jaivxwrZ3uD58wNxeg5npi', - // '/dns4/go-ipfs-ceramic-private-cas-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmbeBTzSccH8xYottaYeyVX8QsKyox1ExfRx7T1iBqRyCd', - // ], - // ['/ip4/127.0.0.1/tcp/20000/ws'], - // '/ceramic/testnet-clay', - // ); + // Subsciber ceramic test network. + await ceramicSubscriberService.subCeramic( + Network.TESTNET, + [ + '/dns4/go-ipfs-ceramic-public-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmWiY3CbNawZjWnHXx3p3DXsg21pZYTj4CRY1iwMkhP8r3', + '/dns4/go-ipfs-ceramic-private-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmQotCKxiMWt935TyCBFTN23jaivxwrZ3uD58wNxeg5npi', + '/dns4/go-ipfs-ceramic-private-cas-clay-external.3boxlabs.com/tcp/4011/ws/p2p/QmbeBTzSccH8xYottaYeyVX8QsKyox1ExfRx7T1iBqRyCd', + ], + ['/ip4/127.0.0.1/tcp/20000/ws'], + '/ceramic/testnet-clay', + ); - // // Subsciber ceramic main network. - // await ceramicSubscriberService.subCeramic( - // Network.MAINNET, - // [ - // '/dns4/go-ipfs-ceramic-private-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmXALVsXZwPWTUbsT8G6VVzzgTJaAWRUD7FWL5f7d5ubAL', - // '/dns4/go-ipfs-ceramic-private-cas-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmUvEKXuorR7YksrVgA7yKGbfjWHuCRisw2cH9iqRVM9P8', - // ], - // ['/ip4/127.0.0.1/tcp/30000/ws'], - // '/ceramic/mainnet', - // ); + // Subsciber ceramic main network. + await ceramicSubscriberService.subCeramic( + Network.MAINNET, + [ + '/dns4/go-ipfs-ceramic-private-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmXALVsXZwPWTUbsT8G6VVzzgTJaAWRUD7FWL5f7d5ubAL', + '/dns4/go-ipfs-ceramic-private-cas-mainnet-external.3boxlabs.com/tcp/4011/ws/p2p/QmUvEKXuorR7YksrVgA7yKGbfjWHuCRisw2cH9iqRVM9P8', + ], + ['/ip4/127.0.0.1/tcp/30000/ws'], + '/ceramic/mainnet', + ); } } bootstrap(); From 665cce10f0d28141abc2311ac998672a39ab8cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 15:07:37 +0800 Subject: [PATCH 044/127] complete for history sync --- packages/server/src/main.ts | 2 +- packages/server/src/stream/sync/history-sync.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/main.ts b/packages/server/src/main.ts index e4c7b53f..136d32fa 100644 --- a/packages/server/src/main.ts +++ b/packages/server/src/main.ts @@ -28,7 +28,7 @@ async function bootstrap() { // Sync and subscribe to ceramic. if (!process.env.DISABLE_P2P_SUB){ const ceramicSubscriberService = app.get(CeramicSubscriberService); - // await ceramicSubscriberService.initJobQueue(); + await ceramicSubscriberService.initJobQueue(); // Sync history data from ceramic. const historySyncService = app.get(HistorySyncService); diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 5e710402..8ac05d23 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -46,7 +46,7 @@ export default class HistorySyncService { async startHistorySync() { // start history sync for each chain - // await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); } From 0bc1db1f0827faef1baf5c4cb0127840823ebc9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 15:16:35 +0800 Subject: [PATCH 045/127] complete for history sync --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 8ac05d23..3b281f46 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -72,7 +72,7 @@ export default class HistorySyncService { this.logger.log(`[${chainId}] Current confirmed block number: ${confirmedBlock.number} is not greater than processed block number: ${currentBlockNumber}, skip to sync`); continue; } - const blockDelta = 100; + const blockDelta = 1; try { // get block log data from the provider // and parse anchor proof root for ETH logs @@ -120,7 +120,7 @@ export default class HistorySyncService { await this.historySyncStateRepository.update({ chain_id: chainId }, historySyncState); // sleep 10 seconds - await sleep(1000); + await sleep(10000); } catch (error) { this.logger.error(`[${chainId}] Error: ${error.message}`); } From 58d39f854c7dab781c30a27899dbe21ed6761acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BA=91=E9=B9=A4?= Date: Wed, 25 Oct 2023 15:28:12 +0800 Subject: [PATCH 046/127] async history sync --- packages/server/src/stream/sync/history-sync.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/stream/sync/history-sync.service.ts b/packages/server/src/stream/sync/history-sync.service.ts index 3b281f46..374454b7 100644 --- a/packages/server/src/stream/sync/history-sync.service.ts +++ b/packages/server/src/stream/sync/history-sync.service.ts @@ -46,8 +46,8 @@ export default class HistorySyncService { async startHistorySync() { // start history sync for each chain - await this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); - await this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); + this.startHistorySyncForChain(ChainIdEnum.MAINNET.toString()); + this.startHistorySyncForChain(ChainIdEnum.GNOSIS.toString()); } async startHistorySyncForChain(chainId: string) { From 6add416e51a9ea6b0593cb333a32c221b1590580 Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 19 Dec 2023 17:42:30 +0800 Subject: [PATCH 047/127] add node deployment module --- packages/client/dashboard/package.json | 5 +- packages/client/dashboard/src/App.tsx | 63 +-- .../client/dashboard/src/api/ceramicNode.ts | 95 +++++ .../src/components/CreateCeramicNodeModal.tsx | 189 +++++++++ .../src/components/DeleteCeramicNodeModal.tsx | 181 ++++++++ .../src/components/Icons/NodeIcon.tsx | 17 + .../client/dashboard/src/components/Nav.tsx | 10 +- .../src/components/Selector/EnumSelect.tsx | 3 +- .../dashboard/src/components/Terminal.tsx | 167 ++++++++ .../client/dashboard/src/constants/index.ts | 11 + .../dashboard/src/container/CeramicNodes.tsx | 391 ++++++++++++++++++ .../dashboard/src/context/CeramicNodeCtx.tsx | 112 +++++ packages/client/dashboard/src/types.d.ts | 51 +++ packages/client/dashboard/yarn.lock | 61 ++- 14 files changed, 1322 insertions(+), 34 deletions(-) create mode 100644 packages/client/dashboard/src/api/ceramicNode.ts create mode 100644 packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx create mode 100644 packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx create mode 100644 packages/client/dashboard/src/components/Icons/NodeIcon.tsx create mode 100644 packages/client/dashboard/src/components/Terminal.tsx create mode 100644 packages/client/dashboard/src/container/CeramicNodes.tsx create mode 100644 packages/client/dashboard/src/context/CeramicNodeCtx.tsx diff --git a/packages/client/dashboard/package.json b/packages/client/dashboard/package.json index 9a39452f..40b75d60 100644 --- a/packages/client/dashboard/package.json +++ b/packages/client/dashboard/package.json @@ -46,10 +46,13 @@ "react-router-dom": "^6.11.2", "react-scripts": "5.0.1", "react-toastify": "^9.1.3", + "socket.io-client": "^4.7.2", "styled-components": "^5.3.11", "typescript": "^4.4.2", "use-url-search-params": "^2.5.1", - "web-vitals": "^2.1.0" + "web-vitals": "^2.1.0", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0" }, "scripts": { "start": "react-scripts start", diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 66598632..a2fde1f0 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -29,50 +29,55 @@ import { DappComposite, ModelStream } from './types' import { ToastContainer } from 'react-toastify' import 'react-toastify/dist/ReactToastify.min.css' import DappModelSdk from './container/DappModelSdk' +import CeramicNodes from './container/CeramicNodes' +import CeramicNodeProvider from './context/CeramicNodeCtx' dayjs.extend(relativeTime) -function Routers() { +function Routers () { return ( - }> + }> } /> - } /> - }> - } /> + } /> + }> + } /> + } /> }> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> - } /> + } /> ) } -export default function App() { +export default function App () { return ( - + + + ) } -function Layout() { +function Layout () { return (
@@ -80,7 +85,7 @@ function Layout() {
) } -function DappLayout() { +function DappLayout () { const { loadingDApps, setCurrAppId } = useAppCtx() const { appId } = useParams() @@ -105,16 +110,16 @@ function DappLayout() { if (!appId || loadingDApps) { return ( -
-
- +
+
+
) } return ( -
+
- - - - - - - - + + + + + + ) } diff --git a/packages/client/dashboard/src/components/Playground.tsx b/packages/client/dashboard/src/components/Playground.tsx index 950b1e39..2478863d 100644 --- a/packages/client/dashboard/src/components/Playground.tsx +++ b/packages/client/dashboard/src/components/Playground.tsx @@ -159,7 +159,7 @@ export default function PlaygroundGraphiQL( selectedDapp?.network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, - definition: definition as RuntimeCompositeDefinition, + definition: definition as unknown as RuntimeCompositeDefinition, }), [definition, selectedDapp?.network] ) diff --git a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx b/packages/client/dashboard/src/components/Selector/EnumSelect.tsx index 50832302..ee45677b 100644 --- a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx +++ b/packages/client/dashboard/src/components/Selector/EnumSelect.tsx @@ -1,6 +1,6 @@ import { Button, - Item, + ListBoxItem, Label, ListBox, Popover, @@ -86,7 +86,7 @@ export default function EnumSelector< - {(item) => {item.name}} + {(item) => {item.name}} @@ -167,7 +167,7 @@ const PopoverStyled = styled(Popover)<{ width: number }>` } ` -const ItemStyled = styled(Item)` +const ListBoxItemStyled = styled(ListBoxItem)` margin: 0px; padding: 15px 20px; border-radius: 6px; diff --git a/packages/client/dashboard/yarn.lock b/packages/client/dashboard/yarn.lock index 69565099..ebebdadc 100644 --- a/packages/client/dashboard/yarn.lock +++ b/packages/client/dashboard/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== -"@adraffy/ens-normalize@1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" - integrity sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ== +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== "@alloc/quick-lru@^5.2.0": version "5.2.0" @@ -1136,13 +1136,20 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.22.3" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.2": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.21.9", "@babel/template@^7.3.3": version "7.21.9" resolved "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" @@ -1182,82 +1189,25 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@ceramicnetwork/codecs@^1.1.0": - version "1.1.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/codecs/-/codecs-1.1.0.tgz#ab4ac5703f8afd18986a41ef6dd9c8cd68755749" - integrity sha512-wgzDpenoxxOObGYDMeEwLJ1htz0FfX8e5sJZTC6Qn9HC4EF9QZ6kGtayB3BRUNlXpQTkJPdSJAhe09/T9EOK5g== - dependencies: - "@ceramicnetwork/streamid" "^2.14.0" - codeco "^1.1.0" - multiformats "^11.0.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/codecs@^1.10.0": - version "1.10.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/codecs/-/codecs-1.10.0.tgz#9daccdca63b96cc48f9beea2e2aa43e1d9e6e346" - integrity sha512-0/5/NCjKax2UFbvnlQuRzZ+T7sp+HKgGsBsW/fKK06E/ui0MBVMSK1eitn/ozvMFUo+nCjKPQF3ixXVpdsQl4A== +"@ceramicnetwork/codecs@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/codecs/-/codecs-2.2.0.tgz#2c905bc2c0c03bbc71cd9fc62be5429c5c367de1" + integrity sha512-HRDdJN7G954F7KOZ117WxhYUC9pGoUyBc6cEr14MLhhxA9S2+bYYOKZ1VAaTFawF1FB6rQkHIT37IYPVo0tI0A== dependencies: - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/streamid" "^3.2.0" cartonne "^2.1.1" codeco "^1.1.0" dag-jose "^4.0.0" multiformats "^11.0.1" uint8arrays "^4.0.3" -"@ceramicnetwork/common@^2.24.0", "@ceramicnetwork/common@^2.25.0": - version "2.25.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/common/-/common-2.25.0.tgz#61e41afc5701175206a8ab0a2c967237fa3a25cc" - integrity sha512-KDdBkIRuK+5fShyUNdwTMi1EYWSVGOEkwnXCvyQp4TQESRgSyvLE8KQ47jJ6kGtPNhEkSlmrr/qRNgE63/JJYw== - dependencies: - "@ceramicnetwork/streamid" "^2.14.0" - "@didtools/cacao" "^2.0.0" - "@didtools/pkh-ethereum" "^0.1.0" - "@didtools/pkh-solana" "^0.1.0" - "@didtools/pkh-stacks" "^0.1.0" - "@didtools/pkh-tezos" "^0.2.1" - "@stablelib/random" "^1.0.1" - caip "~1.1.0" - cross-fetch "^3.1.4" - flat "^5.0.2" - it-first "^1.0.7" - jet-logger "1.2.2" - lodash.clonedeep "^4.5.0" - logfmt "^1.3.2" - multiformats "^11.0.1" - rxjs "^7.5.2" - uint8arrays "^4.0.3" - -"@ceramicnetwork/common@^2.26.0": - version "2.26.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/common/-/common-2.26.0.tgz#b0b6d10ec08b1cb40ff387e5ca143224914ff3c0" - integrity sha512-bNLQw6LJsyMcxA7vSY4uLVryWAIJCLAESaJfWtSJSLh0pJxC7Jrf9ESt7knvcoETSSD91klHaBCjf9NeW9mGXA== - dependencies: - "@ceramicnetwork/codecs" "^1.1.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@didtools/cacao" "^2.0.0" - "@didtools/pkh-ethereum" "^0.1.0" - "@didtools/pkh-solana" "^0.1.0" - "@didtools/pkh-stacks" "^0.1.0" - "@didtools/pkh-tezos" "^0.2.1" - "@stablelib/random" "^1.0.1" - caip "~1.1.0" - cross-fetch "^3.1.4" - flat "^5.0.2" - it-first "^1.0.7" - jet-logger "1.2.2" - lodash.clonedeep "^4.5.0" - logfmt "^1.3.2" - multiformats "^11.0.1" - rxjs "^7.5.2" - uint8arrays "^4.0.3" - -"@ceramicnetwork/common@^2.33.0", "@ceramicnetwork/common@^2.35.0": - version "2.35.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/common/-/common-2.35.0.tgz#270e4776fa1b120bbc5910ef40c62522c571159c" - integrity sha512-1TsdVYAjTIVTBz+6dlrEJACFGqMzYZeOvwLNbpk9E5vMh6fnrgRm8q9JPeGhDyGwdGlY7l4e1yqzWAoZGnJARQ== +"@ceramicnetwork/common@^3.0.5", "@ceramicnetwork/common@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/common/-/common-3.2.0.tgz#06a6fa9ac764e3138c32ceadc731b90448fde62c" + integrity sha512-3ql9LN/AXO2VxosnNzTeaMo+JRQpCclwFhyfWrpH0okLdiB1CeDDOkiKNOvz+6ZtYql1NpIby1/Ag5ovtxgQjg== dependencies: - "@ceramicnetwork/codecs" "^1.10.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/codecs" "^2.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@didtools/cacao" "^2.1.0" "@didtools/pkh-ethereum" "^0.1.0" "@didtools/pkh-solana" "^0.1.0" @@ -1265,7 +1215,6 @@ "@didtools/pkh-tezos" "^0.2.1" "@stablelib/random" "^1.0.1" caip "~1.1.0" - cross-fetch "^3.1.4" flat "^5.0.2" it-first "^1.0.7" jet-logger "1.2.2" @@ -1275,107 +1224,53 @@ rxjs "^7.5.2" uint8arrays "^4.0.3" -"@ceramicnetwork/http-client@2.21.0": - version "2.21.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-2.21.0.tgz#a234d819faca54788dbe1b1b9213658d4d52f522" - integrity sha512-endVa4X3M727VcDVK11z52yxK9Okcdk7/t6gRqNS8kG9EIlhjwZV82WOi0LoiaxayF496F9xy8bAATbqnXXrgA== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/stream-caip10-link" "^2.19.0" - "@ceramicnetwork/stream-model" "^1.6.0" - "@ceramicnetwork/stream-model-instance" "^1.6.0" - "@ceramicnetwork/stream-tile" "^2.20.0" - "@ceramicnetwork/streamid" "^2.14.0" - query-string "^7.1.0" - rxjs "^7.5.2" - -"@ceramicnetwork/http-client@^2.21.0", "@ceramicnetwork/http-client@^2.22.0": - version "2.22.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-2.22.0.tgz#a9c3c1c3eb735f33bd970b7fb51b158784e001b8" - integrity sha512-H5v6WZ67Oik6TNDXc/Blaht0t8AeeUHQG8YPkTp1dh0qBxI6c6KOWx0+1QmxxvO/OQH2ny6esOmxBFOtWk7mBQ== - dependencies: - "@ceramicnetwork/common" "^2.25.0" - "@ceramicnetwork/stream-caip10-link" "^2.20.0" - "@ceramicnetwork/stream-model" "^1.7.0" - "@ceramicnetwork/stream-model-instance" "^1.7.0" - "@ceramicnetwork/stream-tile" "^2.21.0" - "@ceramicnetwork/streamid" "^2.14.0" +"@ceramicnetwork/http-client@^3.0.5", "@ceramicnetwork/http-client@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-3.2.0.tgz#1891b57b85146ed8f4d5c96a75047a94f7a5aa38" + integrity sha512-HC0tw9cL7/Q0qstOSc3pm9uAQ6pPx9Y/0dsmO+lZRxPMW9gQqOqY1Oa7Wi3PIvyiJaimwnM+G1SFM6GWQ676Lg== + dependencies: + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/stream-caip10-link" "^3.2.0" + "@ceramicnetwork/stream-model" "^2.2.0" + "@ceramicnetwork/stream-model-instance" "^2.2.0" + "@ceramicnetwork/stream-tile" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" + "@scarf/scarf" "^1.1.1" query-string "^7.1.0" rxjs "^7.5.2" -"@ceramicnetwork/stream-caip10-link@^2.19.0", "@ceramicnetwork/stream-caip10-link@^2.20.0": - version "2.20.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-2.20.0.tgz#acc56f12c4ef41a1566771d950eec73e31bbf97a" - integrity sha512-Iq74exdK9JMowOGwZsWoLwfmjM05aGV8GMwuE9Ne/cNinrsH+YsXNCXaDSjU9ypHNWyAtr8nS6nwM3Mt/OjLUA== +"@ceramicnetwork/stream-caip10-link@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-3.2.0.tgz#0b44e6f10ab1cdb6ef56eb7371ec5c2fcf61cf08" + integrity sha512-36/7JWVm9Qn48/ezIRGJy7lAP4IZ2yGucAYXd/Ssq2RDLdGC7xTlva8csYQd/8b4nUu6UZqhqdRGEbBhGRN2Cw== dependencies: - "@ceramicnetwork/common" "^2.25.0" - "@ceramicnetwork/streamid" "^2.14.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" caip "~1.1.0" did-resolver "^4.0.1" lodash.clonedeep "^4.5.0" -"@ceramicnetwork/stream-model-instance@1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.6.0.tgz#1f9546b827e23f2008f7968ffb9a2b7c31bdad24" - integrity sha512-qa7EUFV+/eZTiCyT0AvpNyvFMNbzH4sbXAJUsSKJ2YxXy3fo3X5QEVx51pKnVnc6JomNBz6S/pQj0kOR8o+hqA== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - object-sizeof "^2.6.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model-instance@^1.17.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.17.0.tgz#2bb245e49ce9d8f9fc70171a3c8e49707294c488" - integrity sha512-cVHlz7ScpLYgz11Wzw5x99dh4BbThoKsJi9rFS2RF+p0BNuyp2QgSnpCjziEQqCz6djJngy6g2BCwf4b+MML5g== - dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - object-sizeof "^2.6.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model-instance@^1.6.0", "@ceramicnetwork/stream-model-instance@^1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.7.0.tgz#ec3eb64bf5530248aa5a7d05c0fafe13acb5fc1f" - integrity sha512-xKT6jXPhdKyYRHQx79jOjbo5U9MABypquMP9jqODLvxfHMQ1gXaDamj2KI6WntKBrE4na084euvAvkqQBZS9WA== +"@ceramicnetwork/stream-model-instance@^2.0.5", "@ceramicnetwork/stream-model-instance@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-2.2.0.tgz#d2cd30e1ee68040e4f32ce57af6e99c01e614876" + integrity sha512-sLQjGpQc2V9Mh3BFsJvioKsRy8eyFrufxG7u2WNjSkRdWOrqMBLSuyEy2U5whT92nIe8DcKlD8eGW2rmY7OOCQ== dependencies: - "@ceramicnetwork/common" "^2.25.0" - "@ceramicnetwork/streamid" "^2.14.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" fast-json-patch "^3.1.0" object-sizeof "^2.6.1" uint8arrays "^4.0.3" -"@ceramicnetwork/stream-model@1.6.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model/-/stream-model-1.6.0.tgz#f89cd9b89d6720a7cf6908f7e34d9580bd3e278c" - integrity sha512-rdX2bZmYLbpjQexLWBOGe37jg+5FV+1/GlwAleZjgBS6zc0mzWpwn901FmuXB+P6Lan2fQ1py5EOICoVYklqnA== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - json-schema-typed "^8.0.1" - multiformats "^11.0.1" - multihashes "^4.0.3" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model@^1.15.0", "@ceramicnetwork/stream-model@^1.17.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-model/-/stream-model-1.17.0.tgz#af1a9775d2264e4021576b5e6c9b69a2ceca3f53" - integrity sha512-d6HhiPAQfyw0a1wN32kWR/YdGdLd6DdOfhn3pDU8vHKH731l5uHIIOMwwp+XEcbFTSGQdPbxAbcdTM4AFJG3MA== +"@ceramicnetwork/stream-model@^2.0.5", "@ceramicnetwork/stream-model@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model/-/stream-model-2.2.0.tgz#cb6182035b2ed4f8bccecd3d2687f4c2d472d7f9" + integrity sha512-O+xmtMJ3dFOqxkoaDVKZAH8Z+4AqYyDdSgoB97JNpXHILM2a13NMJyvVVtZzVedywj6jAkdOxC80JYOscQtiew== dependencies: - "@ceramicnetwork/codecs" "^1.10.0" - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/codecs" "^2.2.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" ajv "^8.8.2" @@ -1386,27 +1281,13 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" -"@ceramicnetwork/stream-model@^1.6.0", "@ceramicnetwork/stream-model@^1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model/-/stream-model-1.7.0.tgz#dee7db445df39e7c38f295b2d6533c879f98ba87" - integrity sha512-gokyM277POIzxghcX5ifJio7IQp7e0dz0a7BkmK98YB1NvSuNKJrFzoRNmTDODG07XzZmLaxHU8yLOBxjoiTkQ== - dependencies: - "@ceramicnetwork/common" "^2.25.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - json-schema-typed "^8.0.1" - multiformats "^11.0.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-tile@^2.16.0", "@ceramicnetwork/stream-tile@^2.20.0", "@ceramicnetwork/stream-tile@^2.21.0": - version "2.21.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-2.21.0.tgz#68286b1868866ca474acb0444f0539c18828ea03" - integrity sha512-GDfSr5aRH0PoUH+Phz/tXV1RQZJpN/9eOSxSYtzPi6bqW/My3EVnkCxKh1bYmYT/sbe/7w6Zaj62JlSB2lNFtQ== +"@ceramicnetwork/stream-tile@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-3.2.0.tgz#c294d02b321088f5c0a3fe46fd2645e36db62194" + integrity sha512-QW0FS2OHmxK/Gs4GcFGgAZY4gtnSBBE2jUWNAMoXne8T0CjbQforUFUXC5KD4ojGMBsqm+w8vBurSk9ihcT2/w== dependencies: - "@ceramicnetwork/common" "^2.25.0" - "@ceramicnetwork/streamid" "^2.14.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" dids "^4.0.0" @@ -1414,34 +1295,23 @@ lodash.clonedeep "^4.5.0" uint8arrays "^4.0.3" -"@ceramicnetwork/streamid@2.14.0", "@ceramicnetwork/streamid@^2.14.0": - version "2.14.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-2.14.0.tgz#ba5c34da90d30f25a517d3265cc9f600ad08bff9" - integrity sha512-Pv28GZA77Zth+aC65NJeimrH4pIl91SKMCBAkOHORk/UCH++HTTItAjhu/RqMCsGpfnsIvZAXwsGqNH7dfJz1A== - dependencies: - "@ipld/dag-cbor" "^7.0.0" - mapmoize "^1.2.1" - multiformats "^11.0.1" - uint8arrays "^4.0.3" - varint "^6.0.0" - -"@ceramicnetwork/streamid@^2.17.0": - version "2.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/streamid/-/streamid-2.17.0.tgz#4c4fed37762af52abc04765971dbe07fbfb1656c" - integrity sha512-LC6YL8dcN2XqOdPEDKqWAloyJNXBIyw30JAm4gvWLsUuOaL8hTJWpu2HndFp/Jn4Mab9090/fwVZ2O8CWno58w== +"@ceramicnetwork/streamid@^3.0.5", "@ceramicnetwork/streamid@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-3.2.0.tgz#d3ce24348b26b3a2b8e7e29f65540dbe6a2558a6" + integrity sha512-o1nlXcSosbl2pcA3vkdZyiwdwDC7J8O+u/mGdBysJ6brQvQcbB9W9QYE6OgB5p+dxXdY9u5zwATURIEw5Ify3w== dependencies: "@ipld/dag-cbor" "^7.0.0" "@stablelib/sha256" "^1.0.1" cborg "^1.10.2" mapmoize "^1.2.1" multiformats "^11.0.1" - uint8arrays "^4.0.3" + uint8arrays "^4.0.9" varint "^6.0.0" "@coinbase/wallet-sdk@^3.6.6": - version "3.6.6" - resolved "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.6.6.tgz#4a0758fe0fe0ba3ed7e33b5bb6eb094ff8bd6c98" - integrity sha512-vX+epj/Ttjo7XRwlr3TFUUfW5GTRMvORpERPwiu7z2jl3DSVL4rXLmHt5y6LDPlUVreas2gumdcFbu0fLRG9Jg== + version "3.7.2" + resolved "https://registry.npmjs.org/@coinbase/wallet-sdk/-/wallet-sdk-3.7.2.tgz#7a89bd9e3a06a1f26d4480d8642af33fb0c7e3aa" + integrity sha512-lIGvXMsgpsQWci/XOMQIJ2nIZ8JUy/L+bvC0wkRaYarr0YylwpXrJ2gRM3hCXPS477pkyO7N/kSiAoRgEXUdJQ== dependencies: "@metamask/safe-event-emitter" "2.0.0" "@solana/web3.js" "^1.70.1" @@ -1461,123 +1331,83 @@ stream-browserify "^3.0.0" util "^0.12.4" -"@composedb/client@^0.4.3": - version "0.4.4" - resolved "https://registry.npmjs.org/@composedb/client/-/client-0.4.4.tgz#e001d508593d024435a2a9a04c1daaa970d24448" - integrity sha512-vJPHwv42RLBWm/TJyWmeAzxF0o2ureQ+0ndJuOrtRYmiHpxFZ9DKAFxymKMdPIiKJOBU4/KmjzwYg7JS2l+yTQ== - dependencies: - "@ceramicnetwork/http-client" "^2.21.0" - "@ceramicnetwork/stream-model-instance" "^1.6.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/constants" "^0.4.0" - "@composedb/graphql-scalars" "^0.4.4" - "@composedb/runtime" "^0.4.2" - "@graphql-tools/batch-execute" "^8.5.19" - "@graphql-tools/stitch" "^8.7.48" - "@graphql-tools/utils" "^9.2.1" +"@composedb/client@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/client/-/client-0.6.0.tgz#25f7b2057962d49ab852effdc68ce671e4eda1e1" + integrity sha512-vqA7gMxdUq9UATM4bgvFx5Wk2BFYoc/rmCceM9KqCaY3yHohtOPxlty1L6/Fl1Md98hmgQkY45lvHiD4ajA1Kg== + dependencies: + "@ceramicnetwork/http-client" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" + "@composedb/constants" "^0.6.0" + "@composedb/graphql-scalars" "^0.6.0" + "@composedb/runtime" "^0.6.0" + "@graphql-tools/batch-execute" "^9.0.2" + "@graphql-tools/stitch" "^9.0.3" + "@graphql-tools/utils" "^10.0.11" dataloader "^2.2.2" - graphql "^16.5.0" + graphql "^16.8.1" graphql-relay "^0.10.0" -"@composedb/constants@^0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@composedb/constants/-/constants-0.4.0.tgz#67749c629580e7fb0271401a06e949ed979b6f9f" - integrity sha512-juphxE0LPqzOh9Yojw6JrkvV3UI1RIhiI11MUHfsxC4m6KP8uxq0or1xKP7jQPNHGhqgtOomMezCXFUTcPVotQ== +"@composedb/constants@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/constants/-/constants-0.6.0.tgz#e853265328524b0c103757b8913986565e356417" + integrity sha512-18rysTgKUTgapwaDEJOI063WSWlwbvowEnRZkFrZpciHPHjgfdry9XTht4ygYkGzx9TE+zGsVmgJfF0LlbTFMg== -"@composedb/devtools@0.5.0": - version "0.5.0" - resolved "https://registry.npmmirror.com/@composedb/devtools/-/devtools-0.5.0.tgz#7f651bc8f340664a49385bf5f853d37ab81d5e61" - integrity sha512-tZZOK82B2WZQRW1LQKmKI0Mmpl9z8G1nMmWLcR0vDRiVumL6o0jHkD9lBC3mQ990j4CRUgYsH2HIOrzNnYNyOg== +"@composedb/devtools@0.6.1", "@composedb/devtools@^0.6.1": + version "0.6.1" + resolved "https://registry.npmjs.org/@composedb/devtools/-/devtools-0.6.1.tgz#752ffd103abb7600578924cf6e03ed184a8b94f8" + integrity sha512-584a6Zg4AYWhGhyhvq6Ac/YdHpgHTqRf9HgtS5IglJDyVV2DGKvVAXg4bYv7hGa6zrppelHOlNQ99U3ICizPXw== dependencies: - "@ceramicnetwork/common" "^2.33.0" - "@ceramicnetwork/stream-model" "^1.15.0" - "@ceramicnetwork/streamid" "^2.17.0" - "@composedb/graphql-scalars" "^0.5.0" + "@ceramicnetwork/common" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/graphql-scalars" "^0.6.0" "@didtools/cacao" "^2.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.5" - change-case "^4.1.2" + "@graphql-tools/schema" "^10.0.2" + "@graphql-tools/utils" "^10.0.11" + change-case "^5.3.0" json-ptr "^3.1.1" lodash-es "^4.17.21" - multiformats "^12.1.0" - object-hash "^3.0.0" - type-fest "^4.3.1" - uint8arrays "^4.0.6" - -"@composedb/devtools@^0.4.3": - version "0.4.4" - resolved "https://registry.npmmirror.com/@composedb/devtools/-/devtools-0.4.4.tgz#c506827e26789d6b73e16b2b75f2827415cead15" - integrity sha512-ACfTIrTDRH/A4vZU66k+jnVmVqTvQn7vThSjoDOMdqwI4BMp3BAGoNHRJJv60AXAMrC0qDvhr/td2VcNOcwKqQ== - dependencies: - "@ceramicnetwork/stream-model" "^1.6.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/graphql-scalars" "^0.4.4" - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" - change-case "^4.1.2" - json-ptr "^3.1.1" - lodash-es "^4.17.21" - multiformats "^11.0.2" + multiformats "^12.1.3" object-hash "^3.0.0" - type-fest "^3.8.0" - uint8arrays "^4.0.3" - -"@composedb/graphql-scalars@^0.4.4": - version "0.4.4" - resolved "https://registry.npmjs.org/@composedb/graphql-scalars/-/graphql-scalars-0.4.4.tgz#4195ade433cc6523746d58bcbf213de0b3ba66af" - integrity sha512-fiFmf2wAuoSYXhSeTpFjHmMNdH/mwP5UVe96sMetsQ4jAfLDNNVw1/W3JxmWBsowtQRM/+x147ecONvs3TdVZw== - dependencies: - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/types" "^0.4.4" - caip "^1.1.0" - graphql "^16.5.0" - graphql-scalars "^1.21.3" - multiformats "^11.0.2" + type-fest "^4.8.3" + uint8arrays "^4.0.9" -"@composedb/graphql-scalars@^0.5.0": - version "0.5.1" - resolved "https://registry.npmmirror.com/@composedb/graphql-scalars/-/graphql-scalars-0.5.1.tgz#4e88b369db09dbc1ee041466efeb127a2b80dfc6" - integrity sha512-/TRjRqUMOqomt662ghgQRp0CzcPZVHHwnyEY8gVXwJiCH6xddxSFY0Jdfam8H8J4JUxP8o7rcm3COs5k0GpY5Q== +"@composedb/graphql-scalars@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/graphql-scalars/-/graphql-scalars-0.6.0.tgz#54e6437914d3356f2f5286bda9c0dbe8cc7a6adc" + integrity sha512-9GssARG72pXb2SEYK6Zozz92tl37WnI9fCgKiTKBIjisoUGpUnTv2sRNRJV8X9j4CgawvCm4Yb/SH+CtUXuZew== dependencies: - "@ceramicnetwork/streamid" "^2.17.0" - "@composedb/types" "^0.5.1" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/types" "^0.6.0" caip "^1.1.0" graphql "^16.8.1" - graphql-scalars "^1.22.2" - multiformats "^12.1.1" - -"@composedb/runtime@^0.4.2": - version "0.4.2" - resolved "https://registry.npmjs.org/@composedb/runtime/-/runtime-0.4.2.tgz#0124bc90f1734f5aeb9547c8f4ae17ac43f75f15" - integrity sha512-0x9t/ESEQ5ZkqkOoP5glgQTrj+jOZHTuKnHCPfn6uUTEGpeByqWTDZqRnSVXPe0rHt/rl3MxsDyFEG6sJDpAww== - dependencies: - "@ceramicnetwork/http-client" "2.21.0" - "@ceramicnetwork/stream-model" "1.6.0" - "@ceramicnetwork/stream-model-instance" "1.6.0" - "@ceramicnetwork/streamid" "2.14.0" - "@composedb/graphql-scalars" "^0.4.4" + graphql-scalars "^1.22.4" + multiformats "^12.1.3" + +"@composedb/runtime@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/runtime/-/runtime-0.6.0.tgz#a7b0816500e3696cac18dcb6208ac52a48c20f3f" + integrity sha512-HZRFa7KVqEPAQY9umPzpdRoblHIn/QVk/55T5TPLv6VTEDmUmw0W3Nv+vNH7kvq++SdIuikbRPSW7eci9wUTCw== + dependencies: + "@ceramicnetwork/http-client" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/graphql-scalars" "^0.6.0" dataloader "^2.2.2" - graphql "^16.5.0" + graphql "^16.8.1" graphql-relay "^0.10.0" -"@composedb/types@^0.4.3", "@composedb/types@^0.4.4": - version "0.4.4" - resolved "https://registry.npmjs.org/@composedb/types/-/types-0.4.4.tgz#d6564453767cb64360688025662e377b29b55153" - integrity sha512-XNqbTullzkogZAI/9S6AI9tlA23LrB6NYu50m4sLH+M5UIv8cuI6ngRpgarV5tVS6MvB5XuyAQf8o+1lXVr7YQ== - dependencies: - "@ceramicnetwork/stream-model" "^1.6.0" - "@ceramicnetwork/stream-model-instance" "^1.6.0" - dids "^4.0.0" - json-schema-typed "^8.0.1" - -"@composedb/types@^0.5.1": - version "0.5.1" - resolved "https://registry.npmmirror.com/@composedb/types/-/types-0.5.1.tgz#beacf5614879a0d65a15791f2378d3241ce197b6" - integrity sha512-xgFwR+10Un+iQVj8Kl9n1w1hqMp8r1yIDSacZ/o5x4Yz0kWuHLPvLKUYdK0gP5dMiJPAhWAxvXVSbfkY+OmnmQ== +"@composedb/types@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/types/-/types-0.6.0.tgz#21eaf27fbc1c877a6a96440cef4056d275d282b5" + integrity sha512-Bpt85C/bIByqFx87OC14DBGfXCV7tj9IsZ5AQ0fv53bGATs+otEj+tnz5UxDRcSSuT9iLOLa8XLLKiEKkwmecQ== dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/stream-model" "^1.17.0" - "@ceramicnetwork/stream-model-instance" "^1.17.0" + "@ceramicnetwork/common" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" dids "^4.0.4" json-schema-typed "^8.0.1" @@ -1724,6 +1554,16 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" +"@didtools/key-webcrypto@^0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@didtools/key-webcrypto/-/key-webcrypto-0.1.2.tgz#8a9da10367ace17c1616a297577b40137c15f97e" + integrity sha512-ZDlwl2TnITDA6R/FpZVh3YbgRIIaJ9rCzA49wUd/EYlK0CGD8d6HQSB9hMdX0ht+paRE+9AD/YNewkppktEUKQ== + dependencies: + fast-json-stable-stringify "^2.1.0" + rpc-utils "^0.6.2" + uint8arrays "^4.0.9" + varint "^6.0.0" + "@didtools/pkh-ethereum@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@didtools/pkh-ethereum/-/pkh-ethereum-0.1.0.tgz#fc55d341ca043cf959651e603cc2eafde8ebf1fc" @@ -1734,16 +1574,6 @@ "@stablelib/random" "^1.0.2" caip "^1.1.0" -"@didtools/pkh-ethereum@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@didtools/pkh-ethereum/-/pkh-ethereum-0.2.1.tgz#8c03a56f34c824fa83db6161362f7fa45dd2b5e9" - integrity sha512-apQefbOqqy8HQMDNVG0ITxHLr9I5iZrjADX+mPB+ie1ue8MO8pOHMifLQ3j0R6RjS2einCd+hEZ4Ib4AKs3Xlw== - dependencies: - "@didtools/cacao" "^2.0.0" - "@ethersproject/wallet" "^5.7.0" - "@stablelib/random" "^1.0.2" - caip "^1.1.0" - "@didtools/pkh-ethereum@^0.3.0": version "0.3.0" resolved "https://registry.npmjs.org/@didtools/pkh-ethereum/-/pkh-ethereum-0.3.0.tgz#59e445d99941defa42bafe9ae1076439ba889e0e" @@ -1766,7 +1596,7 @@ "@stablelib/random" "^1.0.2" caip "^1.1.0" -"@didtools/pkh-solana@^0.1.0": +"@didtools/pkh-solana@^0.1.0", "@didtools/pkh-solana@^0.1.1": version "0.1.1" resolved "https://registry.npmjs.org/@didtools/pkh-solana/-/pkh-solana-0.1.1.tgz#e325682b71cada03bb29cf6ecaa921f183c17a7b" integrity sha512-2Sn4xSg8otqAeXA0tDYUM+3KQtzOr2gBcu0wbJyOn/30Ocj3jxHFQg7NfumEsiQtQ0HtnmsGZUrnCgoxHqLwWg== @@ -1911,7 +1741,7 @@ resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/unitless@^0.8.1": +"@emotion/unitless@^0.8.0", "@emotion/unitless@^0.8.1": version "0.8.1" resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== @@ -1963,22 +1793,7 @@ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -1991,7 +1806,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -2002,7 +1817,7 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -2013,14 +1828,14 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -2028,7 +1843,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -2037,37 +1852,21 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -2082,7 +1881,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -2100,7 +1899,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": +"@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -2119,7 +1918,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -2127,19 +1926,19 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -2147,40 +1946,14 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -2188,7 +1961,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -2196,7 +1969,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -2205,7 +1978,7 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -2217,19 +1990,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -2238,7 +1999,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -2253,16 +2014,7 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": +"@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -2283,7 +2035,7 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -2294,7 +2046,7 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -2380,18 +2132,18 @@ "@n1ru4l/push-pull-async-iterable-iterator" "^3.1.0" meros "^1.1.4" -"@graphql-tools/batch-delegate@^8.4.27": - version "8.4.27" - resolved "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-8.4.27.tgz#af6fd26ba02ef03b6a3c63a106b47175188bbd97" - integrity sha512-efgDDJhljma9d3Ky/LswIu1xm/if2oS27XA1sOcxcShW+Ze+Qxi0hZZ6iyI4eQxVDX5Lyy/n+NvQEZAK1riqnQ== +"@graphql-tools/batch-delegate@^9.0.0": + version "9.0.0" + resolved "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-9.0.0.tgz#dd9e87466f450bae61a20525a2a8d8b0d257df37" + integrity sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw== dependencies: - "@graphql-tools/delegate" "^9.0.35" - "@graphql-tools/utils" "^9.2.1" + "@graphql-tools/delegate" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" dataloader "2.2.2" tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/batch-execute@^8.5.19", "@graphql-tools/batch-execute@^8.5.22": +"@graphql-tools/batch-execute@^8.5.22": version "8.5.22" resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.22.tgz#a742aa9d138fe794e786d8fb6429665dc7df5455" integrity sha512-hcV1JaY6NJQFQEwCKrYhpfLK8frSXDbtNMoTur98u10Cmecy1zrqNKSqhEyGetpgHxaJRqszGzKeI3RuroDN6A== @@ -2401,7 +2153,29 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/delegate@^9.0.31", "@graphql-tools/delegate@^9.0.35": +"@graphql-tools/batch-execute@^9.0.1", "@graphql-tools/batch-execute@^9.0.2": + version "9.0.2" + resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz#5ac3257501e7941fad40661bb5e1110d6312f58b" + integrity sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ== + dependencies: + "@graphql-tools/utils" "^10.0.5" + dataloader "^2.2.2" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/delegate@^10.0.0", "@graphql-tools/delegate@^10.0.1", "@graphql-tools/delegate@^10.0.3": + version "10.0.3" + resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz#2d0e133da94ca92c24e0c7360414e5592321cf2d" + integrity sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw== + dependencies: + "@graphql-tools/batch-execute" "^9.0.1" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.5" + dataloader "^2.2.2" + tslib "^2.5.0" + +"@graphql-tools/delegate@^9.0.31": version "9.0.35" resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.35.tgz#94683f4bcec63520b4a6c8b2abf2e2e9324ea4f1" integrity sha512-jwPu8NJbzRRMqi4Vp/5QX1vIUeUPpWmlQpOkXQD2r1X45YsVceyUUBnktCrlJlDB4jPRVy7JQGwmYo3KFiOBMA== @@ -2463,6 +2237,17 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/executor@^1.0.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz#6c45f4add765769d9820c4c4405b76957ba39c79" + integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== + dependencies: + "@graphql-tools/utils" "^10.0.0" + "@graphql-typed-document-node/core" "3.2.0" + "@repeaterjs/repeater" "^3.0.4" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/graphql-file-loader@^7.3.7": version "7.5.17" resolved "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-7.5.17.tgz#7c281617ea3ab4db4d42a2bdb49850f2b937f0f9" @@ -2503,7 +2288,7 @@ p-limit "3.1.0" tslib "^2.4.0" -"@graphql-tools/merge@^8.2.6", "@graphql-tools/merge@^8.4.1", "@graphql-tools/merge@^8.4.2": +"@graphql-tools/merge@^8.2.6", "@graphql-tools/merge@^8.4.1": version "8.4.2" resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-8.4.2.tgz#95778bbe26b635e8d2f60ce9856b388f11fe8288" integrity sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw== @@ -2519,6 +2304,14 @@ "@graphql-tools/utils" "^10.0.0" tslib "^2.4.0" +"@graphql-tools/merge@^9.0.1": + version "9.0.1" + resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.1.tgz#693f15da152339284469b1ce5c6827e3ae350a29" + integrity sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw== + dependencies: + "@graphql-tools/utils" "^10.0.10" + tslib "^2.4.0" + "@graphql-tools/schema@^10.0.0": version "10.0.0" resolved "https://registry.npmmirror.com/@graphql-tools/schema/-/schema-10.0.0.tgz#7b5f6b6a59f51c927de8c9069bde4ebbfefc64b3" @@ -2529,6 +2322,16 @@ tslib "^2.4.0" value-or-promise "^1.0.12" +"@graphql-tools/schema@^10.0.2": + version "10.0.2" + resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.2.tgz#21bc2ee25a65fb4890d2e5f9f22ef1f733aa81da" + integrity sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w== + dependencies: + "@graphql-tools/merge" "^9.0.1" + "@graphql-tools/utils" "^10.0.10" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/schema@^9.0.18", "@graphql-tools/schema@^9.0.19": version "9.0.19" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.19.tgz#c4ad373b5e1b8a0cf365163435b7d236ebdd06e7" @@ -2539,18 +2342,18 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/stitch@^8.7.48": - version "8.7.50" - resolved "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-8.7.50.tgz#bcadf4b0dd20e22fb568042e94d711750c10f122" - integrity sha512-VB1/uZyXjj1P5Wj0c4EKX3q8Q1Maj4dy6uNwodEPaO3EHMpaJU/DqyN0Bvnhxu0ol7RzdY3kgsvsdUjU2QMImw== +"@graphql-tools/stitch@^9.0.3": + version "9.0.3" + resolved "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-9.0.3.tgz#6164333ecf3317d9a5e1a7e5567ae37ca936a8ac" + integrity sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A== dependencies: - "@graphql-tools/batch-delegate" "^8.4.27" - "@graphql-tools/delegate" "^9.0.35" - "@graphql-tools/executor" "^0.0.20" - "@graphql-tools/merge" "^8.4.2" - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" - "@graphql-tools/wrap" "^9.4.2" + "@graphql-tools/batch-delegate" "^9.0.0" + "@graphql-tools/delegate" "^10.0.1" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/wrap" "^10.0.0" tslib "^2.4.0" value-or-promise "^1.0.11" @@ -2582,6 +2385,16 @@ dset "^3.1.2" tslib "^2.4.0" +"@graphql-tools/utils@^10.0.10", "@graphql-tools/utils@^10.0.11": + version "10.0.11" + resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.11.tgz#1238fbe37e8d6c662c48ab2477c98269d6fd851a" + integrity sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.0" + dset "^3.1.2" + tslib "^2.4.0" + "@graphql-tools/utils@^9.0.0", "@graphql-tools/utils@^9.2.1": version "9.2.1" resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-9.2.1.tgz#1b3df0ef166cfa3eae706e3518b17d5922721c57" @@ -2590,6 +2403,17 @@ "@graphql-typed-document-node/core" "^3.1.1" tslib "^2.4.0" +"@graphql-tools/wrap@^10.0.0": + version "10.0.1" + resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz#9e3d27d2723962c26c4377d5d7ab0d3038bf728c" + integrity sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg== + dependencies: + "@graphql-tools/delegate" "^10.0.3" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/wrap@^9.4.2": version "9.4.2" resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz#30835587c4c73be1780908a7cb077d8013aa2703" @@ -2625,34 +2449,39 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@internationalized/date@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.2.0.tgz#1d266e5e5543a059cf8cca9b954fa033c3e58a75" - integrity sha512-VDMHN1m33L4eqPs5BaihzgQJXyaORbMoHOtrapFxx179J8ucY5CRIHYsq5RRLKPHZWgjNfa5v6amWWDkkMFywA== +"@internationalized/date@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz#14401139f70c1ef14b845d3cac8912e82e82adcc" + integrity sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" -"@internationalized/message@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@internationalized/message/-/message-3.1.0.tgz#b284014cd8bbb430a648b76c87c62bdca968b04c" - integrity sha512-Oo5m70FcBdADf7G8NkUffVSfuCdeAYVfsvNjZDi9ELpjvkc4YNJVTHt/NyTI9K7FgAVoELxiP9YmN0sJ+HNHYQ== +"@internationalized/message@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz#0f29c5a239b5dcd457b55f21dcd38d1a44a1236a" + integrity sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" intl-messageformat "^10.1.0" -"@internationalized/number@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.2.0.tgz#dffb661cacd61a87b814c47b7d5240a286249066" - integrity sha512-GUXkhXSX1Ee2RURnzl+47uvbOxnlMnvP9Er+QePTjDjOPWuunmLKlEkYkEcLiiJp7y4l9QxGDLOlVr8m69LS5w== +"@internationalized/number@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.5.0.tgz#9de6018424b441a6545f209afa286ad7df4a2906" + integrity sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" -"@internationalized/string@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.1.0.tgz#0b365906a8c3f44800b0db52c2e990cff345abce" - integrity sha512-TJQKiyUb+wyAfKF59UNeZ/kELMnkxyecnyPCnBI1ma4NaXReJW+7Cc2mObXAqraIBJUVv7rgI46RLKrLgi35ng== +"@internationalized/string@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.2.0.tgz#cb7d2229919ccbfb9f3312710477f28986d217d6" + integrity sha512-Xx3Sy3f2c9ctT+vh8c7euEaEHQZltp0euZ3Hy4UfT3E13r6lxpUS3kgKyumEjboJZSnaZv7JhqWz3D75v+IxQg== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" + +"@ioredis/commands@^1.1.1": + version "1.2.0" + resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" + integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== "@ipld/dag-cbor@^7.0.0", "@ipld/dag-cbor@^7.0.1": version "7.0.3" @@ -2975,57 +2804,27 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@json-rpc-tools/provider@^1.5.5": - version "1.7.6" - resolved "https://registry.npmjs.org/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6" - integrity sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA== - dependencies: - "@json-rpc-tools/utils" "^1.7.6" - axios "^0.21.0" - safe-json-utils "^1.1.1" - ws "^7.4.0" - -"@json-rpc-tools/types@^1.7.6": - version "1.7.6" - resolved "https://registry.npmjs.org/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e" - integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ== - dependencies: - keyvaluestorage-interface "^1.0.0" - -"@json-rpc-tools/utils@^1.7.6": - version "1.7.6" - resolved "https://registry.npmjs.org/@json-rpc-tools/utils/-/utils-1.7.6.tgz#67f04987dbaa2e7adb6adff1575367b75a9a9ba1" - integrity sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw== - dependencies: - "@json-rpc-tools/types" "^1.7.6" - "@pedrouid/environment" "^1.0.1" - -"@ledgerhq/connect-kit-loader@^1.0.1": - version "1.0.2" - resolved "https://registry.npmjs.org/@ledgerhq/connect-kit-loader/-/connect-kit-loader-1.0.2.tgz#8554e16943f86cc2a5f6348a14dfe6e5bd0c572a" - integrity sha512-TQ21IjcZOw/scqypaVFY3jHVqI7X7Hta3qN/us6FvTol3AY06UmrhhXGww0E9xHmAbdX241ddwXEiMBSQZFr9g== - "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@lit-labs/ssr-dom-shim@^1.0.0", "@lit-labs/ssr-dom-shim@^1.1.0": - version "1.1.1" - resolved "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz#64df34e2f12e68e78ac57e571d25ec07fa460ca9" - integrity sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ== + version "1.1.2" + resolved "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.2.tgz#d693d972974a354034454ec1317eb6afd0b00312" + integrity sha512-jnOD+/+dSrfTWYfSXBXlo5l5f0q1UuJo3tkbMDCYA2lKUYq79jaxqtGEvnRoh049nt1vdo1+45RinipU6FGY2g== "@lit/reactive-element@^1.3.0", "@lit/reactive-element@^1.6.0": - version "1.6.1" - resolved "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz#0d958b6d479d0e3db5fc1132ecc4fa84be3f0b93" - integrity sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA== + version "1.6.3" + resolved "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz#25b4eece2592132845d303e091bad9b04cdcfe03" + integrity sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ== dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@material-design-icons/svg@^0.14.7": - version "0.14.8" - resolved "https://registry.npmjs.org/@material-design-icons/svg/-/svg-0.14.8.tgz#91ddc41302b4d8d485a4fa513ab80d8db1d8c12a" - integrity sha512-2Y7ERLQ+dgxZUPhDSxHSXnPKxSh3c0rC7zAK5404DkmoKq0j8ftSoKv21/3yVUH04+eUquojHC5DZ+t4dQdOBg== +"@material-design-icons/svg@^0.14.13": + version "0.14.13" + resolved "https://registry.npmjs.org/@material-design-icons/svg/-/svg-0.14.13.tgz#de5a79038cf8b281f4b47d79c07399b2b92fcfb7" + integrity sha512-nCExGZOtoLoFeeqShEOM4XA9DkkLzLlQdk/ZxHxps0//dz6e1Lw3fvQbZ2X/+0Dz2O+udiEukfZ4Nd4KpHg8aA== "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" @@ -3056,73 +2855,73 @@ dependencies: "@monaco-editor/loader" "^1.3.3" -"@motionone/animation@^10.15.1": - version "10.15.1" - resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" - integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== +"@motionone/animation@^10.15.1", "@motionone/animation@^10.16.3": + version "10.16.3" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.16.3.tgz#f5b71e27fd8b88b61f983adb0ed6c8e3e89281f9" + integrity sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g== dependencies: - "@motionone/easing" "^10.15.1" - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" + "@motionone/easing" "^10.16.3" + "@motionone/types" "^10.16.3" + "@motionone/utils" "^10.16.3" tslib "^2.3.1" -"@motionone/dom@^10.15.5", "@motionone/dom@^10.16.2": - version "10.16.2" - resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz#0c44df8ee3d1cfc50ee11d27050b27824355a61a" - integrity sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg== +"@motionone/dom@^10.16.2", "@motionone/dom@^10.16.4": + version "10.16.4" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.4.tgz#9385716928cc2d5b3208a7dcaf504b69b47fd1ae" + integrity sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA== dependencies: - "@motionone/animation" "^10.15.1" - "@motionone/generators" "^10.15.1" - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" + "@motionone/animation" "^10.16.3" + "@motionone/generators" "^10.16.4" + "@motionone/types" "^10.16.3" + "@motionone/utils" "^10.16.3" hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/easing@^10.15.1": - version "10.15.1" - resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693" - integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== +"@motionone/easing@^10.16.3": + version "10.16.3" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.16.3.tgz#a62abe0ba2841861f167f286782e287eab8d7466" + integrity sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w== dependencies: - "@motionone/utils" "^10.15.1" + "@motionone/utils" "^10.16.3" tslib "^2.3.1" -"@motionone/generators@^10.15.1": - version "10.15.1" - resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c" - integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== +"@motionone/generators@^10.16.4": + version "10.16.4" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.16.4.tgz#4a38708244bce733bfcebd4a26d19f4bbabd36af" + integrity sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg== dependencies: - "@motionone/types" "^10.15.1" - "@motionone/utils" "^10.15.1" + "@motionone/types" "^10.16.3" + "@motionone/utils" "^10.16.3" tslib "^2.3.1" -"@motionone/svelte@^10.15.5": - version "10.16.2" - resolved "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.2.tgz#0b37c3b12927814d31d24941d1ca0ff49981b444" - integrity sha512-38xsroKrfK+aHYhuQlE6eFcGy0EwrB43Q7RGjF73j/kRUTcLNu/LAaKiLLsN5lyqVzCgTBVt4TMT/ShWbTbc5Q== +"@motionone/svelte@^10.16.2": + version "10.16.4" + resolved "https://registry.npmjs.org/@motionone/svelte/-/svelte-10.16.4.tgz#5daf117cf5b2576fc6dd487c5e0500938a742470" + integrity sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA== dependencies: - "@motionone/dom" "^10.16.2" + "@motionone/dom" "^10.16.4" tslib "^2.3.1" -"@motionone/types@^10.15.1": - version "10.15.1" - resolved "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb" - integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== +"@motionone/types@^10.15.1", "@motionone/types@^10.16.3": + version "10.16.3" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.16.3.tgz#9284ea8a52f6b32c51c54b617214f20e43ac6c59" + integrity sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg== -"@motionone/utils@^10.15.1": - version "10.15.1" - resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438" - integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== +"@motionone/utils@^10.15.1", "@motionone/utils@^10.16.3": + version "10.16.3" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.16.3.tgz#ddf07ab6cf3000d89e3bcbdc9a8c3e1fd64f8520" + integrity sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA== dependencies: - "@motionone/types" "^10.15.1" + "@motionone/types" "^10.16.3" hey-listen "^1.0.8" tslib "^2.3.1" -"@motionone/vue@^10.15.5": - version "10.16.2" - resolved "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.2.tgz#faf13afc27620a2df870c71c58a04ee8de8dea65" - integrity sha512-7/dEK/nWQXOkJ70bqb2KyNfSWbNvWqKKq1C8juj+0Mg/AorgD8O5wE3naddK0G+aXuNMqRuc4jlsYHHWHtIzVw== +"@motionone/vue@^10.16.2": + version "10.16.4" + resolved "https://registry.npmjs.org/@motionone/vue/-/vue-10.16.4.tgz#07d09e3aa5115ca0bcc0076cb9e5322775277c09" + integrity sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg== dependencies: - "@motionone/dom" "^10.16.2" + "@motionone/dom" "^10.16.4" tslib "^2.3.1" "@multiavatar/multiavatar@^1.0.7": @@ -3130,11 +2929,6 @@ resolved "https://registry.npmjs.org/@multiavatar/multiavatar/-/multiavatar-1.0.7.tgz#bc2b855bab728a51ee9cee2412ee9f76282b7c78" integrity sha512-Yg9Uw57bmlErsWL0CSv4d6D4ZqVBE00OZmYr9MRgygoXZdboNtsEI6FbBRw1AY8l88Sm1ARcyojtlm2uwUn0Zg== -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - "@n1ru4l/push-pull-async-iterable-iterator@^3.1.0": version "3.2.0" resolved "https://registry.npmjs.org/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz#c15791112db68dd9315d329d652b7e797f737655" @@ -3152,26 +2946,33 @@ resolved "https://registry.npmmirror.com/@noble/ciphers/-/ciphers-0.3.0.tgz#6ba3090afdc7a7051393486f6af210e62e0f04ec" integrity sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA== -"@noble/curves@1.0.0", "@noble/curves@^1.0.0", "@noble/curves@~1.0.0": +"@noble/curves@1.2.0", "@noble/curves@^1.1.0", "@noble/curves@~1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" integrity sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw== dependencies: "@noble/hashes" "1.3.0" -"@noble/curves@^1.1.0": - version "1.2.0" - resolved "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== +"@noble/curves@^1.2.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e" + integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA== dependencies: - "@noble/hashes" "1.3.2" + "@noble/hashes" "1.3.3" "@noble/hashes@1.1.5", "@noble/hashes@~1.1.1": version "1.1.5" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== -"@noble/hashes@1.3.0", "@noble/hashes@^1.1.2", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0": +"@noble/hashes@1.3.0", "@noble/hashes@^1.1.2", "@noble/hashes@^1.3.0": version "1.3.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== @@ -3181,6 +2982,11 @@ resolved "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/hashes@1.3.3", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@^1.6.3": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -3207,6 +3013,98 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@parcel/watcher-android-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz#d82e74bb564ebd4d8a88791d273a3d2bd61e27ab" + integrity sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA== + +"@parcel/watcher-darwin-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz#c9cd03f8f233d512fcfc873d5b4e23f1569a82ad" + integrity sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw== + +"@parcel/watcher-darwin-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz#83c902994a2a49b9e1ab5050dba24876fdc2c219" + integrity sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow== + +"@parcel/watcher-freebsd-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz#7a0f4593a887e2752b706aff2dae509aef430cf6" + integrity sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw== + +"@parcel/watcher-linux-arm-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz#3fc90c3ebe67de3648ed2f138068722f9b1d47da" + integrity sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ== + +"@parcel/watcher-linux-arm64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz#f7bbbf2497d85fd11e4c9e9c26ace8f10ea9bcbc" + integrity sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA== + +"@parcel/watcher-linux-arm64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz#de131a9fcbe1fa0854e9cbf4c55bed3b35bcff43" + integrity sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw== + +"@parcel/watcher-linux-x64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz#193dd1c798003cdb5a1e59470ff26300f418a943" + integrity sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow== + +"@parcel/watcher-linux-x64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz#6dbdb86d96e955ab0fe4a4b60734ec0025a689dd" + integrity sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g== + +"@parcel/watcher-wasm@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.3.0.tgz#73b66c6fbd2a3326ae86a1ec77eab7139d0dd725" + integrity sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + napi-wasm "^1.1.0" + +"@parcel/watcher-win32-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz#59da26a431da946e6c74fa6b0f30b120ea6650b6" + integrity sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw== + +"@parcel/watcher-win32-ia32@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz#3ee6a18b08929cd3b788e8cc9547fd9a540c013a" + integrity sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow== + +"@parcel/watcher-win32-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz#14e7246289861acc589fd608de39fe5d8b4bb0a7" + integrity sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA== + +"@parcel/watcher@^2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz#803517abbc3981a1a1221791d9f59dc0590d50f9" + integrity sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.3.0" + "@parcel/watcher-darwin-arm64" "2.3.0" + "@parcel/watcher-darwin-x64" "2.3.0" + "@parcel/watcher-freebsd-x64" "2.3.0" + "@parcel/watcher-linux-arm-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-musl" "2.3.0" + "@parcel/watcher-linux-x64-glibc" "2.3.0" + "@parcel/watcher-linux-x64-musl" "2.3.0" + "@parcel/watcher-win32-arm64" "2.3.0" + "@parcel/watcher-win32-ia32" "2.3.0" + "@parcel/watcher-win32-x64" "2.3.0" + "@peculiar/asn1-schema@^2.3.6": version "2.3.6" resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" @@ -3234,11 +3132,6 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" -"@pedrouid/environment@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec" - integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug== - "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.10" resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz#2eba163b8e7dbabb4ce3609ab5e32ab63dda3ef8" @@ -3254,17 +3147,19 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@rainbow-me/rainbowkit@1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-1.0.2.tgz#d6113ffe95c7af0ef03a8c0dcf227862e7730136" - integrity sha512-CIcEekBBlYiqg2oNS7LZqqN882OfJ0T1ORe4c46dscSuMCaX9sdbviQR1m8LoA4KocSCzSxOPAnfoVN8eC/HNA== +"@rainbow-me/rainbowkit@^1.3.0": + version "1.3.1" + resolved "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-1.3.1.tgz#b5add291363e77dd9cb09496f65dd3b8c2236df5" + integrity sha512-4Upi+S12ZHosimzlUpCiOocg4dtfGU2wkzcpxeat/FYHrvhVIOgm0TuzbsIM96W1p7OXabosd7xuxPvwduUygQ== dependencies: "@vanilla-extract/css" "1.9.1" "@vanilla-extract/dynamic" "2.0.2" "@vanilla-extract/sprinkles" "1.5.0" clsx "1.1.1" + i18n-js "^4.3.2" qrcode "1.5.0" react-remove-scroll "2.5.4" + ua-parser-js "^1.0.35" "@reach/auto-id@0.17.0": version "0.17.0" @@ -3418,1019 +3313,1029 @@ prop-types "^15.7.2" tslib "^2.3.0" -"@react-aria/breadcrumbs@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.2.tgz#2da2d329e7718ec6fa151db8b746c4d69564ad14" - integrity sha512-un10i3vzT7oCftb6jzbMkt6BI/WGlkr+JvWLWFl9CFXH4AlsIU8jWEsrVFUCySSI8Xsj43074zLsnpxgxLgSOA== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/link" "^3.5.1" - "@react-aria/utils" "^3.17.0" - "@react-types/breadcrumbs" "^3.5.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/button@^3.7.2": - version "3.7.2" - resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.7.2.tgz#d2a11766f93242989ad2b90cd948f6da7a086b63" - integrity sha512-flsnMy1xDaTDL+xDzLDeXDAiqNTgbd19R6e4fsDzDPk/mlPgvOSKQtZjswIru4rJR+d29a7LXDemBN/iJEe/3w== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/toggle" "^3.5.2" - "@react-types/button" "^3.7.3" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/calendar@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.3.0.tgz#92a33ad08f5ecc8d22f23af2f87914e711b9b75c" - integrity sha512-K8KATJQjd7xsb9aTe6Cx0/22JrHAiONspSwyGlQlJhHUnpnB6VRvPlVxfEClnbA+oVt04s/vJ87WGVnRNoFI5g== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/calendar" "^3.2.1" - "@react-types/button" "^3.7.3" - "@react-types/calendar" "^3.2.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/checkbox@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.9.1.tgz#29e7f1ae66cbafac425099af908f371df4f5f231" - integrity sha512-1TmaqrQ419K6p9KU9v5cGHjStH4p9vOGZsfYYO8RXsQsXmZ7vcK7rjytMeCTdExovU74xK9oXNh64c15Yh9EEA== - dependencies: - "@react-aria/label" "^3.5.2" - "@react-aria/toggle" "^3.6.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/checkbox" "^3.4.2" - "@react-stately/toggle" "^3.5.2" - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/combobox@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.6.1.tgz#c5f97487eb438092b7f79bfffc51772c264ccc59" - integrity sha512-FdIFAV9appfN5DfoZoJ1D+ZJS3Xp5Kro1oPUPnz9XgthwYV98JinQ5aMBKI4+df0mLmU5z1T3DWbqUuDheUCwg== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/listbox" "^3.9.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/menu" "^3.9.1" - "@react-aria/overlays" "^3.14.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/textfield" "^3.9.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/collections" "^3.8.0" - "@react-stately/combobox" "^3.5.1" - "@react-stately/layout" "^3.12.1" - "@react-types/button" "^3.7.3" - "@react-types/combobox" "^3.6.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/datepicker@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.4.1.tgz#66ebeadaab48cd1f75d9b8495b1d095ceb29327d" - integrity sha512-SRfMwXgLw64WFB7+2uUNjlq4DkOEBNIxuAl5inpk6gef3kK7izSzktbI90uFSA8lcGiN/nIv9G3I2vjz3k1y5Q== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/number" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/spinbutton" "^3.4.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/datepicker" "^3.4.1" - "@react-types/button" "^3.7.3" - "@react-types/calendar" "^3.2.1" - "@react-types/datepicker" "^3.3.1" - "@react-types/dialog" "^3.5.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/dialog@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.2.tgz#8d2ba539cb98fa99268150dacda1b79365f92fac" - integrity sha512-iKPuk1I9rFHj0y5cjYIoMj4AFeBhWeWWfFDmOuzDx9rsOK6l9jrcAV69LVXtWVJhsmmJs5TP5Ly4OlvpB+9rjA== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/overlays" "^3.14.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/overlays" "^3.5.2" - "@react-types/dialog" "^3.5.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/dnd@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.2.1.tgz#60218ec6fc4e1a8022cf26525ee98157847f3ebe" - integrity sha512-9XvUvBSdaMGD8kwNzbSt+eA0wK465KNrsRJvqYIwUTXhrVjbomzXPm8NQ1e9Y8f7j1vSZU1BlMky0861SHwbWg== - dependencies: - "@internationalized/string" "^3.1.0" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/overlays" "^3.14.1" - "@react-aria/utils" "^3.17.0" - "@react-aria/visually-hidden" "^3.8.1" - "@react-stately/dnd" "^3.2.1" - "@react-types/button" "^3.7.3" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/focus@^3.12.1": - version "3.12.1" - resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.12.1.tgz#5976fa41f36d09a0271f736d7c01414704ea1ca2" - integrity sha512-i1bRz27mRFnrDpYpRvm/6Zm+FbGo0WygNQiLVgTce7WY+39oLERIGRrE8Ovy6rY9Hr4MGBAXz2Q+o9oTOgeBgA== +"@react-aria/breadcrumbs@^3.5.9": + version "3.5.9" + resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.9.tgz#6175244b7428db87e274448778df767fbde8a8de" + integrity sha512-asbXTL5NjeHl1+YIF0K70y8tNHk8Lb6VneYH8yOkpLO49ejyNDYBK0tp0jtI9IZAQiTa2qkhYq58c9LloTwebQ== dependencies: - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/link" "^3.6.3" + "@react-aria/utils" "^3.23.0" + "@react-types/breadcrumbs" "^3.7.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-aria/grid@^3.7.1": - version "3.7.1" - resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.7.1.tgz#8d68f0bb2c617773c9a640f1a98303542c2dccfc" - integrity sha512-CwrRbX1GuLJnQugB3fkujMPjFEJNyzcy+niuAwRMn768Y9MD8swDMwGrKL362NddF2jSCCwIxqA0qjCPeD4S2w== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/collections" "^3.8.0" - "@react-stately/grid" "^3.6.1" - "@react-stately/selection" "^3.13.1" - "@react-stately/virtualizer" "^3.5.2" - "@react-types/checkbox" "^3.4.4" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/gridlist@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.4.0.tgz#7273a0e29f610ba8dfa73b4a85a271d7b5aabdfd" - integrity sha512-qV0XIdUrAJMlj+H4d5kL8cH5AFq8m9oNzcDfiA9ku1zsJ9yd3l1waSOyIWlrFZkaIIdkgFUDM4RzgvNHm+WA0Q== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/grid" "^3.7.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/list" "^3.8.1" - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/i18n@^3.7.2": - version "3.7.2" - resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.7.2.tgz#7e42943a5e0584dca60c72830175edbae4d9be9f" - integrity sha512-GsVioW8RGOmwebTruEBAmGYJunY0WS7Ljfn5n7Mec3eoMKdQjH2M70fHwCOWqJo8Ufq7A7p0ypBVCv4d4sbSdw== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/message" "^3.1.0" - "@internationalized/number" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/interactions@^3.15.1": - version "3.15.1" - resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.15.1.tgz#10d82fd2ce7a3088713c59cb10b63613c8344052" - integrity sha512-khtpxSvos885rxMep6DRe8RGZjtD16ZuLxhFBtL1dXqSv5XZxaXKOmI8Yx1F8AkVIPdB72MmjG8dz3PpM3PPYg== - dependencies: - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/label@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.5.2.tgz#fa667c04fc19546030e13b49a12dbcd5db323ef1" - integrity sha512-YtLJl3l11TKzGhSMuUqp1DdQ6s3hbT1buiC+jPPKv81PcjjoUDpj+hAVnc1cigtvrEFSMpi2Z+KYREmYYj4GDQ== - dependencies: - "@react-aria/utils" "^3.17.0" - "@react-types/label" "^3.7.4" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/link@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.5.1.tgz#f93914ae5b31b3a38ce1a99809197240113778e3" - integrity sha512-eVdbmiae/Y3B5k78bakx2x43c69cqvEk/g38kjRI4lNa1WsQMdV/3HXjuWa3KA+c3ajn0kTAXO6inHKGtJ9d6w== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-types/link" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/listbox@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.9.1.tgz#8b077a02fc9a6179c7660d0f3aca83bbf43eb714" - integrity sha512-tRcqNHGx9Vtspth9zdOLEfbGGaLrTN/rDXg0xN2FT++qxwALuYV7R4qFUX7eTPCT+NDOqeQNOCsHyQF4gQN+JQ== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/collections" "^3.8.0" - "@react-stately/list" "^3.8.1" - "@react-types/listbox" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/live-announcer@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.0.tgz#04a2a233c2f48c53994f83cafdc4336ec1ea3700" - integrity sha512-6diTS6mIf70KdxfGqiDxHV+9Qv8a9A88EqBllzXGF6HWPdcwde/GIEmfpTwj8g1ImNGZYUwDkv4Hd9lFj0MXEg== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-aria/menu@^3.9.1": +"@react-aria/button@^3.9.1": version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.9.1.tgz#a89f8c65429c50d5247a46fd100454ec3efb37e5" - integrity sha512-LRSo7KyVxoFxrjj55VtxMKJ6/c3LhfZThytWFvA9r02Ukf1B0xn/Or8rgyVyHcyekvcmT4IDrjFl1tDG2wsq4g== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/overlays" "^3.14.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/collections" "^3.8.0" - "@react-stately/menu" "^3.5.2" - "@react-stately/tree" "^3.6.1" - "@react-types/button" "^3.7.3" - "@react-types/menu" "^3.9.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/meter@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.2.tgz#741bf22176a349c0973d9480c9c306ebb5d81545" - integrity sha512-3qcWeCiLuauwQdLHOc/RssuxEEhYWEy+TXNNE2P6zKvduuL19JKKljpuI1SpQSQ4nAamIGZwGBwHdAoZpLx3Kw== - dependencies: - "@react-aria/progress" "^3.4.2" - "@react-types/meter" "^3.3.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/numberfield@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.5.1.tgz#e4f97e24dd755e2092a8afa2689a82798e610105" - integrity sha512-O0hDANrlwsKSKjiV64Ryx1FfNxkuByU9qXKz7vpMf8ZeR3OLAYzvib1RNeFvijM9/TUGp1zA40cwGknEp6D72w== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/spinbutton" "^3.4.1" - "@react-aria/textfield" "^3.9.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/numberfield" "^3.4.2" - "@react-types/button" "^3.7.3" - "@react-types/numberfield" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@react-types/textfield" "^3.7.2" - "@swc/helpers" "^0.4.14" - -"@react-aria/overlays@^3.14.1": - version "3.14.1" - resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.14.1.tgz#2e18bd78eef145dc1353490dbe29f04622cfbafe" - integrity sha512-xJCw0oSDtwBCCqf0EMMeeLYOEFSCdd1cWFS0O3980SObFQPHwP5KOX5SAs7lVvIlZUvEdpo6sOytcQTjv5U9QA== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.17.0" - "@react-aria/visually-hidden" "^3.8.1" - "@react-stately/overlays" "^3.5.2" - "@react-types/button" "^3.7.3" - "@react-types/overlays" "^3.7.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/progress@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.2.tgz#a4357c718808cacf01e83e162d2e3968dc623629" - integrity sha512-9VQbZGWnzQz8pW7NoOzUNzVkWemTaCfut8KJHcyW/KicoNfNHNuhaBcFvor0pAGIYT4Kdxlv0aG6i3N1xit6aQ== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/label" "^3.5.2" - "@react-aria/utils" "^3.17.0" - "@react-types/progress" "^3.4.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/radio@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.6.1.tgz#baf5d83b99b5ef44fa0bed804daa2fb221ecf754" - integrity sha512-paO2sCxvH8I0Iomzgmvw1TCvzd+0AcUylPSr34dhPmJIsRew7UVtmON9YU8tM/KELDv346n2v8KqzlgHJlLLvg== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/radio" "^3.8.1" - "@react-types/radio" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/searchfield@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.5.2.tgz#9ff0031130c73be1007822f9b99a6ef9967a5930" - integrity sha512-rmTdr1ZYqVOZ9lTf2ks71ohirgNsutuG8If6r2FFvatc8UgOG/ClKeaTHhErPKLtO9+SxQWDGmi72ShF92Ydjw== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/textfield" "^3.9.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/searchfield" "^3.4.2" - "@react-types/button" "^3.7.3" - "@react-types/searchfield" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/select@^3.10.1": - version "3.10.1" - resolved "https://registry.npmjs.org/@react-aria/select/-/select-3.10.1.tgz#eb6be7dd29f40ced0c1c4aaedf698ca43790b0bd" - integrity sha512-gu+ssmcT7kA9B9PCFaY/LyWPtNk0Ywl51qFM4S8JVTM3sMqnUPVjFHFp/UYL6NK1pZa9Saui4c4HZCGc+HcQlQ== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/listbox" "^3.9.1" - "@react-aria/menu" "^3.9.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-aria/visually-hidden" "^3.8.1" - "@react-stately/select" "^3.5.1" - "@react-types/button" "^3.7.3" - "@react-types/select" "^3.8.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/selection@^3.15.0": - version "3.15.0" - resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.15.0.tgz#928acf8adffea1afe64a152b6fe425a5424e52f5" - integrity sha512-v3AXsau6BobbM5Fu7X+HhX5K/Ey3drVBaoevGDiYX8kGS9jlFNDXENKYPtnMpcTCvSX0yuxTITukOEBokzkb6Q== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/collections" "^3.8.0" - "@react-stately/selection" "^3.13.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/separator@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.2.tgz#38a895a06ad61b4d3304c173c36f357bf6b3ed89" - integrity sha512-JNftOexcj8lvKRS7h+gTIW4HBJVtcYRc8ESCt7GFgAozVNmu+IJ6KPvD1MYBozCLzoKGnLPXB/9eGi47wNdXnA== - dependencies: - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/slider@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.4.1.tgz#b56c4b1bb82a4038150c2e67953a55e3337e6231" - integrity sha512-gJTfwZGGGv0dPUO3rC8HCyOXnAgMagJZnV3gIILfzNWZHZLYbLze+IbTSNtNKGIvt4pAKTV0njLDLlxFZlAadw== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/radio" "^3.8.1" - "@react-stately/slider" "^3.3.2" - "@react-types/radio" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@react-types/slider" "^3.5.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/spinbutton@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.4.1.tgz#627db560317fee187854d48c6e31a4f2f0591a3e" - integrity sha512-YL3Gp431Jd8FcZ3aU/ymQJlV1yPOShbDJUvHZ8cwasjFH3QLSvx88pcv1PTKxyE3RdRFkP+Xii61jFfF7B5jmg== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/utils" "^3.17.0" - "@react-types/button" "^3.7.3" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/ssr@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz#e5d52bd1686ff229f68f806cf94ee29dd9f54fb7" - integrity sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-aria/switch@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.5.1.tgz#e85e90ca735462c3aa4e1c5ed5b877332195d2f8" - integrity sha512-upFtDIfNSVUOUOQYPqFzu2dxef4zVcxbCkaqUo+IRJnNix6AdtoEq+E7gwKVHnB79GQMWz6ZmippbID9Yrq73Q== - dependencies: - "@react-aria/toggle" "^3.6.1" - "@react-stately/toggle" "^3.5.2" - "@react-types/switch" "^3.3.2" - "@swc/helpers" "^0.4.14" - -"@react-aria/table@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.9.1.tgz#e30b9703c9dc4f6d7e0b3d2851a5092625db2f19" - integrity sha512-utcqmQbH9M6jw6Stv8ugJdi8+F0vCXE7pQMVDow/mxDq0Cf5bAbBt29Yln2xO/6dyiBcT3LESgmD7AYlAfy2BQ== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/grid" "^3.7.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-aria/visually-hidden" "^3.8.1" - "@react-stately/collections" "^3.8.0" - "@react-stately/table" "^3.9.1" - "@react-stately/virtualizer" "^3.5.2" - "@react-types/checkbox" "^3.4.4" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@react-types/table" "^3.6.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/tabs@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.6.0.tgz#18bd02557acb3212cf34134a1343cacaad075a02" - integrity sha512-W+X/lEvGjIGOeIx/tzkXjenglRPdv6d0JS4KCqrQET+Vg4jkAJWR2Ls0imz6CIF/QE5lbe3MiM8pyFpwg6vUNA== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/list" "^3.8.1" - "@react-stately/tabs" "^3.4.1" - "@react-types/shared" "^3.18.1" - "@react-types/tabs" "^3.3.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/tag@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@react-aria/tag/-/tag-3.0.0.tgz#6bc61544d396a97bfcf77d1186d7821268d81aa1" - integrity sha512-UuYqlysitwv1e1SV9YJqUMV7P7Gg5triEljyJ90b4rtETRhGa+Qh6cVa1P8F4h5nPTwzqey47jAp45i1FSsH4w== - dependencies: - "@react-aria/gridlist" "^3.4.0" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/selection" "^3.15.0" - "@react-aria/utils" "^3.17.0" - "@react-stately/list" "^3.8.1" - "@react-types/button" "^3.7.3" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/textfield@^3.9.2": - version "3.9.2" - resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.9.2.tgz#d73c29906e38a988a193122ec2e17b1108366502" - integrity sha512-wT68tErfMcBvJHyb+5skfs1OHZ8lESzIbrwCTuipM85BeleYIu25qGbKfOX9wMbC+4X775gg/JfmUQESJ6nD1A== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/label" "^3.5.2" - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@react-types/textfield" "^3.7.2" - "@swc/helpers" "^0.4.14" - -"@react-aria/toggle@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.6.1.tgz#9aa8c6b951ef4c9a407e410da0079e046d8b35f1" - integrity sha512-4ml3HMjaZPUtRVb6MuuxuV8P/ydzrpldfP0R1hv3f56lo5gBVMh7ME72z49Z8Jf9hnxPkDBvnNi0AnfITtvfVw== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/toggle" "^3.5.2" - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" - "@react-types/switch" "^3.3.2" - "@swc/helpers" "^0.4.14" - -"@react-aria/tooltip@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.5.1.tgz#fd6f157cc6f09986e986e38034ad5198e3514dc0" - integrity sha512-H+eYX5H9cSKCiguH/0+QMq9LrZrvq8D0Zf6fHnA3dP4YkDjxFNuFyeiXGSTTcjEmwnCf9sJ9sObjv6b9n7c45w== - dependencies: - "@react-aria/focus" "^3.12.1" - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/tooltip" "^3.4.1" - "@react-types/shared" "^3.18.1" - "@react-types/tooltip" "^3.4.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/utils@^3.17.0": - version "3.17.0" - resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.17.0.tgz#b462afad9a25505394a714a69b9f238c24dd15a7" - integrity sha512-NEul0cQ6tQPdNSHYzNYD+EfFabeYNvDwEiHB82kK/Tsfhfm84SM+baben/at2N51K7iRrJPr5hC5fi4+P88lNg== - dependencies: - "@react-aria/ssr" "^3.6.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" - -"@react-aria/visually-hidden@^3.8.1": + resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.9.1.tgz#f76f8a74fe6c6b3ffe1fc446d6f750188a33042e" + integrity sha512-nAnLMUAnwIVcRkKzS1G2IU6LZSkIWPJGu9amz/g7Y02cGUwFp3lk5bEw2LdoaXiSDJNSX8g0SZFU8FROg57jfQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/calendar@^3.5.4": + version "3.5.4" + resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.4.tgz#a3afd32346668cc574763be0b36d91c9d2e18a8d" + integrity sha512-8k7khgea5kwfWriZJWCADNB0R2d7g5A6tTjUEktK4FFZcTb0RCubFejts4hRyzKlF9XHUro2dfh6sbZrzfMKDQ== + dependencies: + "@internationalized/date" "^3.5.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/calendar" "^3.4.3" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/checkbox@^3.13.0": + version "3.13.0" + resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.13.0.tgz#05d6f94204b56ed73119a9eeb825343f183b4fd5" + integrity sha512-eylJwtADIPKJ1Y5rITNJm/8JD8sXG2nhiZBIg1ko44Szxrpu+Le53NoGtg8nlrfh9vbUrXVvuFtf2jxbPXR5Jw== + dependencies: + "@react-aria/form" "^3.0.1" + "@react-aria/label" "^3.7.4" + "@react-aria/toggle" "^3.10.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/checkbox" "^3.6.1" + "@react-stately/form" "^3.0.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/combobox@^3.8.1": version "3.8.1" - resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.1.tgz#f035d3461671ae6f3af534e615df009ca9c08c4a" - integrity sha512-aojoZXw5iaFDOgqmGuCyaTG9PFqfav5ABXX/W/0Q2YNj6Tb3i6++m2+8RMHlz2b6Dj+rXLiTxa00t7BSgJbUvA== - dependencies: - "@react-aria/interactions" "^3.15.1" - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" - -"@react-stately/calendar@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.2.1.tgz#834b1bb5b0412dcbfc9cd1edea3cd19c99a62286" - integrity sha512-3gUUQofRfMaFqg8qA0uEMuciDAtFCYhxYgYWwWOIBcpxHV0STMKrsWjpY5+rNtpB+wi+81jz55gfmBEo+4QU3w== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-stately/utils" "^3.6.0" - "@react-types/calendar" "^3.2.1" - "@react-types/datepicker" "^3.3.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/checkbox@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.4.2.tgz#9ccd80ee94b5d4c796e81ce8f5e55230b8102e31" - integrity sha512-UG94lilDJEIFeRKnKw31nI1Vb1UOSroLAFHv4rB2tCvzLl3/9ULfHyii1hqFVS41juzFc7ONInNBT4yu5RAm5Q== - dependencies: - "@react-stately/toggle" "^3.5.2" - "@react-stately/utils" "^3.6.0" - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/collections@^3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.8.0.tgz#4b2b71866d12fd6b4f4aea495e2d4ecb2954d4e6" - integrity sha512-NIRE8Gha0XZTnbvh9JRZM7oI/6uLf6ozjB7myja29IX7hDvsZxITe0RFXBapcujlpXLU2uufssJPKpiwJm3vZQ== - dependencies: - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/combobox@^3.5.1": + resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.1.tgz#ed4fac6cbab4ceed9b5952843fd96db942d8b4dc" + integrity sha512-0Zsy91WC2uhnIjtProL1E5qRjBtRVdsNgpr8T9QCQht4i2sHd8L/srrOx7b6vRIngUMZq7GofOpQcKVdxx4kEA== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/listbox" "^3.11.3" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/menu" "^3.12.0" + "@react-aria/overlays" "^3.20.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/combobox" "^3.8.1" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/combobox" "^3.10.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/datepicker@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.1.tgz#3f4a494a90b27b300668d687531ee20f6665bd12" + integrity sha512-bdlY2H/zwe3hQf64Lp1oGTf7Va8ennDyAv4Ffowb+BOoL8+FB9smtGyONKe87zXu7VJL2M5xYAi4n7c004PM+w== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/number" "^3.5.0" + "@internationalized/string" "^3.2.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/spinbutton" "^3.6.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/datepicker" "^3.9.1" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.3" + "@react-types/datepicker" "^3.7.1" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dialog@^3.5.9": + version "3.5.9" + resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.9.tgz#d1b6d2c8c33cda0a65adbc5ede1fb4b9590a5238" + integrity sha512-Eg5pFJN3b5NitKL60nf30iPpQGCyOcU4YakUVn5+GWKLBlm8ryE8jyoIIO0e0LCM65K+fL+gGHGK01GCZyKrpQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/overlays" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dnd@^3.5.1": version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.5.1.tgz#efde39fa2d5003d9030bef04705aefc84f00aff7" - integrity sha512-E7eEggbVaueLEeSAOXzB2wUsjxgA3vpfTsghWdxYU6hWPB2ek6cSWfjAp7NPtf0b56n07kZRqa1lFx6kPJSCYw== - dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/list" "^3.8.1" - "@react-stately/menu" "^3.5.2" - "@react-stately/select" "^3.5.1" - "@react-stately/utils" "^3.6.0" - "@react-types/combobox" "^3.6.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/data@^3.9.2": - version "3.9.2" - resolved "https://registry.npmjs.org/@react-stately/data/-/data-3.9.2.tgz#a8fc3173d7407f7ed17dec6c9b5c1a9fe719ff26" - integrity sha512-ze64/M/OOv8Vk/KSNf+PzF0gTnv1y+EqjCdvJWRYD6fo64bRWH19x3X2xbMX0UYCbdjsSlesXn/9uItz8Kws6A== + resolved "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.1.tgz#4fecbfbad38f42ddd0c12a88ca11d90548f112d0" + integrity sha512-7OPGePdle+xNYHAIAUOvIETRMfnkRt7h/C0bCkxUR2GYefEbTzfraso4ppNH2JZ7fCRd0K/Qe+jvQklwusHAKA== + dependencies: + "@internationalized/string" "^3.2.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/overlays" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/dnd" "^3.2.7" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/focus@^3.16.0": + version "3.16.0" + resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.0.tgz#521677a452de254bd48d3a469d6411d69188593d" + integrity sha512-GP6EYI07E8NKQQcXHjpIocEU0vh0oi0Vcsd+/71fKS0NnTR0TUOEeil0JuuQ9ymkmPDTu51Aaaa4FxVsuN/23A== + dependencies: + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/form@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@react-aria/form/-/form-3.0.1.tgz#2fdb28231cbee80684c9500e606da42e4ca65318" + integrity sha512-6586oODMDR4/ciGRwXjpvEAg7tWGSDrXE//waK0n5e5sMuzlPOo1DHc5SpPTvz0XdJsu6VDt2rHdVWVIC9LEyw== + dependencies: + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/grid@^3.8.6": + version "3.8.6" + resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.6.tgz#61ac7e8b460c962614cb807b0def9d404cda3ec5" + integrity sha512-JlQDkdm5heG1FfRyy5KnB8b6s/hRqSI6Xt2xN2AccLX5kcbfFr2/d5KVxyf6ahfa4Gfd46alN6477ju5eTWJew== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/grid" "^3.8.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/virtualizer" "^3.6.6" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/gridlist@^3.7.3": + version "3.7.3" + resolved "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.3.tgz#dac639f2e2d808316e9759026319a536c10a2acf" + integrity sha512-rkkepYM7xJiebR0g3uC4zzkdR7a8z0fLaM+sg9lSTbdElHMLAlrebS2ytEyZnhiu9nbOnw13GN1OC4/ZenzbHQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/grid" "^3.8.6" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/list" "^3.10.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/i18n@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.0.tgz#bc61c8d05a0193a4c4322ddaefb4ee382190169a" + integrity sha512-sviD5Y1pLPG49HHRmVjR+5nONrp0HK219+nu9Y7cDfUhXu2EjyhMS9t/n9/VZ69hHChZ2PnHYLEE2visu9CuCg== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/message" "^3.1.1" + "@internationalized/number" "^3.5.0" + "@internationalized/string" "^3.2.0" + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/interactions@^3.20.1": + version "3.20.1" + resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.1.tgz#397f6724935024e7d3f4f38e8fae07ee37da868d" + integrity sha512-PLNBr87+SzRhe9PvvF9qvzYeP4ofTwfKSorwmO+hjr3qoczrSXf4LRQlb27wB6hF10C7ZE/XVbUI1lj4QQrZ/g== + dependencies: + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/label@^3.7.4": + version "3.7.4" + resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.7.4.tgz#c7ba2c9d795b05da9f041eace9211d3c71b11c64" + integrity sha512-3Y0yyrqpLzZdzHw+TOyzwuyx5wa2ujU5DGfKuL5GFnU9Ii4DtdwBGSYS7Yu7qadU+eQmG4OGhAgFVswbIgIwJw== + dependencies: + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/link@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.6.3.tgz#a9966a2a488014bbd39861329f1f6cdb99ceb78e" + integrity sha512-8kPWc4u/lDow3Ll0LDxeMgaxt9Y3sl8UldKLGli8tzRSltYFugNh/n+i9sCnmo4Qv9Tp9kYv+yxBK50Uk9sINw== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/listbox@^3.11.3": + version "3.11.3" + resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.3.tgz#a24ff6f3c55206f2fe20ab13338af61add74682a" + integrity sha512-PBrnldmyEYUUJvfDeljW8ITvZyBTfGpLNf0b5kfBPK3TDgRH4niEH2vYEcaZvSqb0FrpdvcunuTRXcOpfb+gCQ== + dependencies: + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/list" "^3.10.2" + "@react-types/listbox" "^3.4.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/live-announcer@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz#bf864b8820fb02daaeefc1c972782a0174fd60b9" + integrity sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/menu@^3.12.0": + version "3.12.0" + resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.12.0.tgz#3daf48b968d0942fdf7f97615898b7deb97f0777" + integrity sha512-Nsujv3b61WR0gybDKnBjAeyxDVJOfPLMggRUf9SQDfPWnrPXEsAFxaPaVcAkzlfI4HiQs1IxNwsKFNpc3PPZTQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/overlays" "^3.20.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/menu" "^3.6.0" + "@react-stately/tree" "^3.7.5" + "@react-types/button" "^3.9.1" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/meter@^3.4.9": + version "3.4.9" + resolved "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.9.tgz#bea1835f21e574465793a5145c5cc17212baf5be" + integrity sha512-1/FHFmFmSyfQBJ2oH152lp4nps76v1UdhnFbIsmRIH+0g0IfMv1yDT2M9dIZ/b9DgVZSx527FmWOXm0eHGKD6w== + dependencies: + "@react-aria/progress" "^3.4.9" + "@react-types/meter" "^3.3.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/numberfield@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.10.1.tgz#2b6c9dbbb8c812293f1ce65186ab9940ee6bb9a2" + integrity sha512-9rt+O63UL3zKR99c+8njbtBeVoEhitzzSCFWsqbtStyoUEV5tJQDgD9kSlozFLAzYftq2pJ7uazlptMEXyS13g== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/spinbutton" "^3.6.1" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-stately/numberfield" "^3.8.0" + "@react-types/button" "^3.9.1" + "@react-types/numberfield" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/overlays@^3.20.0": + version "3.20.0" + resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.20.0.tgz#9d7e0529aa9e28f8055ef5d8486ce5aa0ede41dd" + integrity sha512-2m7MpRJL5UucbEuu08lMHsiFJoDowkJV4JAIFBZYK1NzVH0vF/A+w9HRNM7jRwx2DUxE+iIsZnl8yKV/7KY8OQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/overlays" "^3.6.4" + "@react-types/button" "^3.9.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/progress@^3.4.9": + version "3.4.9" + resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.9.tgz#266be752c9a6fb548480978839aac5b5045aa7bd" + integrity sha512-CME1ZLsJHOmSgK8IAPOC/+vYO5Oc614mkEw5MluT/yclw5rMyjAkK1XsHLjEXy81uwPeiRyoQQIMPKG2/sMxFQ== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-types/progress" "^3.5.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/radio@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.0.tgz#8c17fe18a499fc06303329e674e0f06b47ceb411" + integrity sha512-6NaKzdGymdcVWLYgHT0cHsVmNzPOp89o8r41w29OPBQWu8w2c9mxg4366OiIZn/uXIBS4abhQ4nL4toBRLgBrg== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/radio" "^3.10.1" + "@react-types/radio" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/searchfield@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.0.tgz#8be2aa202aab1dc5c1c897be650d7ae4d0af601a" + integrity sha512-btBbkIwsExXWv5av62gINEbm4QFmDDT7r+d5TAKin5tvKqU8zrsM9fm7KCDEhIGcpUW+q2AUS589iw19z9uCcA== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/searchfield" "^3.5.0" + "@react-types/button" "^3.9.1" + "@react-types/searchfield" "^3.5.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/select@^3.14.1": + version "3.14.1" + resolved "https://registry.npmjs.org/@react-aria/select/-/select-3.14.1.tgz#4d556098c44660427a891d538c12a30541c95401" + integrity sha512-pAy/+Xbj11Lx6bi/O1hWH0NSIDRxFb6V7N0ry2L8x7MALljh516VbpnAc5RgvbjbuKq0cHUAcdINOzOzpYWm4A== + dependencies: + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/listbox" "^3.11.3" + "@react-aria/menu" "^3.12.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/select" "^3.6.1" + "@react-types/button" "^3.9.1" + "@react-types/select" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/selection@^3.17.3": + version "3.17.3" + resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.3.tgz#ed4b3c51cc9abc72ad19d6beb536b194db1cbd7d" + integrity sha512-xl2sgeGH61ngQeE05WOWWPVpGRTPMjQEFmsAWEprArFi4Z7ihSZgpGX22l1w7uSmtXM/eN/v0W8hUYUju5iXlQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/selection" "^3.14.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/separator@^3.3.9": + version "3.3.9" + resolved "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.9.tgz#ee3e73841ddd705b772a93faec055de5420a6d4d" + integrity sha512-1wEXiaSJjq2+DR5TC0RKnUBsfZN+YXTzyI7XMzjQoc3YlclumX8wQtzPAOGOEjHB1JKUgo1Gw70FtupVXz58QQ== + dependencies: + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/slider@^3.7.4": + version "3.7.4" + resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.4.tgz#d6cabfdae842265ef75b4aea9990488a44dc95d8" + integrity sha512-OFJWeGSL2duVDFs/kcjlWsY6bqCVKZgM0aFn2QN4wmID+vfBvBnqGHAgWv3BCePTAPS3+GBjMN002TrftorjwQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/slider" "^3.5.0" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/spinbutton@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.1.tgz#f175bb90532bb419c826c05d2934d02c3091f01c" + integrity sha512-u5GuOP3k4Zis055iY0fZJNHU7dUNCoSfUq5LKwJ1iNaCqDcavdstAnAg+X1a7rhpp5zCnJmAMseo3Qmzi9P+Ew== dependencies: - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/datepicker@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.4.1.tgz#3aaf3b439e542aa9bc0dc366a70f9232247865e6" - integrity sha512-tubL36Pc7H3/agUk3epB9YzVDUgCNhE406cAMpkvFP4Ru4pUC45dKM9FoR4S43vJra7AYfY8lNkFZKkFVJBWVQ== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-stately/overlays" "^3.5.2" - "@react-stately/utils" "^3.6.0" - "@react-types/datepicker" "^3.3.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-aria/i18n" "^3.10.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.23.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/dnd@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.1.tgz#3f738d4a1bbc9c2291c52ec480114b96e83ed76a" - integrity sha512-n9XHGUOvDiSWiNJ/MtgvGz/nY3OX9rMJi1pjx6066m699qu1qYDQUgBI59HLCHBf1DhrYWz2qDf72rkxdbgZ6g== +"@react-aria/ssr@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz#a1252fd5ef87eada810dd9dd6751a5e21359d1d2" + integrity sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg== dependencies: - "@react-stately/selection" "^3.13.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" -"@react-stately/grid@^3.6.1": +"@react-aria/switch@^3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.0.tgz#ebf42690b0fdb97055811190bb0c3145a653a3c5" + integrity sha512-YNWc5fGLNXE4XlmDAKyqAdllRiClGR7ki4KGFY7nL+xR5jxzjCGU3S3ToMK5Op3QSMGZLxY/aYmC4O+MvcoADQ== + dependencies: + "@react-aria/toggle" "^3.10.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/switch" "^3.5.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/table@^3.13.3": + version "3.13.3" + resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.13.3.tgz#84e01d8329ea201004b90f362a2cd9ffb97d5167" + integrity sha512-AzmETpyxwNqISTzwHJPs85x9gujG40IIsSOBUdp49oKhB85RbPLvMwhadp4wCVAoHw3erOC/TJxHtVc7o2K1LA== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/grid" "^3.8.6" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/collections" "^3.10.4" + "@react-stately/flags" "^3.0.0" + "@react-stately/table" "^3.11.4" + "@react-stately/virtualizer" "^3.6.6" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" + "@swc/helpers" "^0.5.0" + +"@react-aria/tabs@^3.8.3": + version "3.8.3" + resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.3.tgz#53f481404d4798bd5e60893f0ee80c9467ad6cfa" + integrity sha512-Plw0K/5Qv35vYq7pHZFfQB2BF5OClFx4Abzo9hLVx4oMy3qb7i5lxmLBVbt81yPX/MdjYeP4zO1EHGBl4zMRhA== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/tabs" "^3.6.3" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" + +"@react-aria/tag@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.1.tgz#9236d1c6492c64124fec8b2f3a632a9c33bf5400" + integrity sha512-w7d8sVZqxTo8VFfeg2ixLp5kawtrcguGznVY4mt5aE6K8LMJOeNVDqNNfolfyia80VjOWjeX+RpVdVJRdrv/GQ== + dependencies: + "@react-aria/gridlist" "^3.7.3" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/list" "^3.10.2" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/textfield@^3.14.0": + version "3.14.0" + resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.0.tgz#bac949e4846aa194106139c9a8be94d62a125643" + integrity sha512-LtHFcPK/N9m3KWSRM5KdmlIk7cUEk0OF+uBUrfKsGGc1bJKVToimdW7jQusChHmHhslHUR7WQ4KDjXyFjoLXOw== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/toggle@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.0.tgz#4869ef2858938e05aadd4c41b1db115aca349fda" + integrity sha512-6cUf4V9TuG2J7AvXUdU/GspEPFCubUOID3mrselSe563RViy+mMZk0vUEOdyoNanDcEXl58W4dE3SGWxFn71vg== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/toolbar@3.0.0-beta.1": + version "3.0.0-beta.1" + resolved "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.1.tgz#7331c8a06b89d9f293ebf4cbec418aeeffb680d5" + integrity sha512-GTQ76i0N8/BzWRJ/95RpOFGmbtv0lV3T2zd7CUis6xmP1zJCpSycs1V2jAUs6ggkVDedHLU2d0AOMkXorZLiUg== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/tooltip@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.0.tgz#70f0f951caabb04d33adf8785c1a716cb0e01c48" + integrity sha512-+u9Sftkfe09IDyPEnbbreFKS50vh9X/WTa7n1u2y3PenI9VreLpUR6czyzda4BlvQ95e9jQz1cVxUjxTNaZmBw== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/tooltip" "^3.4.6" + "@react-types/shared" "^3.22.0" + "@react-types/tooltip" "^3.4.6" + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.23.0": + version "3.23.0" + resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.0.tgz#15548db55fcb7da1920e21735467157328f0223f" + integrity sha512-fJA63/VU4iQNT8WUvrmll3kvToqMurD69CcgVmbQ56V7ZbvlzFi44E7BpnoaofScYLLtFWRjVdaHsohT6O/big== + dependencies: + "@react-aria/ssr" "^3.9.1" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/visually-hidden@^3.8.8": + version "3.8.8" + resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.8.tgz#0f2a70ca21974154383080cf486caff5e7f2240f" + integrity sha512-Cn2PYKD4ijGDtF0+dvsh8qa4y7KTNAlkTG6h20r8Q+6UTyRNmtE2/26QEaApRF8CBiNy9/BZC/ZC4FK2OjvCoA== + dependencies: + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/calendar@^3.4.3": + version "3.4.3" + resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.3.tgz#3fa1f7abc8b5c5362949b54031435f9acf3cb9a0" + integrity sha512-OrEcdskszDjnjVnFuSiDC2PVBJ6lWMCJROD5s6W1LUehUtBp8LX9wPavAGHV43LbhN9ldj560sxaQ4WCddrRCA== + dependencies: + "@internationalized/date" "^3.5.1" + "@react-stately/utils" "^3.9.0" + "@react-types/calendar" "^3.4.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/checkbox@^3.6.1": version "3.6.1" - resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.6.1.tgz#968fde7289ec97e40171586b53cfc69e70d00718" - integrity sha512-54B3OztU99ixMhcZsDdfeMemEcqibK9KgaOZVuPmewee35nXAOGTqNjjeN64Vz6ui8q3j86eIyjGChAxqU0KpA== + resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.1.tgz#2e213b2ca39f10410827d12f35bc7210727767f3" + integrity sha512-rOjFeVBy32edYwhKiHj3ZLdLeO+xZ2fnBwxnOBjcygnw4Neygm8FJH/dB1J0hdYYR349yby86ED2x0wRc84zPw== dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/selection" "^3.13.1" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/layout@^3.12.1": - version "3.12.1" - resolved "https://registry.npmjs.org/@react-stately/layout/-/layout-3.12.1.tgz#ec4602fe723cab9652ce206aa6e6490b6f24c9b5" - integrity sha512-WVAo9bb8+QWOkGC0HUkYOGjkXvUuZyOOtftc0blRnuGD30SAx1bLkGEFoa2Qm6K7Rhm7s9jNSSXdd6Tgm4Aqew== - dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/table" "^3.9.1" - "@react-stately/virtualizer" "^3.5.2" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@react-types/table" "^3.6.1" - "@swc/helpers" "^0.4.14" +"@react-stately/collections@^3.10.4": + version "3.10.4" + resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.4.tgz#aa81328a0996ba39ee39d469e65135812ebecef1" + integrity sha512-OHhCrItGt4zB2bSrgObRo0H2SC7QlkH8ReGxo+NVIWchXRLRoiWBP7S+IwleewEo5gOqDVPY3hqA9n4iiI8twg== + dependencies: + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.8.1": +"@react-stately/combobox@^3.8.1": version "3.8.1" - resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.8.1.tgz#19ed21dc2929e6a5a1e05a1858dbc7ee1f55f761" - integrity sha512-QO2hKRnXaz2L1v/KYPmDKeD+PfEScp4KiJMFzU/T9vvjxIratSTg314B25Xj4LJq+JhyxlguylxBF9r/R6qUjQ== + resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.1.tgz#71adcd16df67a5889e58c9f5dfa1465087ea6163" + integrity sha512-FaWkqTXQdWg7ptaeU4iPcqF/kxbRg2ZNUcvW/hiL/enciV5tRCsddvfNqvDvy1L30z9AUwlp9MWqzm/DhBITCw== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/overlays" "^3.6.4" + "@react-stately/select" "^3.6.1" + "@react-stately/utils" "^3.9.0" + "@react-types/combobox" "^3.10.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/data@^3.11.0": + version "3.11.0" + resolved "https://registry.npmjs.org/@react-stately/data/-/data-3.11.0.tgz#d744d868ee810126aef4a0a827ab394e3059d33a" + integrity sha512-0BlPT58WrAtUvpiEfUuyvIsGFTzp/9vA5y+pk53kGJhOdc5tqBGHi9cg40pYE/i1vdHJGMpyHGRD9nkQb8wN3Q== dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/selection" "^3.13.1" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.5.2.tgz#c6201d2f928f4bf548b743b06f855dd8bef04daa" - integrity sha512-BgGK3NleNGcByadG990ccdwr4oQiAN6meGf0gbIwrisikNdnL1XxgzCj+RMEooBtV+qakR+3KtVAnc97E5WiOQ== +"@react-stately/datepicker@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.1.tgz#1567d3035f03eed8e54ebb9b189001fad1932448" + integrity sha512-o5xLvlZGJyAbTev2yruGlV2fzQyIDuYTgL19TTt0W0WCfjGGr/AAA9GjGXXmyoRA7sZMxqIPnnv7lNrdA38ofA== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/string" "^3.2.0" + "@react-stately/form" "^3.0.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/utils" "^3.9.0" + "@react-types/datepicker" "^3.7.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/dnd@^3.2.7": + version "3.2.7" + resolved "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.7.tgz#47b72b5e6af4bdd991f4584889614406431a1538" + integrity sha512-QqSCvE9Rhp+Mr8Mt/SrByze24BFX1cy7gmXbwoqAYgHNIx3gWCVdBLqxfpfgYIhZdF9H72EWS8lQkfkZla06Ng== dependencies: - "@react-stately/overlays" "^3.5.2" - "@react-stately/utils" "^3.6.0" - "@react-types/menu" "^3.9.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-stately/selection" "^3.14.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/numberfield@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.4.2.tgz#05a2b94850cf3a1e703c6323068a11cdb15bf5ae" - integrity sha512-FFe8J38//+Ck3aSTCtWteQY6tkDi2curLPxFwkWOxq71Vv+1Zvga5pTRoa6O1k1f0OXnDkVhmU1Njcl4JRMveA== +"@react-stately/flags@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" + integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== dependencies: - "@internationalized/number" "^3.2.0" - "@react-stately/utils" "^3.6.0" - "@react-types/numberfield" "^3.4.2" - "@react-types/shared" "^3.18.1" "@swc/helpers" "^0.4.14" -"@react-stately/overlays@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.5.2.tgz#b084789fa2e3bcf30348fe09e848acccf01957c9" - integrity sha512-NEwkF/ukXzI/Ku+6j6MhhqdMc5xMgDnuR6RwFPsoPq6UoHw9/ojifxg/sDj5e1gPoegNZ2nM8G6VmnPUGabg/g== +"@react-stately/form@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.0.tgz#584af339a128045c357c1b8ca440c87460a41b0f" + integrity sha512-C8wkfFmtx1escizibhdka5JvTy9/Vp173CS9cakjvWTmnjYYC1nOlzwp7BsYWTgerCFbRY/BU/Cf/bJDxPiUKQ== + dependencies: + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/grid@^3.8.4": + version "3.8.4" + resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.4.tgz#d52534c54c1a3e5dbb56d5a93b0458cf26cbf19d" + integrity sha512-rwqV1K4lVhaiaqJkt4TfYqdJoVIyqvSm98rKAYfCNzrKcivVpoiCMJ2EMt6WlYCjDVBdEOQ7fMV1I60IV0pntA== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/list@^3.10.2": + version "3.10.2" + resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.2.tgz#5c93f33dbe8d3cc0d063fc2d59d4d4b788be379a" + integrity sha512-INt+zofkIg2KN8B95xPi9pJG7ZFWAm30oIm/lCPBqM3K1Nm03/QaAbiQj2QeJcOsG3lb7oqI6D6iwTolwJkjIQ== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/menu@^3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.6.0.tgz#5366d6674d2c3d7b50efc51a8c0083d9588788f7" + integrity sha512-OB6CjNyfOkAuirqx1oTL8z8epS9WDzLyrXjmRnxdiCU9EgRXLGAQNECuO7VIpl58oDry8tgRJiJ8fn8FivWSQA== dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/overlays" "^3.7.2" - "@swc/helpers" "^0.4.14" + "@react-stately/overlays" "^3.6.4" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.8.1": - version "3.8.1" - resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.8.1.tgz#9594044754894cd6edfdb99db8d5fc26b7e9d32c" - integrity sha512-yhz6/2y/hkDW7dzjhNsxrVZ8T7n2/Y9LyVRKDCL7ZYOkpoVQGe0ELbU04ATJPHNx6Icg/jAfN0Z/uMov/q4VBQ== +"@react-stately/numberfield@^3.8.0": + version "3.8.0" + resolved "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.8.0.tgz#0b0104b7460f3617d31ea1282fe15afb69910287" + integrity sha512-1XvB8tDOvZKcFnMM6qNLEaTVJcIc0jRFS/9jtS8MzalZvh8DbKi0Ucm1bGU7S5rkCx2QWqZ0rGOIm2h/RlcpkA== dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/radio" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@internationalized/number" "^3.5.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/numberfield" "^3.7.0" + "@swc/helpers" "^0.5.0" -"@react-stately/searchfield@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.4.2.tgz#fd9b87504dc0c394eb4be5e5d59b2b3ecdd10e2f" - integrity sha512-MGxjDY3lV4q3eFRiFbDhzicXWFdcAQ84klbFeWnSg/QLebQPyWD9X35e3Gc8bkNKof2MmwcrEgUIuHOReDRr2w== +"@react-stately/overlays@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz#1d0d974413fa3f13d97eec2cac5b48c49978d1a0" + integrity sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA== dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/searchfield" "^3.4.2" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-stately/utils" "^3.9.0" + "@react-types/overlays" "^3.8.4" + "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.5.1.tgz#15b00012f20804e640b80fe3d275ab3ceb75ac02" - integrity sha512-a6/Y3yRwinYR08Pq7Vj2HjOLtRgn5Ctmorx+UR7hBekvV/7scu9RqNI3i/yxyF+8y7KeymuwuMe1iohn4uAP+g== - dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/list" "^3.8.1" - "@react-stately/menu" "^3.5.2" - "@react-stately/selection" "^3.13.1" - "@react-stately/utils" "^3.6.0" - "@react-types/select" "^3.8.1" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/selection@^3.13.1": - version "3.13.1" - resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.13.1.tgz#17752ed81bf0f3246cd010818c460fa0d749d3a1" - integrity sha512-0B+gT6hyei/pzUSmrNliphoztOPZJ7v/xVT9b4HViRTwuOUQlmwi5BQai84EbVtgQaQghc07sJ/Y/Ec8WXCRHA== +"@react-stately/radio@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.1.tgz#d3d8bdcd6f1d9385b581094a7f2dab6836f7f229" + integrity sha512-MsBYbcLCvjKsqTAKe43T681F2XwKMsS7PLG0eplZgWP9210AMY78GeY1XPYZKHPAau8XkbYiuJqbqTerIJ3DBw== dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/slider@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.3.2.tgz#9e933fe5078ed0272f398c1c11ad078b7945b53d" - integrity sha512-UHyBdFR/3Wl1UZmwxWwJ1rb/OCYhY62zZaN7GZrVsnjQ0ng7mFqkb6O0/SXWjsfXnmRAMqCg4ARk82d1PRUfsg== - dependencies: - "@react-aria/i18n" "^3.7.2" - "@react-aria/utils" "^3.17.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@react-types/slider" "^3.5.1" - "@swc/helpers" "^0.4.14" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/radio" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.9.1.tgz#628d5099e76cf9e81926b752ec178376dec7bda1" - integrity sha512-/YWpV88RH4ElCiwNm/Ys+A5nyWhy+BwEsGTVatbjwZFmHwHxv1FeMrTiYZ9vXR7V7SMCvA8Pd9OJ9NmRkd2klg== - dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/grid" "^3.6.1" - "@react-stately/selection" "^3.13.1" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@react-types/table" "^3.6.1" - "@swc/helpers" "^0.4.14" +"@react-stately/searchfield@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.0.tgz#8493eefd684bc85117b42c7c714f6541afe54816" + integrity sha512-SStjChkn/33pEn40slKQPnBnmQYyxVazVwPjiBkdeVejC42lUVairUTrGJgF0PNoZTbxn0so2/XzjqTC9T8iCw== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/searchfield" "^3.5.2" + "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.4.1.tgz#f1d74551808f4d0a33f1c8d0e918bfbb5feeea03" - integrity sha512-8MTerdCSaZEc0qghINqIe/L/ja1Lbo5v5aFwJS014VjhYc2uFyJlTn+/kyccClBlmXpARqmiC7C3ASJ33385Fg== +"@react-stately/select@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.6.1.tgz#f2ddd1b6b1ff659388ee321a081d1da6aaa3be70" + integrity sha512-e5ixtLiYLlFWM8z1msDqXWhflF9esIRfroptZsltMn1lt2iImUlDRlOTZlMtPQzUrDWoiHXRX88sSKUM/jXjQQ== dependencies: - "@react-stately/list" "^3.8.1" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@react-types/tabs" "^3.3.0" - "@swc/helpers" "^0.4.14" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/overlays" "^3.6.4" + "@react-types/select" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.5.2.tgz#580f4254e3c7c2c4d230409a36042813d9c0ab70" - integrity sha512-2fDecu06job9NKdSIryU4AE+BoTGZqfinUsAvYTaaQN95Apq8IShEDFkY+gSnU09wRX26Ux+JJi5pYwg+HX1tw== +"@react-stately/selection@^3.14.2": + version "3.14.2" + resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.2.tgz#6a3d5b59db951c34d04494b28373f4fe8ce6f581" + integrity sha512-mL7OoiUgVWaaF7ks5XSxgbXeShijYmD4G3bkBHhqkpugU600QH6BM2hloCq8KOUupk1y8oTljPtF9EmCv375DA== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/slider@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.0.tgz#d59bcd6fe58c238772b771ffb1a5640fb22d839c" + integrity sha512-dOVpIxb7XKuiRxgpHt1bUSlsklciFki100tKIyBPR+Okar9iC/CwLYROYgVfLkGe77jEBNkor9tDLjDGEWcc1w== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/table@^3.11.4": + version "3.11.4" + resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.11.4.tgz#501c721576a373caa025b9d2967545e135500b2b" + integrity sha512-dWINJIEOKQl4qq3moq+S8xCD3m+yJqBj0dahr+rOkS+t2uqORwzsusTM35D2T/ZHZi49S2GpE7QuDa+edCynPw== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/flags" "^3.0.0" + "@react-stately/grid" "^3.8.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" + "@swc/helpers" "^0.5.0" + +"@react-stately/tabs@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.3.tgz#65bd11595624f2e0c49069758973d520c47f5b5a" + integrity sha512-Nj+Gacwa2SIzYIvHW40GsyX4Q6c8kF7GOuXESeQswbCjnwqhrSbDBp+ngPcUPUJxqFh6JhDCVwAS3wMhUoyUwA== + dependencies: + "@react-stately/list" "^3.10.2" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" + +"@react-stately/toggle@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.0.tgz#abe2f08f37a0f41e6513d4fde3d46f49500bb5cc" + integrity sha512-TRksHkCJk/Xogq4181g3CYgJf+EfsJCqX5UZDSw1Z1Kgpvonjmdf6FAfQfCh9QR2OuXUL6hOLUDVLte5OPI+5g== dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.1.tgz#cee27bfcabfa54e37e7627f71ac2e3eb2da8495d" - integrity sha512-ZHqyN/mqciKtUfQ/bwdPPPAKwVFeFfyMLkHSA34NrXr9/swj/ONBQtdRUzbu56rlajMUSw5R60hmyJOGNXZb3A== +"@react-stately/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz#e240184dedc35018f7b1e2d46eaca20a90d919bb" + integrity sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA== dependencies: - "@react-stately/overlays" "^3.5.2" - "@react-stately/utils" "^3.6.0" - "@react-types/tooltip" "^3.4.1" - "@swc/helpers" "^0.4.14" + "@react-stately/overlays" "^3.6.4" + "@react-types/tooltip" "^3.4.6" + "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.6.1.tgz#191daac8dfd52a3603e2e138cab26fd2bfd493c3" - integrity sha512-KfaUoc0/PeT9W25e/7jG1VGeTO54KDKULveuUqLFJEJeP8M8vCgT5Og4YdJkPfu//dlL8OZu1y6ZpdyA9+LBsg== +"@react-stately/tree@^3.7.5": + version "3.7.5" + resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.5.tgz#6e084e1b7d3d0b31fe619a5d5c45dea9b0a63ff2" + integrity sha512-xTJVwvhAeY0N5rui4N/TxN7f8hjXdqApDuGDxMZeFAWoQz8Abf7LFKBVQ3OkT6qVr7P+23dgoisUDBhD5a45Hg== dependencies: - "@react-stately/collections" "^3.8.0" - "@react-stately/selection" "^3.13.1" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.6.0.tgz#f273e7fcb348254347d2e88c8f0c45571060c207" - integrity sha512-rptF7iUWDrquaYvBAS4QQhOBQyLBncDeHF03WnHXAxnuPJXNcr9cXJtjJPGCs036ZB8Q2hc9BGG5wNyMkF5v+Q== +"@react-stately/utils@^3.9.0": + version "3.9.0" + resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz#9cb2c8eea5dd1b58256ecb436b963c01526bae37" + integrity sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw== dependencies: - "@swc/helpers" "^0.4.14" + "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.5.2.tgz#f646a114662c18d34afbf3b1cba81636afadb231" - integrity sha512-OmG9lPcbfnyuPhbSDVcDXDfPU0rc2E/V8VLGGd/yMOxSy4S90nWDSEoR8qAN6g9rY6xoLjPJ671nyxOu41EtyA== +"@react-stately/virtualizer@^3.6.6": + version "3.6.6" + resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.6.tgz#3eb15f15e0a578b95373cb8bd6ad4f459ff8e961" + integrity sha512-9hWvfITdE/028q4YFve6FxlmA3PdSMkUwpYA+vfaGCXI/4DFZIssBMspUeu4PTRJoV+k+m0z1wYHPmufrq6a3g== dependencies: - "@react-aria/utils" "^3.17.0" - "@react-types/shared" "^3.18.1" - "@swc/helpers" "^0.4.14" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/breadcrumbs@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.5.2.tgz#1717f3ffbad2d5da457195cb50c9d9c0a5b6be8f" - integrity sha512-pKtahBLmcpSYhfNBv2j/k0e701U7xwDCf24U/JOyio9i7aAYCZ+RUcKc1kK3tRsVNj41seLv7Q9ElC48nXsfwg== +"@react-types/breadcrumbs@^3.7.2": + version "3.7.2" + resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.2.tgz#3dc0c8ccebf75844efc56ac8e53dc072df083d5f" + integrity sha512-esl6RucDW2CNMsApJxNYfMtDaUcfLlwKMPH/loYsOBbKxGl2HsgVLMcdpjEkTRs2HCTNCbBXWpeU8AY77t+bsw== dependencies: - "@react-types/link" "^3.4.2" - "@react-types/shared" "^3.18.1" + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" -"@react-types/button@^3.7.3": - version "3.7.3" - resolved "https://registry.npmjs.org/@react-types/button/-/button-3.7.3.tgz#00ad45ff0a304a6f6ef29a5d6adda73cea10942f" - integrity sha512-Fz1t/kYinHDunmct3tADD2h3UDBPZUfRE+zCzYiymz0g+v/zYHTAqnkWToTF9ptf8HIB5L2Z2VFYpeUHFfpWzg== +"@react-types/button@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz#eb54745133bdaad345d8d589021b67ef2882e1c5" + integrity sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/calendar@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.2.1.tgz#f01bff7c373b19a18d96414b0680903ca508ae85" - integrity sha512-lp+1KG7YxKCPvXuuyB1XyyhynV8g19JamojfGUaQGqsM1kxOr8x87Ikwh5zunHuOS6U4s/tO0C2LMA9iGxdBxQ== +"@react-types/calendar@^3.4.3": + version "3.4.3" + resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.3.tgz#475c970b263a18bff87c4cbba2379aba87d1dd8a" + integrity sha512-96x57ctX5wNEl+8et3sc2NQm8neOJayEeqOQQpyPtI7jyvst/xBrKCwysf9W/dhgPlUC+KeBAYFWfjd5hFVHYA== dependencies: - "@internationalized/date" "^3.2.0" - "@react-types/shared" "^3.18.1" + "@internationalized/date" "^3.5.1" + "@react-types/shared" "^3.22.0" -"@react-types/checkbox@^3.4.4": - version "3.4.4" - resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.4.tgz#cf55e9fd0cabef6e4408d03b308c754e1add3bc1" - integrity sha512-rJNhbW4R9HTvdbF2oTZmqGiZ/WVP3/XsU4gae7tfdhSYjG+5T5h9zau1vRhz++zwKn57wfcyNn6a83GDhhgkVw== +"@react-types/checkbox@^3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.6.0.tgz#ba702be25555c1520f78be39c8260354638792b6" + integrity sha512-vgbuJzQpVCNT5AZWV0OozXCnihqrXxoZKfJFIw0xro47pT2sn3t5UC4RA9wfjDGMoK4frw1K/4HQLsQIOsPBkw== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/combobox@^3.6.2": - version "3.6.2" - resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.6.2.tgz#887cc2bce355773cb9dc5613c88264d008c92384" - integrity sha512-qitu/W3Z3/ihyqocy+8n4HZKRXF5JTMHl1ug3rKps5yCNnVdkWwjPFPM6w180c9QjquThNY3o947LZ1v59qJ4A== +"@react-types/combobox@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.10.0.tgz#d60f103f299280eb5873f9ae6c9203b5d484926d" + integrity sha512-1IXSNS02TPbguyYopaW2snU6sZusbClHrEyVr4zPeexTV4kpUUBNXOzFQ+eSQRR0r2XW57Z0yRW4GJ6FGU0yCA== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/datepicker@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.3.1.tgz#035451586577077a65b89ee739bd1e29a777a28b" - integrity sha512-kVZ9j3PovXjTIeQrq4YiURS48Rsp5Uc81/HumZyrTWtYtYSKAU0U0ifiTuPeJ044tfpi3wGkitJ5wtt8j5imKQ== +"@react-types/datepicker@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.1.tgz#a9a7e8f192a49232f919b921d7b6f8bb7667eb01" + integrity sha512-5juVDULOytNzkotqX8j5mYKJckeIpkgbHqVSGkPgLw0++FceIaSZ6RH56cqLup0pO45paqIt9zHh+QXBYX+syg== dependencies: - "@internationalized/date" "^3.2.0" - "@react-types/overlays" "^3.7.2" - "@react-types/shared" "^3.18.1" + "@internationalized/date" "^3.5.1" + "@react-types/calendar" "^3.4.3" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/dialog@^3.5.2": - version "3.5.2" - resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.2.tgz#e0dd2b459ebfeae649a93cd69f4fd12b8b043c71" - integrity sha512-eus/TivlVqA8JNunMGv9w0Ey4Fmao6BRA3/2r6WTcbXTRw+nLXMmNO2j4CzXAhtrT5j187SADP5OXZjWuEzLFw== +"@react-types/dialog@^3.5.7": + version "3.5.7" + resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.7.tgz#3fd93875ff317d6014e814b6e1a2abb87272a1ef" + integrity sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w== dependencies: - "@react-types/overlays" "^3.7.2" - "@react-types/shared" "^3.18.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/grid@^3.1.8": - version "3.1.8" - resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.8.tgz#2d8cf3ccbb2bba161917b9e242f920fed5f34026" - integrity sha512-NKk4pDbW2QXJOYnDSAYhta81CGwXOc/9tVw2WFs+1wacvxeKmh1Q+n36uAFcIdQOvVRqeGTJaYiqLFmF3fC3tA== +"@react-types/form@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/form/-/form-3.7.0.tgz#4a7d2f851e84633d3114bbc7db902b42a4cdbc75" + integrity sha512-IPmFCh3/psQqJ9X+64tpdHyRNGXDzKvsHfZq27WVxkEDN2KC0g3nnVvuwKXY6gdzYEl6B4RRcmAk8bmGoZpvqg== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/label@^3.7.4": - version "3.7.4" - resolved "https://registry.npmjs.org/@react-types/label/-/label-3.7.4.tgz#db7ce5cc82785b11ed4c80308b2ec40768fec6e0" - integrity sha512-SfTqPRI39GE3GFD5ZGYEeX9jXQrNqDeaaI36PJhnbgGVFz96oVVkhy9t9c2bMHcbhLLENYIHMzxrvVqXS07e7A== +"@react-types/grid@^3.2.3": + version "3.2.3" + resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.3.tgz#20b19b73315343630145ff9e43138e7f2855d946" + integrity sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/link@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-types/link/-/link-3.4.2.tgz#85fd550284bf1270dcbdc7c31965ea4ea0b6dfe2" - integrity sha512-EpHfphxt7QjdHbbzV9vfamDP3Xug2jLdM37Z8uu8fIvkJYbAI+r5+MMXTc4g0OMyqWU+/Ik7M+GbA+c6K9Papw== +"@react-types/link@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-types/link/-/link-3.5.2.tgz#b363abca3365adc64b49c47163ce00235c01c667" + integrity sha512-/s51/WejmpLiyxOgP89s4txgxYoGaPe8pVDItVo1h4+BhU1Puyvgv/Jx8t9dPvo6LUXbraaN+SgKk/QDxaiirw== dependencies: - "@react-aria/interactions" "^3.15.1" - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/listbox@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.2.tgz#13a217ca2c31e4e5c0ef46f00f770bf0d1b24726" - integrity sha512-qg980T+tl15pqgfuK8V6z+vsvsIrJEEPxcupQXP3T1O0LxWxJDakZHF0lV9qwfyB9XlnVSMZfkjDiZp9Wgf8QQ== +"@react-types/listbox@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.6.tgz#da0887dbb89a868d53b87486111bf0a51042da7b" + integrity sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/menu@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.1.tgz#13b9c66a16ae0b5bff752295fe94f4f60c1dbd83" - integrity sha512-VOhp/gDrFqbVV5kiqFoJCba9mxyQH2eCdR26nK3Fn92K8AAGqKt1C0naKCgdAmGp2+qTveR94Iw0iyDfMt60og== +"@react-types/menu@^3.9.6": + version "3.9.6" + resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.6.tgz#1b36842cbdb4590dfff78437316aec4a3f47b1f6" + integrity sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg== dependencies: - "@react-types/overlays" "^3.7.2" - "@react-types/shared" "^3.18.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/meter@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.2.tgz#f316eb4b47112137b0bbfc9e82b0f2814587c297" - integrity sha512-o21Zz+3LNjvBueMap+q2otGp5t2Xeb/lIMM4Y+v8j5XO+bLcHaAjdQB/TgKRe8iYFm3IqwpVtV9A38IWDtpLRQ== +"@react-types/meter@^3.3.6": + version "3.3.6" + resolved "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.6.tgz#ae5960b27012f52ca33970f2ff416af71dad274d" + integrity sha512-1XYp1fA9UU0lO6kjf3TwVE8mppOJa64mBKAcLWtTyq1e/cYIAbx5o6CsuUx0YDpXKF6gdtvIWvfmxeWsmqJ1jQ== dependencies: - "@react-types/progress" "^3.4.1" - "@react-types/shared" "^3.18.1" + "@react-types/progress" "^3.5.1" -"@react-types/numberfield@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.4.2.tgz#6773e93b611131d45a4e5c4cac561945dc5ac7f3" - integrity sha512-SGzuuFf5wCSRPvpV+bnykiXSIt8pkpBBVp8tlygB66pQSBV7VLdUvWGohaayPSM+3Z+WkU+osgzYtGq5wh+C3Q== +"@react-types/numberfield@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.7.0.tgz#a029bf2a8a07049c96ea5ffe1f7533ab2305bcf4" + integrity sha512-gaGi+vqm1Y8LCWRsWYUjcGftPIzl+8W2VOfkgKMLM8y76nnwTPtmAqs+Ap1cg7sEJSfsiKMq93e9yvP3udrC2w== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/overlays@^3.7.2": - version "3.7.2" - resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.7.2.tgz#40881c6c6e05330e0ea8960646ca2371378b95c0" - integrity sha512-I/mm/xjJVJX2VC4UwNwzhsgVKh8eTHjE2NT6Ek70t/AMR/AT8i3m+eLYb4LEoRFFuZ0ctoJDLKkSCAP7nTkT0A== +"@react-types/overlays@^3.8.4": + version "3.8.4" + resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz#a538f6f2fb9826f1da78d3b4f0f6326a709ce37d" + integrity sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/progress@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.4.1.tgz#3b45df4780b70573c27b316d557ce71b546e32bf" - integrity sha512-Y6cTvvJjbfFBeB7Zb3PizhhO3+YLWXpIP8opto15RWu11ktgZVMUgsnlsJgE3dFeoZ7UHwXdCYf8JOzBw5VPHA== +"@react-types/progress@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.1.tgz#b988cd2d2ff194c7652d74f714b230f26ab73c6c" + integrity sha512-CqsUjczUK/SfuFzDcajBBaXRTW0D3G9S/yqLDj9e8E0ii+lGDLt1PHj24t1J7E88U2rVYqmM9VL4NHTt8o3IYA== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/radio@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.4.2.tgz#4a6a1f7ff11b71b6b69d13d28fd74de9c903df8c" - integrity sha512-SE6sjZjZbyuJMJNNdlhoutVr+QFRt1Vz7DZj4UaOswW5SD/Xb+xFdW8i6ETKdRN17am/5SC89ltWe0R3q0pVkA== +"@react-types/radio@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.7.0.tgz#4610fc7f97f6ed1d54a4d314717e3605c4422fac" + integrity sha512-EcwGAXzSHjSqpFZha7xn3IUrhPiJLj+0yb1Ip0qPmhWz0VVw2DwrkY7q/jfaKroVvQhTo2TbfGhcsAQrt0fRqg== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/searchfield@^3.4.2": - version "3.4.2" - resolved "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.4.2.tgz#360ac97f52af5e2bb8e1a8a13e611fe9efc371fa" - integrity sha512-HQm++hIXVfEbjbRey6hYV/5hLEO6gtwt4Mft3u5I5BiT7yoQqQAD/8z9S8aUXDUU9KTrAKfL1DwrFQSkOsCWJA== +"@react-types/searchfield@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.2.tgz#e663899f42344243ea7b4cd6f0ab0bfe6020151e" + integrity sha512-JAK2/Kg4Dr393FYfbRw0TlXKnJPX77sq1x/ZBxtO6p64+MuuIYKqw0i9PwDlo1PViw2QI5u8GFhKA2TgemY9uA== dependencies: - "@react-types/shared" "^3.18.1" - "@react-types/textfield" "^3.7.2" + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" -"@react-types/select@^3.8.1": - version "3.8.1" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.8.1.tgz#77d8ff3be70a5c342860469d71c8c23bbc1a877f" - integrity sha512-ByVKKwgpE3d08jI+Ibuom/qphlBiDKpVMwXgFgVZRAN2YvVrsix8arSo7kmXtzekz91qqDBqtt7DBCfT0E1WKw== +"@react-types/select@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.1.tgz#12ea11e6a81629f44ceff81635b4ec12acfc6565" + integrity sha512-EpKSxrnh8HdZvOF9dHQkjivAcdIp1K81FaxmvosH8Lygqh0iYXxAdZGtKLMyBoPI8YFhA+rotIzTcOqgCCnqWA== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/shared@^3.18.1": - version "3.18.1" - resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.18.1.tgz#45bac7a1a433916d16535ea583d86a2b4c72ff8c" - integrity sha512-OpTYRFS607Ctfd6Tmhyk6t6cbFyDhO5K+etU35X50pMzpypo1b7vF0mkngEeTc0Xwl0e749ONZNPZskMyu5k8w== +"@react-types/shared@^3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz#70f85aad46cd225f7fcb29f1c2b5213163605074" + integrity sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA== -"@react-types/slider@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.5.1.tgz#bae46025de7d02a84918b3aca0e3ffd647e4fdf2" - integrity sha512-8+AMNexx7q7DqfAtQKC5tgnZdG/tIwG2tcEbFCfAQA09Djrt/xiMNz+mc7SsV1PWoWwVuSDFH9QqKPodOrJHDg== +"@react-types/slider@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.0.tgz#d9e4dbe1b2109c7accfcc0e2e330ff10cd3a837c" + integrity sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/switch@^3.3.2": - version "3.3.2" - resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.3.2.tgz#af54e2dd8b599df3214360f593827c9033478ce4" - integrity sha512-L0XF4J43Q7HCAJXqseAk6RMteK6k1jQ0zrG05r6lSCkxaS9fGUlgLTCiFUsf07x0ADH1Xyc7PwpfJjyEr5A4tA== +"@react-types/switch@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.0.tgz#8ebf07c60aef22b181eb4ab884cf3d2abddd66c6" + integrity sha512-/wNmUGjk69bP6t5k2QkAdrNN5Eb9Rz4dOyp0pCPmoeE+5haW6sV5NmtkvWX1NSc4DQz1xL/a5b+A0vxPCP22Jw== dependencies: - "@react-types/checkbox" "^3.4.4" - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/table@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-types/table/-/table-3.6.1.tgz#5c320f66a376dabc923cbddda3a19e9d4fb51c80" - integrity sha512-DeiiBZPZUO2kH40P10Bn9Y4SvDobUlH7Flgx2afL3tJirKMkS1SNDU/B+X9B5Duyd1D0okf1+PLVmi0NBqM4vg== +"@react-types/table@^3.9.2": + version "3.9.2" + resolved "https://registry.npmjs.org/@react-types/table/-/table-3.9.2.tgz#43fd0601fea554765b49a29d65510bd31310cb58" + integrity sha512-brw5JUANOzBa2rYNpN8AIl9nDZ9RwRZC6G/wTM/JhtirjC1S42oCtf8Ap5rWJBdmMG/5KOfcGNcAl/huyqb3gg== dependencies: - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" -"@react-types/tabs@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.0.tgz#d8230bac82fcd1dca414fbc1c17b769cef9c5bd8" - integrity sha512-uXDVXBBppb+9S8bhxF7LZhgptrF5ll25SX8/jrpnXOR0jpihq6K3fkSe5M/OBnGsybuyVGN7+Np5v7UUYrM5SQ== +"@react-types/tabs@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.4.tgz#43fa93a4a67dcc53031afc56a8ad3bf5f44473a8" + integrity sha512-4mCTtFrwMRypyGTZCvNYVT9CkknexO/UYvqwDm2jMYb8JgjRvxnomu776Yh7uyiYKWyql2upm20jqasEOm620w== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/textfield@^3.7.2": - version "3.7.2" - resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.7.2.tgz#f23341e80b319b68f2298dd429ed2280ada0bbe1" - integrity sha512-TsZTf1+4Ve9QHm6mbXr26uLOA4QtZPgyjYgYclL2nHoOl67algeQIFxIVfdlNIKFFMOw5BtC6Mer0I3KUWtbOQ== +"@react-types/textfield@^3.9.0": + version "3.9.0" + resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.0.tgz#ad29f0a70421f9d2cd6cf2795df10a7712954e69" + integrity sha512-D/DiwzsfkwlAg3uv8hoIfwju+zhB/hWDEdTvxQbPkntDr0kmN/QfI17NMSzbOBCInC4ABX87ViXLGxr940ykGA== dependencies: - "@react-types/shared" "^3.18.1" + "@react-types/shared" "^3.22.0" -"@react-types/tooltip@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.1.tgz#131b0a6e28a1865b8977ce108cb7b069d29e5fd8" - integrity sha512-j1QbEX4RZ/uBQa9z1lBZ9bNUa20ji/UjwrIfTNyQm3wbezSZE0PWTQAkfxZdy3PQTBnVGOHSqxAP6iOS6NqOOQ== +"@react-types/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz#1f1eb22873a5d5ad355e0de1be46f48759b55f6f" + integrity sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw== dependencies: - "@react-types/overlays" "^3.7.2" - "@react-types/shared" "^3.18.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" "@remix-run/router@1.6.2": version "1.6.2" @@ -4516,36 +4421,31 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz#f5635b36fc0dad96ef1e542a302cd914230188c0" integrity sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w== -"@safe-global/safe-apps-provider@^0.15.2": - version "0.15.2" - resolved "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.15.2.tgz#fa5c30140134e72bb969da76b80a16c545323e3a" - integrity sha512-BaoGAuY7h6jLBL7P+M6b7hd+1QfTv8uMyNF3udhiNUwA0XwfzH2ePQB13IEV3Mn7wdcIMEEUDS5kHbtAsj60qQ== +"@safe-global/safe-apps-provider@^0.18.1": + version "0.18.1" + resolved "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" + integrity sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg== dependencies: - "@safe-global/safe-apps-sdk" "7.9.0" + "@safe-global/safe-apps-sdk" "^8.1.0" events "^3.3.0" -"@safe-global/safe-apps-sdk@7.9.0": - version "7.9.0" - resolved "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-7.9.0.tgz#0c79a7760470bfdaf4cce9aa5bceef56898c7037" - integrity sha512-S2EI+JL8ocSgE3uGNaDZCzKmwfhtxXZFDUP76vN0FeaY35itFMyi8F0Vhxu0XnZm3yLzJE3tp5px6GhuQFLU6w== - dependencies: - "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" - ethers "^5.7.2" - -"@safe-global/safe-apps-sdk@^7.9.0": - version "7.11.0" - resolved "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-7.11.0.tgz#2cbc164fb70141cdf4d3331ff222cd98a2529316" - integrity sha512-RDamzPM1Lhhiiz0O+Dn6FkFqIh47jmZX+HCV/BBnBBOSKfBJE//IGD3+02zMgojXHTikQAburdPes9qmH1SA1A== +"@safe-global/safe-apps-sdk@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" + integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w== dependencies: "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" - ethers "^5.7.2" + viem "^1.0.0" "@safe-global/safe-gateway-typescript-sdk@^3.5.3": - version "3.7.3" - resolved "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.7.3.tgz#68ec7d82711e2d0f82ce2e577b1df67ba8da2bed" - integrity sha512-O6JCgXNZWG0Vv8FnOEjKfcbsP0WxGvoPJk5ufqUrsyBlHup16It6oaLnn+25nXFLBZOHI1bz8429JlqAc2t2hg== - dependencies: - cross-fetch "^3.1.5" + version "3.13.3" + resolved "https://registry.npmjs.org/@safe-global/safe-gateway-typescript-sdk/-/safe-gateway-typescript-sdk-3.13.3.tgz#f0093af02ee0af3c0dcad9ef2dc96890a80fe481" + integrity sha512-qBDM469cVCedpBpeTSn+k5FUr9+rq5bMTflp/mKd7h35uafcexvOR/PHZn2qftqV8b1kc9b8t22cPRJ2365jew== + +"@scarf/scarf@^1.1.1": + version "1.3.0" + resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.3.0.tgz#f8c75560d0dace4452dee1e31995e6396e61f3ee" + integrity sha512-lHKK8M5CTcpFj2hZDB3wIjb0KAbEOgDmiJGDv1WBRfQgRm/a8/XMEkG/N1iM01xgbUDsPQwi42D+dFo1XPAKew== "@scure/base@^1.1.3": version "1.1.3" @@ -4557,14 +4457,19 @@ resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== -"@scure/bip32@1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" - integrity sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q== +"@scure/base@~1.1.2": + version "1.1.5" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== dependencies: - "@noble/curves" "~1.0.0" - "@noble/hashes" "~1.3.0" - "@scure/base" "~1.1.0" + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" "@scure/bip39@1.1.0": version "1.1.0" @@ -4574,10 +4479,10 @@ "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" -"@scure/bip39@1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.0.tgz#a207e2ef96de354de7d0002292ba1503538fc77b" - integrity sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg== +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== dependencies: "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" @@ -4619,23 +4524,23 @@ buffer "~6.0.3" "@solana/web3.js@^1.70.1": - version "1.77.2" - resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.77.2.tgz#4b4d71f07efb9aca1f7ab3ae8746c2e79389fe39" - integrity sha512-pKu9S21NGAi6Nsayz2KEdhqOlPUJIr3L911bgQvPg2Dbk/U4gJsk41XGdxyfsfnwKPEI/KbitcByterst4VQ3g== + version "1.87.6" + resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.87.6.tgz#6744cfc5f4fc81e0f58241c0a92648a7320bb3bf" + integrity sha512-LkqsEBgTZztFiccZZXnawWa8qNCATEqE97/d0vIwjTclmVlc8pBpD1DmjfVHtZ1HS5fZorFlVhXfpwnCNDZfyg== dependencies: - "@babel/runtime" "^7.12.5" - "@noble/curves" "^1.0.0" - "@noble/hashes" "^1.3.0" + "@babel/runtime" "^7.23.2" + "@noble/curves" "^1.2.0" + "@noble/hashes" "^1.3.1" "@solana/buffer-layout" "^4.0.0" - agentkeepalive "^4.2.1" + agentkeepalive "^4.3.0" bigint-buffer "^1.1.5" - bn.js "^5.0.0" + bn.js "^5.2.1" borsh "^0.7.0" bs58 "^4.0.1" buffer "6.0.3" fast-stable-stringify "^1.0.0" - jayson "^3.4.4" - node-fetch "^2.6.7" + jayson "^4.1.0" + node-fetch "^2.6.12" rpc-websockets "^7.5.1" superstruct "^0.14.2" @@ -4956,38 +4861,45 @@ dependencies: tslib "^2.4.0" -"@tanstack/query-core@4.29.11": - version "4.29.11" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.29.11.tgz#fa338f7d6897c6be5de6d8dabd603d9b78ee48c7" - integrity sha512-8C+hF6SFAb/TlFZyS9FItgNwrw4PMa7YeX+KQYe2ZAiEz6uzg6yIr+QBzPkUwZ/L0bXvGd1sufTm3wotoz+GwQ== +"@swc/helpers@^0.5.0": + version "0.5.3" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + +"@tanstack/query-core@4.36.1": + version "4.36.1" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.36.1.tgz#79f8c1a539d47c83104210be2388813a7af2e524" + integrity sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA== -"@tanstack/query-persist-client-core@4.29.11": - version "4.29.11" - resolved "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-4.29.11.tgz#96b4b83bead480eb37e024a59fd59bfd84b0545e" - integrity sha512-CSmMZchr+446r79NJ/pjD2yfjqNqFV7k8BnqOq4yTZvXsaQLEIn3tsaU45IsPgs4N7g9OBfPUPDdapSQvck2WQ== +"@tanstack/query-persist-client-core@4.36.1": + version "4.36.1" + resolved "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-4.36.1.tgz#4d7284994bdc2a15fe6cbe7161be21e03033fe12" + integrity sha512-eocgCeI7D7TRv1IUUBMfVwOI0wdSmMkBIbkKhqEdTrnUHUQEeOaYac8oeZk2cumAWJdycu6P/wB+WqGynTnzXg== dependencies: - "@tanstack/query-core" "4.29.11" + "@tanstack/query-core" "4.36.1" "@tanstack/query-sync-storage-persister@^4.27.1": - version "4.29.11" - resolved "https://registry.npmjs.org/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.29.11.tgz#577ead9d08588a420a24ff0a8b77de427a2e6ca8" - integrity sha512-JP9U3m9YPkUelcE9+7D6fAEsNEp2ysKsH6qrd0WJtqsuhe5Zwr407NxaQ5uB2ow/MmhPOm8bxzMZw00Y7RagoQ== + version "4.36.1" + resolved "https://registry.npmjs.org/@tanstack/query-sync-storage-persister/-/query-sync-storage-persister-4.36.1.tgz#bf5d800d54416bc88f150792a53e25ed8aa8769f" + integrity sha512-yMEt5hWe2+1eclf1agMtXHnPIkxEida0lYWkfdhR8U6KXk/lO4Vca6piJmhKI85t0NHlx3l/z6zX+t/Fn5O9NA== dependencies: - "@tanstack/query-persist-client-core" "4.29.11" + "@tanstack/query-persist-client-core" "4.36.1" "@tanstack/react-query-persist-client@^4.28.0": - version "4.29.12" - resolved "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-4.29.12.tgz#a3d3dc8dc4318689b275f7329db3619b710401e1" - integrity sha512-rh6zZJB+3j8lr+YsEkVadnqmUELmqNFZQzGGsHS5col/YOjYsMe9ppqaUjIMJ2aXnFXye50sbe4KxHhSGoaNVw== + version "4.36.1" + resolved "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-4.36.1.tgz#d96fa44cdc661534379623423da596a7b5dc13a7" + integrity sha512-32I5b9aAu4NCiXZ7Te/KEQLfHbYeTNriVPrKYcvEThnZ9tlW01vLcSoxpUIsMYRsembvJUUAkzYBAiZHLOd6pQ== dependencies: - "@tanstack/query-persist-client-core" "4.29.11" + "@tanstack/query-persist-client-core" "4.36.1" "@tanstack/react-query@^4.28.0": - version "4.29.12" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.29.12.tgz#de111cf1d6c389b86acacfaf972302914cfa1208" - integrity sha512-zhcN6+zF6cxprxhTHQajHGlvxgK8npnp9uLe9yaWhGc6sYcPWXzyO4raL4HomUzQOPzu3jLvkriJQ7BOrDM8vA== + version "4.36.1" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.36.1.tgz#acb589fab4085060e2e78013164868c9c785e5d2" + integrity sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw== dependencies: - "@tanstack/query-core" "4.29.11" + "@tanstack/query-core" "4.36.1" use-sync-external-store "^1.2.0" "@testing-library/dom@^8.5.0": @@ -5113,17 +5025,24 @@ "@types/express-serve-static-core" "*" "@types/node" "*" -"@types/connect@*", "@types/connect@^3.4.33": +"@types/connect@*": version "3.4.35" resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== dependencies: "@types/node" "*" +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + "@types/debug@^4.1.7": - version "4.1.8" - resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" - integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + version "4.1.12" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" @@ -5283,9 +5202,9 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/ms@*": - version "0.7.31" - resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.34" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*": version "20.2.5" @@ -5342,7 +5261,7 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.11": +"@types/react-dom@^18.0.0": version "18.2.4" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz#13f25bfbf4e404d26f62ac6e406591451acba9e0" integrity sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw== @@ -5424,6 +5343,11 @@ "@types/react" "*" csstype "^3.0.2" +"@types/stylis@^4.0.2": + version "4.2.5" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df" + integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== + "@types/testing-library__jest-dom@^5.9.1": version "5.14.6" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.6.tgz#4887f6e1af11215428ab02777873bcede98a53b0" @@ -5560,66 +5484,47 @@ "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@us3r-network/auth-with-rainbowkit@^0.1.8": - version "0.1.8" - resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.1.8.tgz#af2039e67c3426e052b7651b0fa6028b3fd0fc6c" - integrity sha512-k4zMN8XpHNANhqIk9s1xX5JYrF7vUxnvdWImGtOiWq5Z0iixtN7HY6tTiQhKM1C3W2hD/ZgsCUBKBso11Jdc2A== +"@us3r-network/auth-with-rainbowkit@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.2.1.tgz#bce3345a54eca8499ce6a52fff2de814b27fb03b" + integrity sha512-7Futy5KEinrmbO5YPRAteLKaJyzU/3KkRkqsznrobcODVaa0ZVNcuQhdHvsivfPPkHKoxuvkD5LTCq4x8iySMQ== dependencies: - "@rainbow-me/rainbowkit" "1.0.2" - "@us3r-network/auth" "^0.2.2" + "@us3r-network/auth" "^0.2.3" buffer "^6.0.3" - viem "^0.3.37" - wagmi "^1.0.7" -"@us3r-network/auth@^0.2.2": - version "0.2.2" - resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.2.tgz#62fbed90a9d7145e42f0d2e7c738133a69cb1e6f" - integrity sha512-/N+6NvHnaTWoc3C7VQga1cB6KNqkmTg+urAkyuWhtLrNmVGq30lXhcVR+FAWldN8O1YU8gquE8SztbD0Pc/jCA== +"@us3r-network/auth@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.3.tgz#cc2e5488be6811599409fad1a3102e0dab8944f8" + integrity sha512-gBMu9eEcb6r9dkdA2jZNjUSskELmEPeWqYYKwYPD2nYdJh83p4mo8DT1/09IHuvkDIEhz0dbwZEHc5jIvORo0A== dependencies: - "@didtools/pkh-ethereum" "^0.2.1" - "@didtools/pkh-solana" "^0.1.0" - did-session "^2.0.0" - -"@us3r-network/data-model@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@us3r-network/data-model/-/data-model-0.1.0.tgz#ffd2a697615fcc7cee0a70ace4d4e26088075896" - integrity sha512-cEtg+wAYH2iuysdZXlYYYoJaFFuCKqAEww1Db2DZTroxS3+wYa86DffwAA2+j6NFFftUfL/gpkbcias6IYgx2Q== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@composedb/client" "^0.4.3" - "@composedb/types" "^0.4.3" - "@types/react-dom" "^18.0.11" - did-session "^2.0.0" - dids "^4.0.0" - react "^18.2.0" - react-dom "^18.2.0" + "@didtools/pkh-ethereum" "^0.4.1" + "@didtools/pkh-solana" "^0.1.1" + did-session "^2.1.2" -"@us3r-network/data-model@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@us3r-network/data-model/-/data-model-0.2.1.tgz#f66e33a87c9a2da6aa929b70f86bb9e1571a095c" - integrity sha512-wNbvDQ7dAAsdeq9yI/+2DSCWT/ke4X+3bYh78YAECpjpNg9CWrS2v0XI2ADAlTP2uZqZudITCVWtwGWZueLbaQ== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@composedb/client" "^0.4.3" - "@composedb/types" "^0.4.3" - did-session "^2.0.0" - dids "^4.0.0" +"@us3r-network/data-model@^0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@us3r-network/data-model/-/data-model-0.7.0.tgz#53c46e933d9b216457724abcaab6c1bd40de259d" + integrity sha512-knwoYSC4A3UZvOyWidEZdQs9vQY27R1tbcxGccSpyCHRd6VeTLCMBBOf9e+Uc4avi40G9CqHBWyFRxYBc6T/QQ== + dependencies: + "@ceramicnetwork/common" "^3.2.0" + "@composedb/client" "^0.6.0" + "@composedb/devtools" "^0.6.1" + "@composedb/types" "^0.6.0" + did-session "^2.1.2" + dids "^4.0.4" -"@us3r-network/profile@^0.4.11": - version "0.4.11" - resolved "https://registry.npmjs.org/@us3r-network/profile/-/profile-0.4.11.tgz#256ed6906b4086e59cf54c32e9efb53b6d1cca79" - integrity sha512-Ua/WPDYu+qHCKGBEUCVj5CYLKyypL/cMTzHXwoTThTumyHV0D1DQ+J3G9qDGimrtrHD4ASz+2r62d0tVTrKCrw== +"@us3r-network/profile@^0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@us3r-network/profile/-/profile-0.7.0.tgz#1764af30a9ba9120e974ef7989f19a1028c0a572" + integrity sha512-YDsCwsit4chbYgf7xCUSzB+ALcEjqFhISsMJckq18pAE/k5NjrT3F6e1F2iCbkXF2fBv+6dyycmPL6P9Wocf9A== dependencies: - "@composedb/devtools" "^0.4.3" - "@composedb/types" "^0.4.3" - "@material-design-icons/svg" "^0.14.7" + "@material-design-icons/svg" "^0.14.13" "@multiavatar/multiavatar" "^1.0.7" - "@us3r-network/data-model" "^0.1.0" - did-session "^2.0.0" + "@us3r-network/data-model" "^0.7.0" lodash.isfunction "^3.0.9" - react-aria "^3.24.0" - react-aria-components "^1.0.0-alpha.3" - styled-components "^5.3.10" + react-aria "^3.31.0" + react-aria-components "^1.0.0" + styled-components "^6.1.1" "@vanilla-extract/css@1.9.1": version "1.9.1" @@ -5655,54 +5560,49 @@ resolved "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.5.0.tgz#c921183ae518bb484299c2dc81f2acefd91c3dbe" integrity sha512-W58f2Rzz5lLmk0jbhgStVlZl5wEiPB1Ur3fRvUaBM+MrifZ3qskmFq/CiH//fEYeG5Dh9vF1qRviMMH46cX9Nw== -"@wagmi/chains@0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@wagmi/chains/-/chains-0.3.1.tgz#5d8e8ef1bcd8637c9f3ead8626595b12a01c35e4" - integrity sha512-NN5qziBLFeXnx0+3ywdiKKXUSW4H73Wc1jRrygl9GKXVPawU0GBMudwXUfV7VOu6E9vmG7Arj0pVsEwq63b2Ew== - -"@wagmi/connectors@2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@wagmi/connectors/-/connectors-2.0.0.tgz#558a7bc8b2d5f08a2c10fd14b3126adad12d1717" - integrity sha512-W7GFLdLaJiqISm65pwoe0DePLjL3klyugCwQwlunFXHNHvYSsoWkzDjb1H5XJwx9g+dTVNwJVg8TE7WfaUdilg== +"@wagmi/connectors@3.1.10": + version "3.1.10" + resolved "https://registry.npmjs.org/@wagmi/connectors/-/connectors-3.1.10.tgz#830cd788579ef56a2526574914481f2d3aabc9f7" + integrity sha512-ZLJC1QaeiZarkF07Cr9mOlVjPO1Lf5TBx+JKBms2y5fUIXlKrxCfQgO/gDCureboI+Us2X3IRI659+XacSGpbA== dependencies: "@coinbase/wallet-sdk" "^3.6.6" - "@ledgerhq/connect-kit-loader" "^1.0.1" - "@safe-global/safe-apps-provider" "^0.15.2" - "@safe-global/safe-apps-sdk" "^7.9.0" - "@walletconnect/ethereum-provider" "2.7.4" + "@safe-global/safe-apps-provider" "^0.18.1" + "@safe-global/safe-apps-sdk" "^8.1.0" + "@walletconnect/ethereum-provider" "2.10.6" "@walletconnect/legacy-provider" "^2.0.0" - "@web3modal/standalone" "^2.4.1" - abitype "0.8.1" + "@walletconnect/modal" "2.6.2" + "@walletconnect/utils" "2.10.2" + abitype "0.8.7" eventemitter3 "^4.0.7" -"@wagmi/core@1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@wagmi/core/-/core-1.0.8.tgz#c123507b0104dc1ccbc88664d0c7aae74e67e002" - integrity sha512-0NknHYf7KivPK9PXzfWP2zxNeHG9kDZEW3NXRQ7Wyd4l6LiX3pBMtHnb1grlqhzrirApqOwhzViyRaznl3IwCg== +"@wagmi/core@1.4.12": + version "1.4.12" + resolved "https://registry.npmjs.org/@wagmi/core/-/core-1.4.12.tgz#84558d1af746b2bcef02337dc3c46108242b1dd7" + integrity sha512-bLcYmmGgjtl3jAGo8X3Sm6oUwsdjbVxFMu9SWnwHdE4S9JdYeWM57dEhQgq8SYul2yQ7yY2/gimBf1Or0Ky3dQ== dependencies: - "@wagmi/chains" "0.3.1" - "@wagmi/connectors" "2.0.0" - abitype "0.8.2" + "@wagmi/connectors" "3.1.10" + abitype "0.8.7" eventemitter3 "^4.0.7" zustand "^4.3.1" -"@walletconnect/core@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.7.4.tgz#1471215ca8cc08ae4719ca1bb6d45dd1b49dea3a" - integrity sha512-nDJJZALZJI8l8JvjwZE4UmUzDzQBnTTJlQa/rc5MoGYtir0hfsQEl3sPkPcXbkkW5q+cHiynXsDcgM4740fmNQ== +"@walletconnect/core@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.10.6.tgz#786b0d2e2045c210c917e29bfa0498bbc210be20" + integrity sha512-Z4vh4ZdfcoQjgPEOxeuF9HUZCVLtV3MgRbS/awLIj/omDrFnOwlBhxi5Syr4Y8muVGC0ocRetQYHae0/gX5crQ== dependencies: "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-provider" "^1.0.12" - "@walletconnect/jsonrpc-utils" "^1.0.7" - "@walletconnect/jsonrpc-ws-connection" "^1.0.11" - "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/jsonrpc-provider" "1.0.13" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/jsonrpc-utils" "1.0.8" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "^1.1.1" "@walletconnect/logger" "^2.0.1" "@walletconnect/relay-api" "^1.0.9" "@walletconnect/relay-auth" "^1.0.4" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.7.4" - "@walletconnect/utils" "2.7.4" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" lodash.isequal "4.5.0" uint8arrays "^3.1.0" @@ -5735,19 +5635,20 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.7.4.tgz#777ad9a6229f88f766a986bb5cffaa3ff1575c0b" - integrity sha512-R5hcByY9zIsvyTHFUS+3xqtzs2REezED4tZFyXk0snJjWlnlL2EdeHaCjr5n+SIZDin4CMj1EAFC0ZrM4KoA4Q== +"@walletconnect/ethereum-provider@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.6.tgz#53720771cc2d6accd452916a853ac927f26acbaa" + integrity sha512-bBQ+yUfxLv8VxNttgNKY7nED35gSVayO/BnLHbNKvyV1gpvSCla5mWB9MsXuQs70MK0g+/qtgRVSrOtdSubaNQ== dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.4" - "@walletconnect/jsonrpc-provider" "^1.0.11" - "@walletconnect/jsonrpc-types" "^1.0.2" - "@walletconnect/jsonrpc-utils" "^1.0.7" - "@walletconnect/sign-client" "2.7.4" - "@walletconnect/types" "2.7.4" - "@walletconnect/universal-provider" "2.7.4" - "@walletconnect/utils" "2.7.4" + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "^1.0.13" + "@walletconnect/jsonrpc-types" "^1.0.3" + "@walletconnect/jsonrpc-utils" "^1.0.8" + "@walletconnect/modal" "^2.4.3" + "@walletconnect/sign-client" "2.10.6" + "@walletconnect/types" "2.10.6" + "@walletconnect/universal-provider" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" "@walletconnect/events@^1.0.1": @@ -5767,7 +5668,7 @@ "@walletconnect/time" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-http-connection@^1.0.4": +"@walletconnect/jsonrpc-http-connection@^1.0.4", "@walletconnect/jsonrpc-http-connection@^1.0.7": version "1.0.7" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.7.tgz#a6973569b8854c22da707a759d241e4f5c2d5a98" integrity sha512-qlfh8fCfu8LOM9JRR9KE0s0wxP6ZG9/Jom8M0qsoIQeKF3Ni0FyV4V1qy/cc7nfI46SLQLSl4tgWSfLiE1swyQ== @@ -5777,7 +5678,7 @@ cross-fetch "^3.1.4" tslib "1.14.1" -"@walletconnect/jsonrpc-provider@^1.0.11", "@walletconnect/jsonrpc-provider@^1.0.12", "@walletconnect/jsonrpc-provider@^1.0.6": +"@walletconnect/jsonrpc-provider@1.0.13", "@walletconnect/jsonrpc-provider@^1.0.13", "@walletconnect/jsonrpc-provider@^1.0.6": version "1.0.13" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.13.tgz#9a74da648d015e1fffc745f0c7d629457f53648b" integrity sha512-K73EpThqHnSR26gOyNEL+acEex3P7VWZe6KE12ZwKzAt2H4e5gldZHbjsu2QR9cLeJ8AXuO7kEMOIcRv1QEc7g== @@ -5786,7 +5687,7 @@ "@walletconnect/safe-json" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": +"@walletconnect/jsonrpc-types@1.0.3", "@walletconnect/jsonrpc-types@^1.0.2", "@walletconnect/jsonrpc-types@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz#65e3b77046f1a7fa8347ae02bc1b841abe6f290c" integrity sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw== @@ -5794,7 +5695,7 @@ keyvaluestorage-interface "^1.0.0" tslib "1.14.1" -"@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": +"@walletconnect/jsonrpc-utils@1.0.8", "@walletconnect/jsonrpc-utils@^1.0.4", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.7", "@walletconnect/jsonrpc-utils@^1.0.8": version "1.0.8" resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72" integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw== @@ -5803,24 +5704,24 @@ "@walletconnect/jsonrpc-types" "^1.0.3" tslib "1.14.1" -"@walletconnect/jsonrpc-ws-connection@^1.0.11": - version "1.0.11" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.11.tgz#1ce59d86f273d576ca73385961303ebd44dd923f" - integrity sha512-TiFJ6saasKXD+PwGkm5ZGSw0837nc6EeFmurSPgIT/NofnOV4Tv7CVJqGQN0rQYoJUSYu21cwHNYaFkzNpUN+w== +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.2" events "^3.3.0" - tslib "1.14.1" ws "^7.5.1" -"@walletconnect/keyvaluestorage@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.0.2.tgz#92f5ca0f54c1a88a093778842ce0c874d86369c8" - integrity sha512-U/nNG+VLWoPFdwwKx0oliT4ziKQCEoQ27L5Hhw8YOFGA2Po9A9pULUYNWhDgHkrb0gYDNt//X7wABcEWWBd3FQ== +"@walletconnect/keyvaluestorage@^1.0.2", "@walletconnect/keyvaluestorage@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== dependencies: - safe-json-utils "^1.1.1" - tslib "1.14.1" + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" "@walletconnect/legacy-client@^2.0.0": version "2.0.0" @@ -5890,6 +5791,31 @@ pino "7.11.0" tslib "1.14.1" +"@walletconnect/modal-core@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2.tgz#d73e45d96668764e0c8668ea07a45bb8b81119e9" + integrity sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA== + dependencies: + valtio "1.11.2" + +"@walletconnect/modal-ui@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz#fa57c087c57b7f76aaae93deab0f84bb68b59cf9" + integrity sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA== + dependencies: + "@walletconnect/modal-core" "2.6.2" + lit "2.8.0" + motion "10.16.2" + qrcode "1.5.3" + +"@walletconnect/modal@2.6.2", "@walletconnect/modal@^2.4.3": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz#4b534a836f5039eeb3268b80be7217a94dd12651" + integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== + dependencies: + "@walletconnect/modal-core" "2.6.2" + "@walletconnect/modal-ui" "2.6.2" + "@walletconnect/randombytes@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b" @@ -5927,19 +5853,19 @@ dependencies: tslib "1.14.1" -"@walletconnect/sign-client@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.7.4.tgz#e07db5856f9e45945080a169bbd9cb6849576bac" - integrity sha512-hZoCB51GB4u32yxzYnxp8dpzXgo6E7ZWUVOgnihmoMPjgJahPtvB/Ip9jYxI3fuV+ZPQYNlxQgEvR9X+2fLz+g== +"@walletconnect/sign-client@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.10.6.tgz#722d2c2844565e2826dce6a6d3a36c9b3ca1ea91" + integrity sha512-EvUWjaZBQu2yKnH5/5F2qzbuiIuUN9ZgrNKgvXkw5z1Dq5RJCks0S9/MFlKH/ZSGqXnLl7uAzBXtoX4sMgbCMA== dependencies: - "@walletconnect/core" "2.7.4" + "@walletconnect/core" "2.10.6" "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-utils" "^1.0.7" + "@walletconnect/jsonrpc-utils" "1.0.8" "@walletconnect/logger" "^2.0.1" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.7.4" - "@walletconnect/utils" "2.7.4" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" "@walletconnect/time@^1.0.2": @@ -5949,49 +5875,79 @@ dependencies: tslib "1.14.1" -"@walletconnect/types@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.7.4.tgz#958864e7ef497206a24db0ca629a478ca8e1cc08" - integrity sha512-Nagfz8DqLxf0UlVd7xopgBX60EJp1xUEq7J30ALlTbWqEhCHuLK/qPk5vGdJ9Q6+ZDpTW9ShLq1DNf+5nVpVDQ== +"@walletconnect/types@2.10.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.10.2.tgz#68e433a29ec2cf42d79d8b50c77bd5c1d91db721" + integrity sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ== dependencies: "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" - "@walletconnect/jsonrpc-types" "^1.0.2" + "@walletconnect/jsonrpc-types" "1.0.3" "@walletconnect/keyvaluestorage" "^1.0.2" "@walletconnect/logger" "^2.0.1" events "^3.3.0" -"@walletconnect/universal-provider@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.7.4.tgz#f21dcaf89c102bda79f13e92c45833f8f1196775" - integrity sha512-suH3o5LpTX7hlx5lU98oLdEM0Ws5ZysjQ4Zr6EWIK1DVT8EDdWbw49ggJSW9IYRLQ2xG22jDvmTIdFAexYOgng== +"@walletconnect/types@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.10.6.tgz#d9920ed4fd0113e0addbda8e7e73a5176a3163fd" + integrity sha512-WgHfiTG1yakmxheaBRiXhUdEmgxwrvsAdOIWaMf/spvrzVKYh6sHI3oyEEky5qj5jjiMiyQBeB57QamzCotbcQ== dependencies: - "@walletconnect/jsonrpc-http-connection" "^1.0.4" - "@walletconnect/jsonrpc-provider" "^1.0.11" + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/universal-provider@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.10.6.tgz#1a6c42517581f11ce275474bc70d0eb4f1044525" + integrity sha512-CEivusqqoD31BhCTKp08DnrccfGjwD9MFjZs5BNRorDteRFE8zVm9LmP6DSiNJCw82ZajGlZThggLQ/BAATfwA== + dependencies: + "@walletconnect/jsonrpc-http-connection" "^1.0.7" + "@walletconnect/jsonrpc-provider" "1.0.13" "@walletconnect/jsonrpc-types" "^1.0.2" "@walletconnect/jsonrpc-utils" "^1.0.7" "@walletconnect/logger" "^2.0.1" - "@walletconnect/sign-client" "2.7.4" - "@walletconnect/types" "2.7.4" - "@walletconnect/utils" "2.7.4" - eip1193-provider "1.0.1" + "@walletconnect/sign-client" "2.10.6" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" -"@walletconnect/utils@2.7.4": - version "2.7.4" - resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.7.4.tgz#314a164aabb7551dae4ac58e63312c9ae6369e1e" - integrity sha512-2WEeKB9h/FQvyNmIBYwLtjdLm3Oo55EwtJoxkC00SA7xjf8jYxZ8q2y4P/CJP8oO5ruxBK5Ft0smKvPHXsE58Q== +"@walletconnect/utils@2.10.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.10.2.tgz#1f2c6a2f1bb95bcc4517b1e94aa7164c9286eb46" + integrity sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.2" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/utils@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.10.6.tgz#749b37d14e291e346862e7027ec7548463350226" + integrity sha512-oRsWWhN2+hi3aiDXrQEOfysz6FHQJGXLsNQPVt+WIBJplO6Szmdau9dbleD88u1iiT4GKPqE0R9FOYvvPm1H/w== dependencies: "@stablelib/chacha20poly1305" "1.0.1" "@stablelib/hkdf" "1.0.1" "@stablelib/random" "^1.0.2" "@stablelib/sha256" "1.0.1" "@stablelib/x25519" "^1.0.3" - "@walletconnect/jsonrpc-utils" "^1.0.7" "@walletconnect/relay-api" "^1.0.9" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.7.4" + "@walletconnect/types" "2.10.6" "@walletconnect/window-getters" "^1.0.1" "@walletconnect/window-metadata" "^1.0.1" detect-browser "5.3.0" @@ -6013,32 +5969,6 @@ "@walletconnect/window-getters" "^1.0.1" tslib "1.14.1" -"@web3modal/core@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@web3modal/core/-/core-2.4.1.tgz#9b0a60aa88ef8518de7a30bab1278b2c9f046012" - integrity sha512-v6Y/eQJSI2YfUTv8rGqjFabqdk3ZPjx6Fe7j5Q8fw0ZWF1YRGM3mySG457qtKQ7D7E1kNKA3BHbaOZ3pgQoG6A== - dependencies: - buffer "6.0.3" - valtio "1.10.5" - -"@web3modal/standalone@^2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@web3modal/standalone/-/standalone-2.4.1.tgz#e10330583ce7b550ba676e4c595ac8ea8715bcdb" - integrity sha512-ZrI5LwWeT9sd8A3FdIX/gBp3ZrzrX882Ln1vJN0LTCmeP2OUsYcW5bPxjv1PcJ1YUBY7Tg4aTgMUnAVTTuqb+w== - dependencies: - "@web3modal/core" "2.4.1" - "@web3modal/ui" "2.4.1" - -"@web3modal/ui@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@web3modal/ui/-/ui-2.4.1.tgz#c1c5a8bf4cd749febd15411ec710b22215e66e56" - integrity sha512-x1ceyd3mMJsIHs5UUTLvE+6qyCjhyjL6gB/wVmTDbwASHSQIVyshQJ+s7BwIEMP/pbAsYDg+/M8EiUuE+/E/kg== - dependencies: - "@web3modal/core" "2.4.1" - lit "2.7.4" - motion "10.15.5" - qrcode "1.5.3" - "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": version "1.11.6" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" @@ -6215,15 +6145,15 @@ abab@^2.0.3, abab@^2.0.5: resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abitype@0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/abitype/-/abitype-0.8.1.tgz#9575a21da88bb4094a262a653e526a088ab06041" - integrity sha512-n8Di6AWb3i7HnEkBvecU6pG0a5nj5YwMvdAIwPLsQK95ulRy/XS113s/RXvSfTX1iOQJYFrEO3/q4SMWu7OwTA== +abitype@0.8.7: + version "0.8.7" + resolved "https://registry.npmjs.org/abitype/-/abitype-0.8.7.tgz#e4b3f051febd08111f486c0cc6a98fa72d033622" + integrity sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w== -abitype@0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/abitype/-/abitype-0.8.2.tgz#cacd330d07488a4020d84f54fc361361234b9c83" - integrity sha512-B1ViNMGpfx/qjVQi0RTc2HEFHuR9uoCoTEkwELT5Y7pBPtBbctYijz9BK6+Kd0hQ3S70FhYTO2dWWk0QNUEXMA== +abitype@0.9.8: + version "0.9.8" + resolved "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" + integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" @@ -6261,6 +6191,11 @@ acorn@^7.1.1: resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.10.0: + version "8.11.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: version "8.8.2" resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" @@ -6296,13 +6231,11 @@ agent-base@6: dependencies: debug "4" -agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== +agentkeepalive@^4.3.0: + version "4.5.0" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== dependencies: - debug "^4.1.0" - depd "^2.0.0" humanize-ms "^1.2.1" ahocorasick@1.0.2: @@ -6395,7 +6328,7 @@ any-promise@^1.0.0: resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -6408,6 +6341,11 @@ apg-js@^4.1.3: resolved "https://registry.npmjs.org/apg-js/-/apg-js-4.1.3.tgz#0cb9dc99f8830740d7a8f9fc0048fa618ae4d199" integrity sha512-XYyDcoBho8OpnWPRnedMwyL+76ovCtsESerHZEfY39dO4IrEqN97mdEYkOyHa0XTX5+3+U5FmpqPLttK0f7n6g== +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + arg@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -6583,12 +6521,14 @@ axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== -axios@^0.21.0: - version "0.21.4" - resolved "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" axobject-query@^3.1.1: version "3.1.1" @@ -6776,11 +6716,6 @@ batch@0.6.1: resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== -bech32@1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - bech32@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" @@ -6813,6 +6748,11 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.2.1.tgz#acf886751724273bccd187a2cc407ebddefb4053" integrity sha512-roLlzeQ0okNjT8Ph9zL9Nvw85ucHSQkNndLRfAR2CVaYOEAMtbpIK3f6oJb3Jv/hg9mkrYaw/DknysTuvc8QhA== +bignumber.js@*: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -6840,7 +6780,7 @@ bn.js@^4.11.9: resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -6964,9 +6904,9 @@ buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: ieee754 "^1.2.1" bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== + version "4.0.8" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== dependencies: node-gyp-build "^4.3.0" @@ -7013,6 +6953,15 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== + dependencies: + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -7071,15 +7020,6 @@ canonicalize@^2.0.0: resolved "https://registry.npmjs.org/canonicalize/-/canonicalize-2.0.0.tgz#32be2cef4446d67fd5348027a384cae28f17226a" integrity sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - cartonne@^2.1.1: version "2.2.0" resolved "https://registry.npmmirror.com/cartonne/-/cartonne-2.2.0.tgz#29cb4b7a34fe1185172fe815a7bbb79b42bf8477" @@ -7125,28 +7065,15 @@ chalk@^3.0.0: chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/change-case/-/change-case-5.3.0.tgz#b2fc5a8bea0cf8b4856a5a9aaf79abd8ea5309f6" + integrity sha512-Eykca0fGS/xYlx2fG5NqnGSnsWauhSGiSXYhB1kO6E909GUfo8S54u4UZNS7lMJmgZumZ2SUpWaoLgAcfQRICg== char-regex@^1.0.2: version "1.0.2" @@ -7188,6 +7115,13 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== +citty@^0.1.4, citty@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" + integrity sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ== + dependencies: + consola "^3.2.3" + cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" @@ -7200,6 +7134,15 @@ clean-css@^5.2.2: dependencies: source-map "~0.6.0" +clipboardy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== + dependencies: + arch "^2.2.0" + execa "^5.1.1" + is-wsl "^2.2.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -7228,6 +7171,16 @@ clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +cluster-key-slot@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -7404,14 +7357,10 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== content-disposition@0.5.4: version "0.5.4" @@ -7430,6 +7379,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +cookie-es@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz#4759684af168dfc54365b2c2dda0a8d7ee1e4865" + integrity sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -7501,13 +7455,27 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cross-fetch@^3.1.4, cross-fetch@^3.1.5: +cross-fetch@^3.1.4: + version "3.1.8" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +cross-fetch@^3.1.5: version "3.1.6" resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== dependencies: node-fetch "^2.6.11" +cross-inspect@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz#5fda1af759a148594d2d58394a9e21364f6849af" + integrity sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ== + dependencies: + tslib "^2.4.0" + cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -7603,7 +7571,7 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" -css-to-react-native@^3.0.0: +css-to-react-native@^3.0.0, css-to-react-native@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== @@ -7731,11 +7699,16 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^3.0.2, csstype@^3.0.7: +csstype@^3.0.2: version "3.1.2" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csstype@^3.0.7, csstype@^3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: version "3.2.4" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" @@ -8107,6 +8080,15 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -8120,6 +8102,11 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +defu@^6.1.2, defu@^6.1.3: + version "6.1.3" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" + integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== + delaunator@5: version "5.0.0" resolved "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" @@ -8137,7 +8124,12 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@^2.0.0: +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + +depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -8147,6 +8139,11 @@ depd@~1.1.2: resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== +destr@^2.0.1, destr@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz#8d3c0ee4ec0a76df54bc8b819bca215592a8c218" + integrity sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -8157,6 +8154,11 @@ detect-browser@5.3.0, detect-browser@^5.3.0: resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -8213,17 +8215,18 @@ did-resolver@^4.0.1, did-resolver@^4.1.0: resolved "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6" integrity sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA== -did-session@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/did-session/-/did-session-2.0.1.tgz#25b784c37dd26370a26b711e5584b829cef98f73" - integrity sha512-z4Q2cqD1Wtrmd8Hc54Ia1vwAGHg7la1ine+CIle46cn9ccRKMtKpj+CiP/WpI8qJfImVJDTzePoCJ+fh8OI7Qg== +did-session@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/did-session/-/did-session-2.1.2.tgz#563576b581fe31b6d01234b8b7603afd2926003e" + integrity sha512-6tMGZ6Q4gRJYjH5bocwL4Te55UF0MIA+fNOaEAhK0Xbq4PAYxCnL1e0zhe4jwSbTqU8ilaoUoE2r6McAFZTDMQ== dependencies: - "@ceramicnetwork/stream-tile" "^2.16.0" + "@didtools/key-webcrypto" "^0.1.2" "@stablelib/random" "^1.0.1" - dids "^4.0.1" + caip "^1.1.0" + dids "^4.0.3" key-did-provider-ed25519 "^3.0.1" key-did-resolver "^3.0.0" - uint8arrays "^4.0.3" + uint8arrays "^4.0.9" dids@^4.0.0, dids@^4.0.1: version "4.0.1" @@ -8240,7 +8243,7 @@ dids@^4.0.0, dids@^4.0.1: rpc-utils "^0.6.1" uint8arrays "^4.0.3" -dids@^4.0.4: +dids@^4.0.3, dids@^4.0.4: version "4.0.4" resolved "https://registry.npmmirror.com/dids/-/dids-4.0.4.tgz#b84e10f0d41554c91cfe9f06f731bfc1f70cfe60" integrity sha512-PKxQP0QFqgeMe0dbL7LCRdPJVhZU2ejj8RWCfJ6vro3a+o5o32cWNM1X6YXpdIWq6G5fTJw9KO2dHj2ZzYDc7w== @@ -8441,13 +8444,6 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -eip1193-provider@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3" - integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g== - dependencies: - "@json-rpc-tools/provider" "^1.5.5" - ejs@^3.1.6, ejs@^3.1.9: version "3.1.9" resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" @@ -9007,42 +9003,6 @@ eth-rpc-errors@^4.0.2: dependencies: fast-safe-stringify "^2.0.6" -ethers@^5.7.2: - version "5.7.2" - resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - eventemitter3@^4.0.0, eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -9053,7 +9013,7 @@ events@^3.2.0, events@^3.3.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -9185,9 +9145,9 @@ fast-querystring@^1.1.1: fast-decode-uri-component "^1.0.1" fast-redact@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.2.0.tgz#b1e2d39bc731376d28bde844454fa23e26919987" - integrity sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw== + version "3.3.0" + resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634" + integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ== fast-safe-stringify@^2.0.6: version "2.1.1" @@ -9351,11 +9311,16 @@ focus-lock@^0.11.6: dependencies: tslib "^2.0.3" -follow-redirects@^1.0.0, follow-redirects@^1.14.0: +follow-redirects@^1.0.0: version "1.15.2" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -9391,6 +9356,15 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -9445,6 +9419,11 @@ function-bind@^1.1.1: resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + function.prototype.name@^1.1.5: version "1.1.5" resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" @@ -9485,6 +9464,16 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-nonce@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" @@ -9500,6 +9489,11 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port-please@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.1.tgz#2556623cddb4801d823c0a6a15eec038abb483be" + integrity sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -9750,17 +9744,10 @@ graphql-relay@^0.10.0: resolved "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.10.0.tgz#3b661432edf1cb414cd4a132cf595350e524db2b" integrity sha512-44yBuw2/DLNEiMypbNZBt1yMDbBmyVPVesPywnteGGALiBmdyy1JP8jSg8ClLePg8ZZxk0O4BLhd1a6U/1jDOQ== -graphql-scalars@^1.21.3: - version "1.22.1" - resolved "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.22.1.tgz#e50087ff94357eb2e932f56da76ba137e9f9212b" - integrity sha512-PurWR2/a78EpYapRyPttBDfjIdsSg7q5or6cTaaGyZSV/VDh3o/6m6/BIpvGKGvmE3sY94UrLOZaCHskF5MuiA== - dependencies: - tslib "^2.5.0" - -graphql-scalars@^1.22.2: - version "1.22.2" - resolved "https://registry.npmmirror.com/graphql-scalars/-/graphql-scalars-1.22.2.tgz#6326e6fe2d0ad4228a9fea72a977e2bf26b86362" - integrity sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ== +graphql-scalars@^1.22.4: + version "1.22.4" + resolved "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.22.4.tgz#af092b142bcfd5c1f8c53cb70ee1955ecd4ddb03" + integrity sha512-ILnv7jq5VKHLUyoaTFX7lgYrjCd6vTee9i8/B+D4zJKJT5TguOl0KkpPEbXHjmeor8AZYrVsrYUHdqRBMX1pjA== dependencies: tslib "^2.5.0" @@ -9774,11 +9761,6 @@ graphql@15.4.0: resolved "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== -graphql@^16.5.0: - version "16.6.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== - graphql@^16.8.1: version "16.8.1" resolved "https://registry.npmmirror.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" @@ -9791,6 +9773,20 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +h3@^1.8.1, h3@^1.8.2: + version "1.9.0" + resolved "https://registry.npmjs.org/h3/-/h3-1.9.0.tgz#c5f512a93026df9837db6f30c9ef51135dd46752" + integrity sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA== + dependencies: + cookie-es "^1.0.0" + defu "^6.1.3" + destr "^2.0.2" + iron-webcrypto "^1.0.0" + radix3 "^1.1.0" + ufo "^1.3.2" + uncrypto "^0.1.3" + unenv "^1.7.4" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -9855,19 +9851,18 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - hey-listen@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" @@ -10020,6 +10015,11 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-shutdown@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f" + integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -10040,6 +10040,15 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +i18n-js@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/i18n-js/-/i18n-js-4.3.2.tgz#ec5391f23c76f5374b53645c83d272914eb81291" + integrity sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA== + dependencies: + bignumber.js "*" + lodash "*" + make-plural "*" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -10059,6 +10068,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + idb@^7.0.1: version "7.1.1" resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" @@ -10171,6 +10185,21 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ioredis@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" + integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== + dependencies: + "@ioredis/commands" "^1.1.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -10181,6 +10210,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +iron-webcrypto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz#e3b689c0c61b434a0a4cb82d0aeabbc8b672a867" + integrity sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg== + is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -10386,7 +10420,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.9: version "1.1.10" resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -10397,6 +10431,13 @@ is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: gopd "^1.0.1" has-tostringtag "^1.0.0" +is-typed-array@^1.1.3: + version "1.1.12" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typedarray@1.0.0, is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -10459,6 +10500,11 @@ isomorphic-ws@^4.0.1: resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +isows@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -10516,10 +10562,10 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jayson@^3.4.4: - version "3.7.0" - resolved "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz#b735b12d06d348639ae8230d7a1e2916cb078f25" - integrity sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ== +jayson@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" + integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== dependencies: "@types/connect" "^3.4.33" "@types/node" "^12.12.54" @@ -10531,7 +10577,6 @@ jayson@^3.4.4: eyes "^0.1.8" isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" - lodash "^4.17.20" uuid "^8.3.2" ws "^7.4.5" @@ -11086,6 +11131,11 @@ jiti@^1.18.2: resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + js-sha3@0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -11240,6 +11290,11 @@ json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -11287,9 +11342,9 @@ jszip@*, jszip@^3.10.1: setimmediate "^1.0.5" keccak@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + version "3.0.4" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" @@ -11404,30 +11459,53 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" +listhen@^1.5.5: + version "1.5.5" + resolved "https://registry.npmjs.org/listhen/-/listhen-1.5.5.tgz#58915512af70f770aa3e9fb19367adf479bb58c4" + integrity sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA== + dependencies: + "@parcel/watcher" "^2.3.0" + "@parcel/watcher-wasm" "2.3.0" + citty "^0.1.4" + clipboardy "^3.0.0" + consola "^3.2.3" + defu "^6.1.2" + get-port-please "^3.1.1" + h3 "^1.8.1" + http-shutdown "^1.2.2" + jiti "^1.20.0" + mlly "^1.4.2" + node-forge "^1.3.1" + pathe "^1.1.1" + std-env "^3.4.3" + ufo "^1.3.0" + untun "^0.1.2" + uqr "^0.1.2" + lit-element@^3.3.0: - version "3.3.2" - resolved "https://registry.npmjs.org/lit-element/-/lit-element-3.3.2.tgz#9913bf220b85065f0e5f1bb8878cc44f36b50cfa" - integrity sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ== + version "3.3.3" + resolved "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz#10bc19702b96ef5416cf7a70177255bfb17b3209" + integrity sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA== dependencies: "@lit-labs/ssr-dom-shim" "^1.1.0" "@lit/reactive-element" "^1.3.0" - lit-html "^2.7.0" + lit-html "^2.8.0" -lit-html@^2.7.0: - version "2.7.4" - resolved "https://registry.npmjs.org/lit-html/-/lit-html-2.7.4.tgz#6d75001977c206683685b9d76594a516afda2954" - integrity sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g== +lit-html@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" + integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== dependencies: "@types/trusted-types" "^2.0.2" -lit@2.7.4: - version "2.7.4" - resolved "https://registry.npmjs.org/lit/-/lit-2.7.4.tgz#ca63d27fda178dbffae0faf2c882b9910e40842c" - integrity sha512-cgD7xrZoYr21mbrkZIuIrj98YTMw/snJPg52deWVV4A8icLyNHI3bF70xsJeAgwTuiq5Kkd+ZR8gybSJDCPB7g== +lit@2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== dependencies: "@lit/reactive-element" "^1.6.0" lit-element "^3.3.0" - lit-html "^2.7.0" + lit-html "^2.8.0" loader-runner@^4.2.0: version "4.3.0" @@ -11485,6 +11563,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== + lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -11515,7 +11603,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: +lodash@*, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11542,6 +11630,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.0.2: + version "10.1.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -11575,6 +11668,11 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" +make-plural@*: + version "7.3.0" + resolved "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz#2889dbafca2fb097037c47967d3e3afa7e48a52c" + integrity sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -11687,6 +11785,11 @@ mime@1.6.0: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -11747,22 +11850,37 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" +mlly@^1.2.0, mlly@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" + integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== + dependencies: + acorn "^8.10.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.3.0" + monaco-editor@^0.38.0: version "0.38.0" resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.38.0.tgz#7b3cd16f89b1b8867fcd3c96e67fccee791ff05c" integrity sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A== -motion@10.15.5: - version "10.15.5" - resolved "https://registry.npmjs.org/motion/-/motion-10.15.5.tgz#d336ddbdd37bc28bb99fbb243fe309df6c685ad6" - integrity sha512-ejP6KioN4pigTGxL93APzOnvtLklParL59UQB2T3HWXQBxFcIp5/7YXFmkgiA6pNKKzjvnLhnonRBN5iSFMnNw== +motion@10.16.2: + version "10.16.2" + resolved "https://registry.npmjs.org/motion/-/motion-10.16.2.tgz#7dc173c6ad62210a7e9916caeeaf22c51e598d21" + integrity sha512-p+PurYqfUdcJZvtnmAqu5fJgV2kR0uLFQuBKtLeFVTrYEVllI99tiOTSefVNYuip9ELTEkepIIDftNdze76NAQ== dependencies: "@motionone/animation" "^10.15.1" - "@motionone/dom" "^10.15.5" - "@motionone/svelte" "^10.15.5" + "@motionone/dom" "^10.16.2" + "@motionone/svelte" "^10.16.2" "@motionone/types" "^10.15.1" "@motionone/utils" "^10.15.1" - "@motionone/vue" "^10.15.5" + "@motionone/vue" "^10.16.2" + +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== ms@2.0.0: version "2.0.0" @@ -11779,13 +11897,6 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -11799,11 +11910,16 @@ multiformats@^11.0.0, multiformats@^11.0.1, multiformats@^11.0.2: resolved "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg== -multiformats@^12.0.0, multiformats@^12.0.1, multiformats@^12.1.0, multiformats@^12.1.1: +multiformats@^12.0.0, multiformats@^12.0.1: version "12.1.2" resolved "https://registry.npmmirror.com/multiformats/-/multiformats-12.1.2.tgz#eef67872da3f34b9a4a7ca7dd1ffdf3074f5c517" integrity sha512-6mRIsrZXyw5xNPO31IGBMmxgDXBSgCGDsBAtazkZ02ip4hMwZNrQvfxXZtytRoBSWuzSq5f9VmMnXj76fIz5FQ== +multiformats@^12.1.3: + version "12.1.3" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e" + integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw== + multiformats@^9.4.2, multiformats@^9.5.4, multiformats@^9.6.5: version "9.9.0" resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" @@ -11817,15 +11933,6 @@ multihashes-sync@^1.1.1: "@noble/hashes" "^1.3.0" multiformats "^11.0.0" -multihashes@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - mz@^2.7.0: version "2.7.0" resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -11840,6 +11947,16 @@ nanoid@^3.3.1, nanoid@^3.3.6: resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-wasm@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" + integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -11881,22 +11998,39 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7: +node-addon-api@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" + integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA== + +node-fetch-native@^1.4.0, node-fetch-native@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" + integrity sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w== + +node-fetch@^2.6.1, node-fetch@^2.6.11: version "2.6.11" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== dependencies: whatwg-url "^5.0.0" -node-forge@^1: +node-fetch@^2.6.12: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + version "4.7.1" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" + integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== node-int64@^0.4.0: version "0.4.0" @@ -12057,6 +12191,15 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +ofetch@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz#588cb806a28e5c66c2c47dd8994f9059a036d8c0" + integrity sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg== + dependencies: + destr "^2.0.1" + node-fetch-native "^1.4.0" + ufo "^1.3.0" + on-exit-leak-free@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" @@ -12222,14 +12365,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -12265,6 +12400,11 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -12342,6 +12482,15 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -12906,10 +13055,19 @@ postcss@^8.3.5, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.31: + version "8.4.32" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact@^10.12.0, preact@^10.5.9: - version "10.15.1" - resolved "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz#a1de60c9fc0c79a522d969c65dcaddc5d994eede" - integrity sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g== + version "10.19.3" + resolved "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" + integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== prelude-ls@^1.2.1: version "1.2.1" @@ -13022,6 +13180,11 @@ proxy-compare@2.5.1: resolved "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.5.1.tgz#17818e33d1653fbac8c2ec31406bce8a2966f600" integrity sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.33: version "1.9.0" resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -13123,6 +13286,11 @@ quick-format-unescaped@^4.0.3: resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== +radix3@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.0.tgz#9745df67a49c522e94a33d0a93cf743f104b6e0d" + integrity sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A== + raf@^3.4.1: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -13169,64 +13337,69 @@ react-app-polyfill@^3.0.0: regenerator-runtime "^0.13.9" whatwg-fetch "^3.6.2" -react-aria-components@^1.0.0-alpha.3, react-aria-components@^1.0.0-alpha.4: - version "1.0.0-alpha.4" - resolved "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.0.0-alpha.4.tgz#5a6fab82d92f1c73734478fd33f1a5168ffe34b3" - integrity sha512-cv8+mF5AykoOH0nV2gkQqzJSz7Cqfv5p2kVup2HCRM5CSeourC69d6mKI5htka4XYcrw9E4G0KtRqQnc9/J4DA== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-aria/focus" "^3.12.1" - "@react-aria/utils" "^3.17.0" - "@react-stately/table" "^3.9.1" - "@react-types/grid" "^3.1.8" - "@react-types/shared" "^3.18.1" - "@react-types/table" "^3.6.1" - "@swc/helpers" "^0.4.14" - react-aria "^3.25.0" - react-stately "^3.23.0" +react-aria-components@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.0.0.tgz#3e88a805263156e7fd551ec3f0336d75c59b2824" + integrity sha512-Oyud2UcOXNPcvYn71he0FLIzpaJcLA+hu7i4wR/EKv+9Q/jOUGb++meKPB9vDBCFwGgWaoK7WpHJ2wB9xjLfGw== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/string" "^3.2.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/toolbar" "3.0.0-beta.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/table" "^3.11.4" + "@react-types/form" "^3.7.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" + "@swc/helpers" "^0.5.0" + react-aria "^3.31.0" + react-stately "^3.29.0" use-sync-external-store "^1.2.0" -react-aria@^3.24.0, react-aria@^3.25.0: - version "3.25.0" - resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.25.0.tgz#d51d4ba87a97f6d366b9a3a4bd59461d5c9925b3" - integrity sha512-nvahN6tUCnES9CXCKEzEHkWy7mH39KsQoCk6eehIT3eG1pw/eYUqXFAmmWIL3g2VDCiGavpSf1/BUTnAXE2VsQ== - dependencies: - "@react-aria/breadcrumbs" "^3.5.2" - "@react-aria/button" "^3.7.2" - "@react-aria/calendar" "^3.3.0" - "@react-aria/checkbox" "^3.9.1" - "@react-aria/combobox" "^3.6.1" - "@react-aria/datepicker" "^3.4.1" - "@react-aria/dialog" "^3.5.2" - "@react-aria/dnd" "^3.2.1" - "@react-aria/focus" "^3.12.1" - "@react-aria/gridlist" "^3.4.0" - "@react-aria/i18n" "^3.7.2" - "@react-aria/interactions" "^3.15.1" - "@react-aria/label" "^3.5.2" - "@react-aria/link" "^3.5.1" - "@react-aria/listbox" "^3.9.1" - "@react-aria/menu" "^3.9.1" - "@react-aria/meter" "^3.4.2" - "@react-aria/numberfield" "^3.5.1" - "@react-aria/overlays" "^3.14.1" - "@react-aria/progress" "^3.4.2" - "@react-aria/radio" "^3.6.1" - "@react-aria/searchfield" "^3.5.2" - "@react-aria/select" "^3.10.1" - "@react-aria/selection" "^3.15.0" - "@react-aria/separator" "^3.3.2" - "@react-aria/slider" "^3.4.1" - "@react-aria/ssr" "^3.6.0" - "@react-aria/switch" "^3.5.1" - "@react-aria/table" "^3.9.1" - "@react-aria/tabs" "^3.6.0" - "@react-aria/tag" "^3.0.0" - "@react-aria/textfield" "^3.9.2" - "@react-aria/tooltip" "^3.5.1" - "@react-aria/utils" "^3.17.0" - "@react-aria/visually-hidden" "^3.8.1" - "@react-types/shared" "^3.18.1" +react-aria@^3.31.0: + version "3.31.0" + resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.31.0.tgz#5021f93e6f03b80b269a5c6d0f2949dd33aa9260" + integrity sha512-fdmiEhopCq4TIP0BMMsDh92RMfGzVyNaSPdYLs5qqhDlVmaVL3NqWcK8RVstgI13ST/DIM+h9jgtp8+X1EDHMw== + dependencies: + "@internationalized/string" "^3.2.0" + "@react-aria/breadcrumbs" "^3.5.9" + "@react-aria/button" "^3.9.1" + "@react-aria/calendar" "^3.5.4" + "@react-aria/checkbox" "^3.13.0" + "@react-aria/combobox" "^3.8.1" + "@react-aria/datepicker" "^3.9.1" + "@react-aria/dialog" "^3.5.9" + "@react-aria/dnd" "^3.5.1" + "@react-aria/focus" "^3.16.0" + "@react-aria/gridlist" "^3.7.3" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/link" "^3.6.3" + "@react-aria/listbox" "^3.11.3" + "@react-aria/menu" "^3.12.0" + "@react-aria/meter" "^3.4.9" + "@react-aria/numberfield" "^3.10.1" + "@react-aria/overlays" "^3.20.0" + "@react-aria/progress" "^3.4.9" + "@react-aria/radio" "^3.10.0" + "@react-aria/searchfield" "^3.7.0" + "@react-aria/select" "^3.14.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/separator" "^3.3.9" + "@react-aria/slider" "^3.7.4" + "@react-aria/ssr" "^3.9.1" + "@react-aria/switch" "^3.6.0" + "@react-aria/table" "^3.13.3" + "@react-aria/tabs" "^3.8.3" + "@react-aria/tag" "^3.3.1" + "@react-aria/textfield" "^3.14.0" + "@react-aria/tooltip" "^3.7.0" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-types/shared" "^3.22.0" react-clientside-effect@^1.2.6: version "1.2.6" @@ -13424,33 +13597,34 @@ react-scripts@5.0.1: optionalDependencies: fsevents "^2.3.2" -react-stately@^3.23.0: - version "3.23.0" - resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.23.0.tgz#9f0ebfce512ab1d65fd8e50dbd3aaae4a3dcd7be" - integrity sha512-nk2ihInebz5s+eDcXeEL+e2AbP9g0Mp9Gx5GEgqfICc8CKoYWERQsukXphGc6WEvFpAjVde7Q33hqusIqAO5gA== - dependencies: - "@react-stately/calendar" "^3.2.1" - "@react-stately/checkbox" "^3.4.2" - "@react-stately/collections" "^3.8.0" - "@react-stately/combobox" "^3.5.1" - "@react-stately/data" "^3.9.2" - "@react-stately/datepicker" "^3.4.1" - "@react-stately/dnd" "^3.2.1" - "@react-stately/list" "^3.8.1" - "@react-stately/menu" "^3.5.2" - "@react-stately/numberfield" "^3.4.2" - "@react-stately/overlays" "^3.5.2" - "@react-stately/radio" "^3.8.1" - "@react-stately/searchfield" "^3.4.2" - "@react-stately/select" "^3.5.1" - "@react-stately/selection" "^3.13.1" - "@react-stately/slider" "^3.3.2" - "@react-stately/table" "^3.9.1" - "@react-stately/tabs" "^3.4.1" - "@react-stately/toggle" "^3.5.2" - "@react-stately/tooltip" "^3.4.1" - "@react-stately/tree" "^3.6.1" - "@react-types/shared" "^3.18.1" +react-stately@^3.29.0: + version "3.29.0" + resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.29.0.tgz#c082dce029cb8702f543c6a64343b1fd2956ee46" + integrity sha512-JWPgEg2RxDtSmMkypsBLuhsuiaMDfJcnFw96oDRg8lAGqkslZmbmYH/O1Wz08k2W6P3Bds4rZz6iK91XMNXomA== + dependencies: + "@react-stately/calendar" "^3.4.3" + "@react-stately/checkbox" "^3.6.1" + "@react-stately/collections" "^3.10.4" + "@react-stately/combobox" "^3.8.1" + "@react-stately/data" "^3.11.0" + "@react-stately/datepicker" "^3.9.1" + "@react-stately/dnd" "^3.2.7" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/menu" "^3.6.0" + "@react-stately/numberfield" "^3.8.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/radio" "^3.10.1" + "@react-stately/searchfield" "^3.5.0" + "@react-stately/select" "^3.6.1" + "@react-stately/selection" "^3.14.2" + "@react-stately/slider" "^3.5.0" + "@react-stately/table" "^3.11.4" + "@react-stately/tabs" "^3.6.3" + "@react-stately/toggle" "^3.7.0" + "@react-stately/tooltip" "^3.4.6" + "@react-stately/tree" "^3.7.5" + "@react-types/shared" "^3.22.0" react-style-singleton@^2.2.1: version "2.2.1" @@ -13546,6 +13720,18 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== + dependencies: + redis-errors "^1.0.0" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -13563,6 +13749,11 @@ regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -13755,9 +13946,9 @@ rpc-utils@^0.6.1, rpc-utils@^0.6.2: nanoid "^3.3.1" rpc-websockets@^7.5.1: - version "7.5.1" - resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.1.tgz#e0a05d525a97e7efc31a0617f093a13a2e10c401" - integrity sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w== + version "7.9.0" + resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz#a3938e16d6f134a3999fdfac422a503731bf8973" + integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== dependencies: "@babel/runtime" "^7.17.2" eventemitter3 "^4.0.7" @@ -13813,11 +14004,6 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-json-utils@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1" - integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ== - safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -13954,15 +14140,6 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -14005,6 +14182,16 @@ set-blocking@^2.0.0: resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + set-value@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz#aa433662d87081b75ad88a4743bd450f044e7d09" @@ -14087,14 +14274,6 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - socket.io-client@^4.7.2: version "4.7.2" resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" @@ -14245,6 +14424,11 @@ stackframe@^1.3.4: resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + state-local@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" @@ -14260,6 +14444,11 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.4.3: + version "3.6.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz#94807562bddc68fa90f2e02c5fd5b6865bb4e98e" + integrity sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -14440,7 +14629,7 @@ style-loader@^3.3.1: resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== -styled-components@^5.3.10, styled-components@^5.3.11: +styled-components@^5.3.11: version "5.3.11" resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz#9fda7bf1108e39bf3f3e612fcc18170dedcd57a8" integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw== @@ -14456,6 +14645,21 @@ styled-components@^5.3.10, styled-components@^5.3.11: shallowequal "^1.1.0" supports-color "^5.5.0" +styled-components@^6.1.1: + version "6.1.2" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.2.tgz#88bd9d446bea254619fc265c93efd73cc5776595" + integrity sha512-LJjirciivbOKNuKKjheXMeNOlFspur4s2/AYW2hPyrL4RhwEFiowF9axgjeMVxX7siEoLJAitKrzpuNApJ5R/Q== + dependencies: + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/unitless" "^0.8.0" + "@types/stylis" "^4.0.2" + css-to-react-native "^3.2.0" + csstype "^3.1.2" + postcss "^8.4.31" + shallowequal "^1.1.0" + stylis "^4.3.0" + tslib "^2.5.0" + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -14469,6 +14673,11 @@ stylis@4.2.0: resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== +stylis@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + sucrase@^3.32.0: version "3.32.0" resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" @@ -14853,15 +15062,10 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^3.8.0: - version "3.11.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.11.0.tgz#e78ea6b50d6a6b1e4609035fb9ea8f1e3c328194" - integrity sha512-JaPw5U9ixP0XcpUbQoVSbxSDcK/K4nww20C3kjm9yE6cDRRhptU28AH60VWf9ltXmCrIfIbtt9J+2OUk2Uqiaw== - -type-fest@^4.3.1: - version "4.4.0" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-4.4.0.tgz#061cd10ff55664bb7174218cdf78c28c48f71c69" - integrity sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw== +type-fest@^4.8.3: + version "4.8.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" + integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== type-is@~1.6.18: version "1.6.18" @@ -14887,16 +15091,26 @@ typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.4.2: - version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== + +ua-parser-js@^1.0.35: + version "1.0.37" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +ufo@^1.3.0, ufo@^1.3.1, ufo@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + uint8arrays@^2.1.4: version "2.1.10" resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" @@ -14918,10 +15132,10 @@ uint8arrays@^4.0.3: dependencies: multiformats "^11.0.0" -uint8arrays@^4.0.6: - version "4.0.6" - resolved "https://registry.npmmirror.com/uint8arrays/-/uint8arrays-4.0.6.tgz#bae68b536c2e87147045b95d73d29e503e45ecab" - integrity sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw== +uint8arrays@^4.0.9: + version "4.0.10" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f" + integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA== dependencies: multiformats "^12.0.1" @@ -14935,6 +15149,22 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + +unenv@^1.7.4: + version "1.8.0" + resolved "https://registry.npmjs.org/unenv/-/unenv-1.8.0.tgz#0f860d5278405700bd95d47b23bc01f3a735d68c" + integrity sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg== + dependencies: + consola "^3.2.3" + defu "^6.1.3" + mime "^3.0.0" + node-fetch-native "^1.4.1" + pathe "^1.1.1" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -14997,6 +15227,32 @@ unstated-next@^1.1.0: resolved "https://registry.npmjs.org/unstated-next/-/unstated-next-1.1.0.tgz#7bb4911a12fdf3cc8ad3eb11a0b315e4a8685ea8" integrity sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA== +unstorage@^1.9.0: + version "1.10.1" + resolved "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz#bf8cc00a406e40a6293e893da9807057d95875b0" + integrity sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw== + dependencies: + anymatch "^3.1.3" + chokidar "^3.5.3" + destr "^2.0.2" + h3 "^1.8.2" + ioredis "^5.3.2" + listhen "^1.5.5" + lru-cache "^10.0.2" + mri "^1.2.0" + node-fetch-native "^1.4.1" + ofetch "^1.3.3" + ufo "^1.3.1" + +untun@^0.1.2: + version "0.1.3" + resolved "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz#5d10dee37a3a5737ff03d158be877dae0a0e58a6" + integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== + dependencies: + citty "^0.1.5" + consola "^3.2.3" + pathe "^1.1.1" + upath@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -15010,19 +15266,10 @@ update-browserslist-db@^1.0.11: escalade "^3.1.1" picocolors "^1.0.0" -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" +uqr@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" + integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== uri-js@^4.2.2: version "4.4.1" @@ -15156,10 +15403,10 @@ validate.io-number@^1.0.3: resolved "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" integrity sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg== -valtio@1.10.5: - version "1.10.5" - resolved "https://registry.npmjs.org/valtio/-/valtio-1.10.5.tgz#7852125e3b774b522827d96bd9c76d285c518678" - integrity sha512-jTp0k63VXf4r5hPoaC6a6LCG4POkVSh629WLi1+d5PlajLsbynTMd7qAgEiOSPxzoX5iNvbN7iZ/k/g29wrNiQ== +valtio@1.11.2: + version "1.11.2" + resolved "https://registry.npmjs.org/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" + integrity sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw== dependencies: proxy-compare "2.5.1" use-sync-external-store "1.2.0" @@ -15169,11 +15416,6 @@ value-or-promise@^1.0.11, value-or-promise@^1.0.12: resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== -varint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - varint@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -15196,20 +15438,19 @@ vary@~1.1.2: resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -viem@^0.3.37: - version "0.3.39" - resolved "https://registry.npmjs.org/viem/-/viem-0.3.39.tgz#299ac6e2d0e612b2d7dc2b74edd9100e48675f70" - integrity sha512-hWPPLsaT3UdFBbECZrqDnE7lbYzLmAf9lIqvzsab3zXVV2y/HeNm63r0xRLdMRKfCC68AppEZUttOHyo2W/1ZQ== +viem@^1.0.0, viem@^1.19.13: + version "1.20.3" + resolved "https://registry.npmjs.org/viem/-/viem-1.20.3.tgz#8b8360daee622295f5385949c02c86d943d14e0f" + integrity sha512-7CrmeCb2KYkeCgUmUyb1hsf+IX/PLwi+Np+Vm4YUTPeG82y3HRSgGHSaCOp3d0YtR2kXD3nv9y5kE7LBFE+wWw== dependencies: - "@adraffy/ens-normalize" "1.9.0" - "@noble/curves" "1.0.0" - "@noble/hashes" "1.3.0" - "@scure/bip32" "1.3.0" - "@scure/bip39" "1.2.0" - "@wagmi/chains" "0.3.1" - abitype "0.8.2" - isomorphic-ws "5.0.0" - ws "8.12.0" + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" vscode-languageserver-types@^3.15.1, vscode-languageserver-types@^3.17.1: version "3.17.3" @@ -15230,16 +15471,16 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wagmi@^1.0.7: - version "1.0.9" - resolved "https://registry.npmjs.org/wagmi/-/wagmi-1.0.9.tgz#2483e448720d9ccd013ad0f2943ba7c4dfd775e6" - integrity sha512-LIExrD43Kyy8YIG02AQ4+heQc324h4lgTsQcpIDkLcOnwCV24uNSe/Ib1/F2k0N51uUsFoBdB5hjAaT6Ww7AtQ== +wagmi@^1.4.10: + version "1.4.12" + resolved "https://registry.npmjs.org/wagmi/-/wagmi-1.4.12.tgz#e5d31c6d7621ecd9e32eded6c7b1041201223127" + integrity sha512-QRxpjhdMlZmbYTfn9VQkQMKq+l3kwA1O7tF10vaykPrjbGX+IIlyn72ib9oqW9BfQO7n/Sf/mnVz1zbxRhGPWA== dependencies: "@tanstack/query-sync-storage-persister" "^4.27.1" "@tanstack/react-query" "^4.28.0" "@tanstack/react-query-persist-client" "^4.28.0" - "@wagmi/core" "1.0.8" - abitype "0.8.2" + "@wagmi/core" "1.4.12" + abitype "0.8.7" use-sync-external-store "^1.2.0" walker@^1.0.7: @@ -15494,7 +15735,18 @@ which-module@^2.0.0: resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.11, which-typed-array@^1.1.2: + version "1.1.13" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== @@ -15727,26 +15979,21 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@7.4.6: - version "7.4.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@8.12.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz#485074cc392689da78e1828a9ff23585e06cddd8" - integrity sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig== - -ws@8.13.0, ws@^8.12.0, ws@^8.13.0, ws@^8.5.0: +ws@8.13.0, ws@^8.12.0, ws@^8.13.0: version "8.13.0" resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^7.4.0, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: +ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.5.0: + version "8.15.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" + integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== + ws@~8.11.0: version "8.11.0" resolved "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" @@ -15861,8 +16108,8 @@ yocto-queue@^0.1.0: integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zustand@^4.3.1: - version "4.3.8" - resolved "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" - integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== + version "4.4.7" + resolved "https://registry.npmjs.org/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" + integrity sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw== dependencies: use-sync-external-store "1.2.0" From 2ebe295ae400106a457d8e518d9f5d6610f37b42 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 13:31:00 +0800 Subject: [PATCH 049/127] upgrade scan deps --- packages/client/scan/package.json | 31 +- .../scan/src/components/Dapp/Playground.tsx | 3 +- .../client/scan/src/components/Header.tsx | 29 +- .../scan/src/components/Home/HomeFilter.tsx | 6 +- .../src/components/ModelView/Playground.tsx | 2 +- packages/client/scan/yarn.lock | 4732 +++++++---------- 6 files changed, 1991 insertions(+), 2812 deletions(-) diff --git a/packages/client/scan/package.json b/packages/client/scan/package.json index c3013e47..b4e8500d 100644 --- a/packages/client/scan/package.json +++ b/packages/client/scan/package.json @@ -4,9 +4,9 @@ "version": "0.1.0", "private": true, "dependencies": { - "@ceramicnetwork/common": "^2.20.0", - "@ceramicnetwork/http-client": "^2.22.0", - "@ceramicnetwork/stream-model": "^1.5.0", + "@ceramicnetwork/common": "^3.2.0", + "@ceramicnetwork/http-client": "^3.2.0", + "@ceramicnetwork/stream-model": "^2.2.0", "@graphiql/plugin-explorer": "^0.1.15", "@graphiql/toolkit": "^0.8.3", "@monaco-editor/react": "^4.4.6", @@ -22,10 +22,10 @@ "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/styled-components": "^5.1.26", - "@us3r-network/auth-with-rainbowkit": "^0.1.8", - "@us3r-network/data-model": "^0.2.1", - "@us3r-network/profile": "^0.4.2", - "axios": "^1.2.6", + "@us3r-network/auth-with-rainbowkit": "^0.2.1", + "@us3r-network/data-model": "^0.7.0", + "@us3r-network/profile": "^0.7.0", + "axios": "^1.6.2", "dayjs": "^1.11.7", "ethers": "^5.7.2", "file-saver": "^2.0.5", @@ -37,7 +37,11 @@ "monaco-editor": "^0.36.1", "prismjs": "^1.29.0", "react": "^18.2.0", - "react-aria-components": "^1.0.0-alpha.5", + "typescript": "^5.3.3", + "wagmi": "^1.4.10", + "viem": "^1.19.13", + "@rainbow-me/rainbowkit": "^1.3.0", + "react-aria-components": "^1.0.0", "react-device-detect": "^2.2.2", "react-dom": "^18.2.0", "react-ga4": "^2.0.0", @@ -48,13 +52,12 @@ "react-toastify": "^9.1.1", "recharts": "^2.5.0", "styled-components": "^5.3.6", - "typescript": "^4.4.2", "use-url-search-params": "^2.5.1", "web-vitals": "^2.1.0" }, "devDependencies": { - "@composedb/devtools": "^0.5.0", - "@composedb/types": "^0.5.0", + "@composedb/devtools": "^0.6.1", + "@composedb/types": "^0.6.0", "@craco/craco": "^7.0.0", "@types/file-saver": "^2.0.5", "assert": "^2.0.0", @@ -63,9 +66,9 @@ "console-browserify": "^1.2.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.12.0", - "did-session": "^2.0.0", - "dids": "^4.0.0", - "key-did-provider-ed25519": "^3.0.0", + "did-session": "^2.1.2", + "dids": "^4.0.4", + "key-did-provider-ed25519": "^3.0.2", "key-did-resolver": "^3.0.0", "node-polyfill-webpack-plugin": "^2.0.1", "os-browserify": "^0.3.0", diff --git a/packages/client/scan/src/components/Dapp/Playground.tsx b/packages/client/scan/src/components/Dapp/Playground.tsx index d42c77b7..78291569 100644 --- a/packages/client/scan/src/components/Dapp/Playground.tsx +++ b/packages/client/scan/src/components/Dapp/Playground.tsx @@ -17,7 +17,6 @@ import { RuntimeCompositeDefinition } from '@composedb/types' import 'graphiql/graphiql.css' import '../../styles/playground.css' -import { useParams } from 'react-router-dom' import { queryModelGraphql } from '../../api' import { AxiosError } from 'axios' import styled from 'styled-components' @@ -158,7 +157,7 @@ export default function PlaygroundGraphiQL( network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, - definition: definition as RuntimeCompositeDefinition, + definition: definition as unknown as RuntimeCompositeDefinition, }), [definition, network] ) diff --git a/packages/client/scan/src/components/Header.tsx b/packages/client/scan/src/components/Header.tsx index cfa83667..00b0e934 100644 --- a/packages/client/scan/src/components/Header.tsx +++ b/packages/client/scan/src/components/Header.tsx @@ -3,11 +3,11 @@ import { useCeramicCtx } from '../context/CeramicCtx' import ChevronDown from './icons/ChevronDown' import { Network } from '../types' import BackBtn from './BackBtn' -import { useLocation, useNavigate, useParams } from 'react-router-dom' +import { useLocation, useNavigate } from 'react-router-dom' import { useMemo } from 'react' import { Button, - Item, + ListBoxItem, Label, ListBox, Popover, @@ -15,7 +15,6 @@ import { SelectValue, } from 'react-aria-components' import { isMobile } from 'react-device-detect' -import { useSession } from '@us3r-network/auth-with-rainbowkit' export default function Header() { const navigate = useNavigate() @@ -30,16 +29,16 @@ export default function Header() { return !show }, [location]) - const params = useParams() - const session = useSession() - const showLogoutButton = useMemo(() => { - return ( - location.pathname.startsWith('/streams/profile') && - session && - session.id && - session.id === params?.did - ) - }, [location, session, params?.did]) + // const params = useParams() + // const session = useSession() + // const showLogoutButton = useMemo(() => { + // return ( + // location.pathname.startsWith('/streams/profile') && + // session && + // session.id && + // session.id === params?.did + // ) + // }, [location, session, params?.did]) if (isMobile) { return null @@ -86,8 +85,8 @@ function NetworkSwitch() { - {Network.MAINNET} - {Network.TESTNET} + {Network.MAINNET} + {Network.TESTNET} diff --git a/packages/client/scan/src/components/Home/HomeFilter.tsx b/packages/client/scan/src/components/Home/HomeFilter.tsx index c310bb54..ae094bda 100644 --- a/packages/client/scan/src/components/Home/HomeFilter.tsx +++ b/packages/client/scan/src/components/Home/HomeFilter.tsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom' import styled from 'styled-components' import { Button, - Item, + ListBoxItem, Label, ListBox, Popover, @@ -55,8 +55,8 @@ export default function SearchFilter() { - Model - Stream + Model + Stream diff --git a/packages/client/scan/src/components/ModelView/Playground.tsx b/packages/client/scan/src/components/ModelView/Playground.tsx index c9f0b453..e79b4e0e 100644 --- a/packages/client/scan/src/components/ModelView/Playground.tsx +++ b/packages/client/scan/src/components/ModelView/Playground.tsx @@ -158,7 +158,7 @@ export default function PlaygroundGraphiQL( network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, - definition: definition as RuntimeCompositeDefinition, + definition: definition as unknown as RuntimeCompositeDefinition, }), [definition, network] ) diff --git a/packages/client/scan/yarn.lock b/packages/client/scan/yarn.lock index e6a32c42..2a1c3859 100644 --- a/packages/client/scan/yarn.lock +++ b/packages/client/scan/yarn.lock @@ -7,6 +7,11 @@ resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz#e1a84fca468f4b337816fcb7f0964beb620ba855" integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + "@adraffy/ens-normalize@1.9.0": version "1.9.0" resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz#223572538f6bea336750039bb43a4016dcc8182d" @@ -1094,25 +1099,25 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@ceramicnetwork/codecs@^1.10.0": - version "1.10.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/codecs/-/codecs-1.10.0.tgz#9daccdca63b96cc48f9beea2e2aa43e1d9e6e346" - integrity sha512-0/5/NCjKax2UFbvnlQuRzZ+T7sp+HKgGsBsW/fKK06E/ui0MBVMSK1eitn/ozvMFUo+nCjKPQF3ixXVpdsQl4A== +"@ceramicnetwork/codecs@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/codecs/-/codecs-2.2.0.tgz#2c905bc2c0c03bbc71cd9fc62be5429c5c367de1" + integrity sha512-HRDdJN7G954F7KOZ117WxhYUC9pGoUyBc6cEr14MLhhxA9S2+bYYOKZ1VAaTFawF1FB6rQkHIT37IYPVo0tI0A== dependencies: - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/streamid" "^3.2.0" cartonne "^2.1.1" codeco "^1.1.0" dag-jose "^4.0.0" multiformats "^11.0.1" uint8arrays "^4.0.3" -"@ceramicnetwork/common@^2.20.0", "@ceramicnetwork/common@^2.33.0", "@ceramicnetwork/common@^2.35.0": - version "2.35.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/common/-/common-2.35.0.tgz#270e4776fa1b120bbc5910ef40c62522c571159c" - integrity sha512-1TsdVYAjTIVTBz+6dlrEJACFGqMzYZeOvwLNbpk9E5vMh6fnrgRm8q9JPeGhDyGwdGlY7l4e1yqzWAoZGnJARQ== +"@ceramicnetwork/common@^3.0.5", "@ceramicnetwork/common@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/common/-/common-3.2.0.tgz#06a6fa9ac764e3138c32ceadc731b90448fde62c" + integrity sha512-3ql9LN/AXO2VxosnNzTeaMo+JRQpCclwFhyfWrpH0okLdiB1CeDDOkiKNOvz+6ZtYql1NpIby1/Ag5ovtxgQjg== dependencies: - "@ceramicnetwork/codecs" "^1.10.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/codecs" "^2.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@didtools/cacao" "^2.1.0" "@didtools/pkh-ethereum" "^0.1.0" "@didtools/pkh-solana" "^0.1.0" @@ -1120,30 +1125,6 @@ "@didtools/pkh-tezos" "^0.2.1" "@stablelib/random" "^1.0.1" caip "~1.1.0" - cross-fetch "^3.1.4" - flat "^5.0.2" - it-first "^1.0.7" - jet-logger "1.2.2" - lodash.clonedeep "^4.5.0" - logfmt "^1.3.2" - multiformats "^11.0.1" - rxjs "^7.5.2" - uint8arrays "^4.0.3" - -"@ceramicnetwork/common@^2.23.0", "@ceramicnetwork/common@^2.24.0": - version "2.24.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/common/-/common-2.24.0.tgz#98ed0f7607e3904cfc4299c88f56e272eff5df99" - integrity sha512-Q3GBlJd5XrSDCP/6KJy2sz+5MfAVhMrEDoW9SIaxG19xPC+QGeMRouNbZf+qfe3tGQintaRn3FhoqSAtjFxE1g== - dependencies: - "@ceramicnetwork/streamid" "^2.14.0" - "@didtools/cacao" "^2.0.0" - "@didtools/pkh-ethereum" "^0.1.0" - "@didtools/pkh-solana" "^0.1.0" - "@didtools/pkh-stacks" "^0.1.0" - "@didtools/pkh-tezos" "^0.2.1" - "@stablelib/random" "^1.0.1" - caip "~1.1.0" - cross-fetch "^3.1.4" flat "^5.0.2" it-first "^1.0.7" jet-logger "1.2.2" @@ -1153,119 +1134,53 @@ rxjs "^7.5.2" uint8arrays "^4.0.3" -"@ceramicnetwork/http-client@2.20.0", "@ceramicnetwork/http-client@^2.20.0": - version "2.20.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-2.20.0.tgz#b2e62b81c8c46480783213cf372fbfdc94e138fa" - integrity sha512-nwxxcm1Wt2A+QRByxC0PFGCGNfkzWMobduxeaixgkGhJN5SX7Edu7hi4EmhV0PZmXJRitCaNJDXZiRRZ903D1Q== - dependencies: - "@ceramicnetwork/common" "^2.23.0" - "@ceramicnetwork/stream-caip10-link" "^2.18.0" - "@ceramicnetwork/stream-model" "^1.5.0" - "@ceramicnetwork/stream-model-instance" "^1.5.0" - "@ceramicnetwork/stream-tile" "^2.19.0" - "@ceramicnetwork/streamid" "^2.14.0" - query-string "^7.1.0" - rxjs "^7.5.2" - -"@ceramicnetwork/http-client@^2.22.0": - version "2.32.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/http-client/-/http-client-2.32.0.tgz#c832ead940ff9901facc12497b238639b7b55b49" - integrity sha512-2OUp33qXg2D243N+NwuwvPJfw/F2PFj2y73XT753yjwXIdyaHAJXwsoLJ8OyK1ixFYl1Q5Yb3kshO1sXurQi4g== - dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/stream-caip10-link" "^2.30.0" - "@ceramicnetwork/stream-model" "^1.17.0" - "@ceramicnetwork/stream-model-instance" "^1.17.0" - "@ceramicnetwork/stream-tile" "^2.31.0" - "@ceramicnetwork/streamid" "^2.17.0" +"@ceramicnetwork/http-client@^3.0.5", "@ceramicnetwork/http-client@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/http-client/-/http-client-3.2.0.tgz#1891b57b85146ed8f4d5c96a75047a94f7a5aa38" + integrity sha512-HC0tw9cL7/Q0qstOSc3pm9uAQ6pPx9Y/0dsmO+lZRxPMW9gQqOqY1Oa7Wi3PIvyiJaimwnM+G1SFM6GWQ676Lg== + dependencies: + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/stream-caip10-link" "^3.2.0" + "@ceramicnetwork/stream-model" "^2.2.0" + "@ceramicnetwork/stream-model-instance" "^2.2.0" + "@ceramicnetwork/stream-tile" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@scarf/scarf" "^1.1.1" query-string "^7.1.0" rxjs "^7.5.2" -"@ceramicnetwork/stream-caip10-link@^2.18.0": - version "2.19.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-2.19.0.tgz#7ad366b4a78186bface5c60ce9241eb2f3be297c" - integrity sha512-h9kXbAsngj7e3amHE2vIPAyCKa537rLdc41xfYX1NSI8vDN7WwWht5xzT3DkRO91AmqGKPvCh801IcjqVHRC/w== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/streamid" "^2.14.0" - caip "~1.1.0" - did-resolver "^4.0.1" - lodash.clonedeep "^4.5.0" - -"@ceramicnetwork/stream-caip10-link@^2.30.0": - version "2.30.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-2.30.0.tgz#d7a2da8675e47a611607d143f711b96eb3e37ac1" - integrity sha512-co6M+gKp2ShsLa1pxJScLBY+ICenN0asuA3ZFlLqquLcYAdXTYuLs37NaLSxkuTr41sI0HLSwzJVN8OBwjhvQg== +"@ceramicnetwork/stream-caip10-link@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-caip10-link/-/stream-caip10-link-3.2.0.tgz#0b44e6f10ab1cdb6ef56eb7371ec5c2fcf61cf08" + integrity sha512-36/7JWVm9Qn48/ezIRGJy7lAP4IZ2yGucAYXd/Ssq2RDLdGC7xTlva8csYQd/8b4nUu6UZqhqdRGEbBhGRN2Cw== dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" caip "~1.1.0" did-resolver "^4.0.1" lodash.clonedeep "^4.5.0" -"@ceramicnetwork/stream-model-instance@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.5.0.tgz#20877811c0685c75994e28f6c477182b8af5ab2d" - integrity sha512-zdm+JbORr/3bxgMsFck6jYQGWeaWZnjotMnq2k2e9Wyqr5ulyXDk4uh7HG7nJAvTDvjEvAWgjqXFbLLyCzEixw== - dependencies: - "@ceramicnetwork/common" "^2.23.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - object-sizeof "^2.6.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model-instance@^1.15.0", "@ceramicnetwork/stream-model-instance@^1.17.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.17.0.tgz#2bb245e49ce9d8f9fc70171a3c8e49707294c488" - integrity sha512-cVHlz7ScpLYgz11Wzw5x99dh4BbThoKsJi9rFS2RF+p0BNuyp2QgSnpCjziEQqCz6djJngy6g2BCwf4b+MML5g== - dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - object-sizeof "^2.6.1" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model-instance@^1.5.0": - version "1.6.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-1.6.0.tgz#1f9546b827e23f2008f7968ffb9a2b7c31bdad24" - integrity sha512-qa7EUFV+/eZTiCyT0AvpNyvFMNbzH4sbXAJUsSKJ2YxXy3fo3X5QEVx51pKnVnc6JomNBz6S/pQj0kOR8o+hqA== +"@ceramicnetwork/stream-model-instance@^2.0.5", "@ceramicnetwork/stream-model-instance@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model-instance/-/stream-model-instance-2.2.0.tgz#d2cd30e1ee68040e4f32ce57af6e99c01e614876" + integrity sha512-sLQjGpQc2V9Mh3BFsJvioKsRy8eyFrufxG7u2WNjSkRdWOrqMBLSuyEy2U5whT92nIe8DcKlD8eGW2rmY7OOCQ== dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/streamid" "^2.14.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" fast-json-patch "^3.1.0" object-sizeof "^2.6.1" uint8arrays "^4.0.3" -"@ceramicnetwork/stream-model@1.5.0", "@ceramicnetwork/stream-model@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model/-/stream-model-1.5.0.tgz#71511c5046ece21ad20252ef040ce4d1dd922db1" - integrity sha512-zqE+SA5nssHqXeIEJnbAjsxFx8Fhdl67wM/Mz8tRZr1m2ya6BjchGd5rrtE41gfwM6ZM6WYZ/xJZ+k0iMpGiQQ== - dependencies: - "@ceramicnetwork/common" "^2.23.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - fast-json-patch "^3.1.0" - json-schema-typed "^8.0.1" - multiformats "^11.0.1" - multihashes "^4.0.3" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-model@^1.15.0", "@ceramicnetwork/stream-model@^1.17.0": - version "1.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-model/-/stream-model-1.17.0.tgz#af1a9775d2264e4021576b5e6c9b69a2ceca3f53" - integrity sha512-d6HhiPAQfyw0a1wN32kWR/YdGdLd6DdOfhn3pDU8vHKH731l5uHIIOMwwp+XEcbFTSGQdPbxAbcdTM4AFJG3MA== +"@ceramicnetwork/stream-model@^2.0.5", "@ceramicnetwork/stream-model@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-model/-/stream-model-2.2.0.tgz#cb6182035b2ed4f8bccecd3d2687f4c2d472d7f9" + integrity sha512-O+xmtMJ3dFOqxkoaDVKZAH8Z+4AqYyDdSgoB97JNpXHILM2a13NMJyvVVtZzVedywj6jAkdOxC80JYOscQtiew== dependencies: - "@ceramicnetwork/codecs" "^1.10.0" - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/codecs" "^2.2.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" ajv "^8.8.2" @@ -1276,41 +1191,13 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" -"@ceramicnetwork/stream-tile@^2.16.0": - version "2.19.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-2.19.0.tgz#1bc157314f28b6117287151f9d5d168c05e09d89" - integrity sha512-iPVjWAIaRaYJuwkY3etljdPciePzOuGijBoXzQ4frL/MxKaAWosyTgloJvhTt0zohzr11WGgoCNqupQ3Mm0Xuw== - dependencies: - "@ceramicnetwork/common" "^2.23.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - dids "^4.0.0" - fast-json-patch "^3.1.0" - lodash.clonedeep "^4.5.0" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-tile@^2.19.0": - version "2.20.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-2.20.0.tgz#fa8874af24f75cbdec609f64fad8d9d2719ec3f4" - integrity sha512-aBHegw35+p+QZbZGKKuaCy3bNrpztNTDlNaedReNlUVvVTSl2VecTBCY7CpbqVjIj6+wE3yBrpUfTOBlTbjyuw== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@ipld/dag-cbor" "^7.0.0" - "@stablelib/random" "^1.0.1" - dids "^4.0.0" - fast-json-patch "^3.1.0" - lodash.clonedeep "^4.5.0" - uint8arrays "^4.0.3" - -"@ceramicnetwork/stream-tile@^2.31.0": - version "2.31.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/stream-tile/-/stream-tile-2.31.0.tgz#ce3f719d314584025b5e031d687f6d7f579455d9" - integrity sha512-Vky2XyT38jqpQYVT4jzVmjmRWDU/T5Gx2wdCNuQsIYw6DkrMLSa0nTOMnqHTFl+hf+wcfNIpNvUI7RmooKoY7g== +"@ceramicnetwork/stream-tile@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/stream-tile/-/stream-tile-3.2.0.tgz#c294d02b321088f5c0a3fe46fd2645e36db62194" + integrity sha512-QW0FS2OHmxK/Gs4GcFGgAZY4gtnSBBE2jUWNAMoXne8T0CjbQforUFUXC5KD4ojGMBsqm+w8vBurSk9ihcT2/w== dependencies: - "@ceramicnetwork/common" "^2.35.0" - "@ceramicnetwork/streamid" "^2.17.0" + "@ceramicnetwork/common" "^3.2.0" + "@ceramicnetwork/streamid" "^3.2.0" "@ipld/dag-cbor" "^7.0.0" "@stablelib/random" "^1.0.1" dids "^4.0.0" @@ -1318,28 +1205,17 @@ lodash.clonedeep "^4.5.0" uint8arrays "^4.0.3" -"@ceramicnetwork/streamid@2.14.0", "@ceramicnetwork/streamid@^2.14.0": - version "2.14.0" - resolved "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-2.14.0.tgz#ba5c34da90d30f25a517d3265cc9f600ad08bff9" - integrity sha512-Pv28GZA77Zth+aC65NJeimrH4pIl91SKMCBAkOHORk/UCH++HTTItAjhu/RqMCsGpfnsIvZAXwsGqNH7dfJz1A== - dependencies: - "@ipld/dag-cbor" "^7.0.0" - mapmoize "^1.2.1" - multiformats "^11.0.1" - uint8arrays "^4.0.3" - varint "^6.0.0" - -"@ceramicnetwork/streamid@^2.17.0": - version "2.17.0" - resolved "https://registry.npmmirror.com/@ceramicnetwork/streamid/-/streamid-2.17.0.tgz#4c4fed37762af52abc04765971dbe07fbfb1656c" - integrity sha512-LC6YL8dcN2XqOdPEDKqWAloyJNXBIyw30JAm4gvWLsUuOaL8hTJWpu2HndFp/Jn4Mab9090/fwVZ2O8CWno58w== +"@ceramicnetwork/streamid@^3.0.5", "@ceramicnetwork/streamid@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@ceramicnetwork/streamid/-/streamid-3.2.0.tgz#d3ce24348b26b3a2b8e7e29f65540dbe6a2558a6" + integrity sha512-o1nlXcSosbl2pcA3vkdZyiwdwDC7J8O+u/mGdBysJ6brQvQcbB9W9QYE6OgB5p+dxXdY9u5zwATURIEw5Ify3w== dependencies: "@ipld/dag-cbor" "^7.0.0" "@stablelib/sha256" "^1.0.1" cborg "^1.10.2" mapmoize "^1.2.1" multiformats "^11.0.1" - uint8arrays "^4.0.3" + uint8arrays "^4.0.9" varint "^6.0.0" "@coinbase/wallet-sdk@^3.6.6": @@ -1365,123 +1241,83 @@ stream-browserify "^3.0.0" util "^0.12.4" -"@composedb/client@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@composedb/client/-/client-0.4.3.tgz#fbefd725bf3cb176c53bf9473bc913968edcd89f" - integrity sha512-6hifvuV+h5ehyX4e5bQv5ybkTzBEnA8gR6FECp41mgEubX3jtmx2P186lPtCLo1fIqxTYjdgAQCYCE9EqN6dcA== - dependencies: - "@ceramicnetwork/http-client" "^2.20.0" - "@ceramicnetwork/stream-model-instance" "^1.5.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/constants" "^0.4.0" - "@composedb/graphql-scalars" "^0.4.3" - "@composedb/runtime" "^0.4.1" - "@graphql-tools/batch-execute" "^8.5.18" - "@graphql-tools/stitch" "^8.7.42" - "@graphql-tools/utils" "^9.2.1" +"@composedb/client@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/client/-/client-0.6.0.tgz#25f7b2057962d49ab852effdc68ce671e4eda1e1" + integrity sha512-vqA7gMxdUq9UATM4bgvFx5Wk2BFYoc/rmCceM9KqCaY3yHohtOPxlty1L6/Fl1Md98hmgQkY45lvHiD4ajA1Kg== + dependencies: + "@ceramicnetwork/http-client" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" + "@composedb/constants" "^0.6.0" + "@composedb/graphql-scalars" "^0.6.0" + "@composedb/runtime" "^0.6.0" + "@graphql-tools/batch-execute" "^9.0.2" + "@graphql-tools/stitch" "^9.0.3" + "@graphql-tools/utils" "^10.0.11" dataloader "^2.2.2" - graphql "^16.5.0" + graphql "^16.8.1" graphql-relay "^0.10.0" -"@composedb/constants@^0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@composedb/constants/-/constants-0.4.0.tgz#67749c629580e7fb0271401a06e949ed979b6f9f" - integrity sha512-juphxE0LPqzOh9Yojw6JrkvV3UI1RIhiI11MUHfsxC4m6KP8uxq0or1xKP7jQPNHGhqgtOomMezCXFUTcPVotQ== - -"@composedb/devtools@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@composedb/devtools/-/devtools-0.4.3.tgz#e1960d31a24d341a88c5c49466e735edaf727cb2" - integrity sha512-v/tiI+HlLvKa0TcNjiBbiJvI/oc8joH+oM1HEcuKuHN7WueACj2JE3ilFakApC1weKuZ3nM7hIVMPFbx4DBysg== - dependencies: - "@ceramicnetwork/stream-model" "^1.5.0" - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/graphql-scalars" "^0.4.3" - "@graphql-tools/schema" "^9.0.16" - "@graphql-tools/utils" "^9.2.1" - change-case "^4.1.2" - json-ptr "^3.1.1" - lodash-es "^4.17.21" - multiformats "^11.0.1" - object-hash "^3.0.0" - type-fest "^3.6.1" - uint8arrays "^4.0.3" +"@composedb/constants@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/constants/-/constants-0.6.0.tgz#e853265328524b0c103757b8913986565e356417" + integrity sha512-18rysTgKUTgapwaDEJOI063WSWlwbvowEnRZkFrZpciHPHjgfdry9XTht4ygYkGzx9TE+zGsVmgJfF0LlbTFMg== -"@composedb/devtools@^0.5.0": - version "0.5.0" - resolved "https://registry.npmmirror.com/@composedb/devtools/-/devtools-0.5.0.tgz#7f651bc8f340664a49385bf5f853d37ab81d5e61" - integrity sha512-tZZOK82B2WZQRW1LQKmKI0Mmpl9z8G1nMmWLcR0vDRiVumL6o0jHkD9lBC3mQ990j4CRUgYsH2HIOrzNnYNyOg== +"@composedb/devtools@^0.6.1": + version "0.6.1" + resolved "https://registry.npmjs.org/@composedb/devtools/-/devtools-0.6.1.tgz#752ffd103abb7600578924cf6e03ed184a8b94f8" + integrity sha512-584a6Zg4AYWhGhyhvq6Ac/YdHpgHTqRf9HgtS5IglJDyVV2DGKvVAXg4bYv7hGa6zrppelHOlNQ99U3ICizPXw== dependencies: - "@ceramicnetwork/common" "^2.33.0" - "@ceramicnetwork/stream-model" "^1.15.0" - "@ceramicnetwork/streamid" "^2.17.0" - "@composedb/graphql-scalars" "^0.5.0" + "@ceramicnetwork/common" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/graphql-scalars" "^0.6.0" "@didtools/cacao" "^2.0.0" - "@graphql-tools/schema" "^10.0.0" - "@graphql-tools/utils" "^10.0.5" - change-case "^4.1.2" + "@graphql-tools/schema" "^10.0.2" + "@graphql-tools/utils" "^10.0.11" + change-case "^5.3.0" json-ptr "^3.1.1" lodash-es "^4.17.21" - multiformats "^12.1.0" + multiformats "^12.1.3" object-hash "^3.0.0" - type-fest "^4.3.1" - uint8arrays "^4.0.6" - -"@composedb/graphql-scalars@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@composedb/graphql-scalars/-/graphql-scalars-0.4.3.tgz#d82d1645f25617a204ec2f57c27a7e60a4a8599f" - integrity sha512-pPIMRnP5t6AoFxeX3BW1KyufBdXflInofZ8jklGq2xiaMtZsSAuMeeJgn0lHWrp0jKCTu0/wuR+YK1MGK6MK7w== - dependencies: - "@ceramicnetwork/streamid" "^2.14.0" - "@composedb/types" "^0.4.3" - caip "^1.1.0" - graphql "^16.5.0" - graphql-scalars "^1.20.1" - multiformats "^11.0.1" + type-fest "^4.8.3" + uint8arrays "^4.0.9" -"@composedb/graphql-scalars@^0.5.0": - version "0.5.0" - resolved "https://registry.npmmirror.com/@composedb/graphql-scalars/-/graphql-scalars-0.5.0.tgz#c315d9feca0ebcd3d4103cb4e8da9ec18a998e9e" - integrity sha512-RNk2wRsZ1VrvLxWOaUbTlmjlKZhi7YqvWLfp83oy08HHz7HmfxcrlEvxT5f8thiOfnF4Hw4gXo8euwI3nTkhvg== +"@composedb/graphql-scalars@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/graphql-scalars/-/graphql-scalars-0.6.0.tgz#54e6437914d3356f2f5286bda9c0dbe8cc7a6adc" + integrity sha512-9GssARG72pXb2SEYK6Zozz92tl37WnI9fCgKiTKBIjisoUGpUnTv2sRNRJV8X9j4CgawvCm4Yb/SH+CtUXuZew== dependencies: - "@ceramicnetwork/streamid" "^2.17.0" - "@composedb/types" "^0.5.0" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/types" "^0.6.0" caip "^1.1.0" - graphql "^16.8.0" - graphql-scalars "^1.22.2" - multiformats "^12.1.0" + graphql "^16.8.1" + graphql-scalars "^1.22.4" + multiformats "^12.1.3" -"@composedb/runtime@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@composedb/runtime/-/runtime-0.4.1.tgz#073661b50d9e18dac58b6d27eaa73e86d07b0cd1" - integrity sha512-F3ajY1oM71e678wM0GI8TErOl5EIAafSQShi/Zv9PMSy0TaurZvBTUGLcuX1MvGyGqwcfXVPXTsNOh+NFtK9Lw== - dependencies: - "@ceramicnetwork/http-client" "2.20.0" - "@ceramicnetwork/stream-model" "1.5.0" - "@ceramicnetwork/stream-model-instance" "1.5.0" - "@ceramicnetwork/streamid" "2.14.0" - "@composedb/graphql-scalars" "^0.4.3" +"@composedb/runtime@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/runtime/-/runtime-0.6.0.tgz#a7b0816500e3696cac18dcb6208ac52a48c20f3f" + integrity sha512-HZRFa7KVqEPAQY9umPzpdRoblHIn/QVk/55T5TPLv6VTEDmUmw0W3Nv+vNH7kvq++SdIuikbRPSW7eci9wUTCw== + dependencies: + "@ceramicnetwork/http-client" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" + "@ceramicnetwork/streamid" "^3.0.5" + "@composedb/graphql-scalars" "^0.6.0" dataloader "^2.2.2" - graphql "^16.5.0" + graphql "^16.8.1" graphql-relay "^0.10.0" -"@composedb/types@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@composedb/types/-/types-0.4.3.tgz#0fb5887cd5ec5881be08a1dccbbf13605155b001" - integrity sha512-oNkOnMmObTak1IPX8gpRI/cPad1m/waFowG5kRtjvLBrrpl1lrRqBVZ1rYVL2O78pq28v8vKvKw0Ac2ss6I4Kw== - dependencies: - "@ceramicnetwork/stream-model" "^1.5.0" - "@ceramicnetwork/stream-model-instance" "^1.5.0" - dids "^4.0.0" - json-schema-typed "^8.0.1" - -"@composedb/types@^0.5.0": - version "0.5.0" - resolved "https://registry.npmmirror.com/@composedb/types/-/types-0.5.0.tgz#a051c62019106f7952ff338b3cc42831a36f4450" - integrity sha512-rL4s2qlges21mWB1ujE6XhKEFDayP4vJU5NwS6NMt04Ig9xQ17reYBwR0fAJ61kE1qLuzhaQUe4bE6doPnSIjQ== +"@composedb/types@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@composedb/types/-/types-0.6.0.tgz#21eaf27fbc1c877a6a96440cef4056d275d282b5" + integrity sha512-Bpt85C/bIByqFx87OC14DBGfXCV7tj9IsZ5AQ0fv53bGATs+otEj+tnz5UxDRcSSuT9iLOLa8XLLKiEKkwmecQ== dependencies: - "@ceramicnetwork/common" "^2.33.0" - "@ceramicnetwork/stream-model" "^1.15.0" - "@ceramicnetwork/stream-model-instance" "^1.15.0" + "@ceramicnetwork/common" "^3.0.5" + "@ceramicnetwork/stream-model" "^2.0.5" + "@ceramicnetwork/stream-model-instance" "^2.0.5" dids "^4.0.4" json-schema-typed "^8.0.1" @@ -1648,6 +1484,16 @@ multiformats "^11.0.1" uint8arrays "^4.0.3" +"@didtools/key-webcrypto@^0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@didtools/key-webcrypto/-/key-webcrypto-0.1.2.tgz#8a9da10367ace17c1616a297577b40137c15f97e" + integrity sha512-ZDlwl2TnITDA6R/FpZVh3YbgRIIaJ9rCzA49wUd/EYlK0CGD8d6HQSB9hMdX0ht+paRE+9AD/YNewkppktEUKQ== + dependencies: + fast-json-stable-stringify "^2.1.0" + rpc-utils "^0.6.2" + uint8arrays "^4.0.9" + varint "^6.0.0" + "@didtools/pkh-ethereum@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@didtools/pkh-ethereum/-/pkh-ethereum-0.1.0.tgz#fc55d341ca043cf959651e603cc2eafde8ebf1fc" @@ -1658,16 +1504,6 @@ "@stablelib/random" "^1.0.2" caip "^1.1.0" -"@didtools/pkh-ethereum@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@didtools/pkh-ethereum/-/pkh-ethereum-0.2.1.tgz#8c03a56f34c824fa83db6161362f7fa45dd2b5e9" - integrity sha512-apQefbOqqy8HQMDNVG0ITxHLr9I5iZrjADX+mPB+ie1ue8MO8pOHMifLQ3j0R6RjS2einCd+hEZ4Ib4AKs3Xlw== - dependencies: - "@didtools/cacao" "^2.0.0" - "@ethersproject/wallet" "^5.7.0" - "@stablelib/random" "^1.0.2" - caip "^1.1.0" - "@didtools/pkh-ethereum@^0.4.1": version "0.4.1" resolved "https://registry.npmmirror.com/@didtools/pkh-ethereum/-/pkh-ethereum-0.4.1.tgz#b03472bf0196d2ece6a64d5f01aa96c866cdccb7" @@ -1690,6 +1526,17 @@ caip "^1.1.0" uint8arrays "^4.0.3" +"@didtools/pkh-solana@^0.1.1": + version "0.1.1" + resolved "https://registry.npmjs.org/@didtools/pkh-solana/-/pkh-solana-0.1.1.tgz#e325682b71cada03bb29cf6ecaa921f183c17a7b" + integrity sha512-2Sn4xSg8otqAeXA0tDYUM+3KQtzOr2gBcu0wbJyOn/30Ocj3jxHFQg7NfumEsiQtQ0HtnmsGZUrnCgoxHqLwWg== + dependencies: + "@didtools/cacao" "^2.0.0" + "@noble/curves" "^1.0.0" + "@stablelib/random" "^1.0.2" + caip "^1.1.0" + uint8arrays "^4.0.3" + "@didtools/pkh-stacks@^0.1.0": version "0.1.0" resolved "https://registry.npmjs.org/@didtools/pkh-stacks/-/pkh-stacks-0.1.0.tgz#91191dee0a5767989d68ffc6a78e7736b44c8f52" @@ -1773,11 +1620,23 @@ dependencies: "@emotion/memoize" "^0.8.0" +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/memoize@^0.8.0": version "0.8.0" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + "@emotion/react@^11.9.3": version "11.10.6" resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" @@ -2299,17 +2158,18 @@ "@n1ru4l/push-pull-async-iterable-iterator" "^3.1.0" meros "^1.1.4" -"@graphql-tools/batch-delegate@^8.4.25": - version "8.4.25" - resolved "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-8.4.25.tgz#2ef78838c36348ef609c3bf5dbe0a6ef9ac4c78d" - integrity sha512-Rn/gLxMZULzo2+l4uKxYzXQYdZykWmKXTGPyyxuiLUu92Odt71IVb0+56WS+Tg0d7WUS0DeRVZWTRT2bZS7Nvw== +"@graphql-tools/batch-delegate@^9.0.0": + version "9.0.0" + resolved "https://registry.npmjs.org/@graphql-tools/batch-delegate/-/batch-delegate-9.0.0.tgz#dd9e87466f450bae61a20525a2a8d8b0d257df37" + integrity sha512-23NmxcHQeKcfhMQyrRPTZfW4/+bSpAyR/qAhRjx+/hikDIa1Uv2XVgV9jIitSgM0OEk/KGPB4VQv+LCOWvAYiw== dependencies: - "@graphql-tools/delegate" "^9.0.31" - "@graphql-tools/utils" "^9.2.1" + "@graphql-tools/delegate" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" dataloader "2.2.2" tslib "^2.4.0" + value-or-promise "^1.0.12" -"@graphql-tools/batch-execute@^8.5.18", "@graphql-tools/batch-execute@^8.5.19": +"@graphql-tools/batch-execute@^8.5.18": version "8.5.19" resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-8.5.19.tgz#b204cc5bded1b1d12088b399d3b72eaf38d63132" integrity sha512-eqofTMYPygg9wVPdA+p8lk4NBpaPTcDut6SlnDk9IiYdY23Yfo6pY7mzZ3b27GugI7HDtB2OZUxzZJSGsk6Qew== @@ -2319,6 +2179,16 @@ tslib "^2.4.0" value-or-promise "1.0.12" +"@graphql-tools/batch-execute@^9.0.1", "@graphql-tools/batch-execute@^9.0.2": + version "9.0.2" + resolved "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.2.tgz#5ac3257501e7941fad40661bb5e1110d6312f58b" + integrity sha512-Y2uwdZI6ZnatopD/SYfZ1eGuQFI7OU2KGZ2/B/7G9ISmgMl5K+ZZWz/PfIEXeiHirIDhyk54s4uka5rj2xwKqQ== + dependencies: + "@graphql-tools/utils" "^10.0.5" + dataloader "^2.2.2" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/delegate@9.0.28", "@graphql-tools/delegate@^9.0.27": version "9.0.28" resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.28.tgz#026275094b2ff3f4cbbe99caff2d48775aeb67d6" @@ -2332,18 +2202,17 @@ tslib "^2.5.0" value-or-promise "^1.0.12" -"@graphql-tools/delegate@^9.0.31": - version "9.0.32" - resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-9.0.32.tgz#c8d6c3d93e36aa48b51915161852f2eb72427249" - integrity sha512-ZleId1mDSca4cjHQidIDv4HQR7B7B+nazF3nsWm2IIps40suR/hkADVgfJNegYbn8KhA3C9b1qEjcltP/Do3Ag== +"@graphql-tools/delegate@^10.0.0", "@graphql-tools/delegate@^10.0.1", "@graphql-tools/delegate@^10.0.3": + version "10.0.3" + resolved "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.0.3.tgz#2d0e133da94ca92c24e0c7360414e5592321cf2d" + integrity sha512-Jor9oazZ07zuWkykD3OOhT/2XD74Zm6Ar0ENZMk75MDD51wB2UWUIMljtHxbJhV5A6UBC2v8x6iY0xdCGiIlyw== dependencies: - "@graphql-tools/batch-execute" "^8.5.19" - "@graphql-tools/executor" "^0.0.18" - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" + "@graphql-tools/batch-execute" "^9.0.1" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.5" dataloader "^2.2.2" tslib "^2.5.0" - value-or-promise "^1.0.12" "@graphql-tools/executor-graphql-ws@^0.0.12": version "0.0.12" @@ -2394,16 +2263,16 @@ tslib "^2.4.0" value-or-promise "1.0.12" -"@graphql-tools/executor@^0.0.18": - version "0.0.18" - resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-0.0.18.tgz#5b9f881d59484ea55278de3b4743ece8d68bc6e7" - integrity sha512-xZC0C+/npXoSHBB5bsJdwxDLgtl1Gu4fL9J2TPQmXoZC3L2N506KJoppf9LgWdHU/xK04luJrhP6WjhfkIN0pQ== +"@graphql-tools/executor@^1.0.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.2.0.tgz#6c45f4add765769d9820c4c4405b76957ba39c79" + integrity sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg== dependencies: - "@graphql-tools/utils" "^9.2.1" + "@graphql-tools/utils" "^10.0.0" "@graphql-typed-document-node/core" "3.2.0" - "@repeaterjs/repeater" "3.0.4" + "@repeaterjs/repeater" "^3.0.4" tslib "^2.4.0" - value-or-promise "1.0.12" + value-or-promise "^1.0.12" "@graphql-tools/graphql-file-loader@^7.3.7": version "7.5.16" @@ -2469,6 +2338,14 @@ "@graphql-tools/utils" "^10.0.0" tslib "^2.4.0" +"@graphql-tools/merge@^9.0.1": + version "9.0.1" + resolved "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.1.tgz#693f15da152339284469b1ce5c6827e3ae350a29" + integrity sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw== + dependencies: + "@graphql-tools/utils" "^10.0.10" + tslib "^2.4.0" + "@graphql-tools/schema@9.0.17": version "9.0.17" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.17.tgz#d731e9899465f88d5b9bf69e607ec465bb88b062" @@ -2489,7 +2366,17 @@ tslib "^2.4.0" value-or-promise "^1.0.12" -"@graphql-tools/schema@^9.0.16", "@graphql-tools/schema@^9.0.18": +"@graphql-tools/schema@^10.0.2": + version "10.0.2" + resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.2.tgz#21bc2ee25a65fb4890d2e5f9f22ef1f733aa81da" + integrity sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w== + dependencies: + "@graphql-tools/merge" "^9.0.1" + "@graphql-tools/utils" "^10.0.10" + tslib "^2.4.0" + value-or-promise "^1.0.12" + +"@graphql-tools/schema@^9.0.16": version "9.0.18" resolved "https://registry.npmjs.org/@graphql-tools/schema/-/schema-9.0.18.tgz#f66dd5e76e1aba85904cb649fde88ae01718c45c" integrity sha512-Kckb+qoo36o5RSIVfBNU5XR5fOg4adNa1xuhhUgbQejDaI684tIJbTWwYbrDPVEGL/dqJJX3rrsq7RLufjNFoQ== @@ -2499,17 +2386,18 @@ tslib "^2.4.0" value-or-promise "1.0.12" -"@graphql-tools/stitch@^8.7.42": - version "8.7.48" - resolved "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-8.7.48.tgz#f2aa148726673827fdba71ae4c98abf5722521c7" - integrity sha512-19C+RCjndOn8824fbea/X+EpnDTwMRWnXd+qiaUU6L6laDKT5Bv6iZtIcJ3AKcP0ipSsTo4buCO7ynxO+qECgA== +"@graphql-tools/stitch@^9.0.3": + version "9.0.3" + resolved "https://registry.npmjs.org/@graphql-tools/stitch/-/stitch-9.0.3.tgz#6164333ecf3317d9a5e1a7e5567ae37ca936a8ac" + integrity sha512-G03XahiHDu1pnaS8z2GNfsV/5BribMEUATT5dCHBAqj13Te5y1amZNQePrmw8DLtbf5qDbU6CO7kGHPxv0XO9A== dependencies: - "@graphql-tools/batch-delegate" "^8.4.25" - "@graphql-tools/delegate" "^9.0.31" - "@graphql-tools/merge" "^8.4.1" - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" - "@graphql-tools/wrap" "^9.4.2" + "@graphql-tools/batch-delegate" "^9.0.0" + "@graphql-tools/delegate" "^10.0.1" + "@graphql-tools/executor" "^1.0.0" + "@graphql-tools/merge" "^9.0.0" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + "@graphql-tools/wrap" "^10.0.0" tslib "^2.4.0" value-or-promise "^1.0.11" @@ -2549,6 +2437,27 @@ dset "^3.1.2" tslib "^2.4.0" +"@graphql-tools/utils@^10.0.10", "@graphql-tools/utils@^10.0.11": + version "10.0.11" + resolved "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.0.11.tgz#1238fbe37e8d6c662c48ab2477c98269d6fd851a" + integrity sha512-vVjXgKn6zjXIlYBd7yJxCVMYGb5j18gE3hx3Qw3mNsSEsYQXbJbPdlwb7Fc9FogsJei5AaqiQerqH4kAosp1nQ== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + cross-inspect "1.0.0" + dset "^3.1.2" + tslib "^2.4.0" + +"@graphql-tools/wrap@^10.0.0": + version "10.0.1" + resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.1.tgz#9e3d27d2723962c26c4377d5d7ab0d3038bf728c" + integrity sha512-Cw6hVrKGM2OKBXeuAGltgy4tzuqQE0Nt7t/uAqnuokSXZhMHXJUb124Bnvxc2gPZn5chfJSDafDe4Cp8ZAVJgg== + dependencies: + "@graphql-tools/delegate" "^10.0.3" + "@graphql-tools/schema" "^10.0.0" + "@graphql-tools/utils" "^10.0.0" + tslib "^2.4.0" + value-or-promise "^1.0.12" + "@graphql-tools/wrap@^9.3.8": version "9.3.8" resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.3.8.tgz#c6f53b7bc98cf3fa3d91e41be3b99254ae99b409" @@ -2560,17 +2469,6 @@ tslib "^2.4.0" value-or-promise "1.0.12" -"@graphql-tools/wrap@^9.4.2": - version "9.4.2" - resolved "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-9.4.2.tgz#30835587c4c73be1780908a7cb077d8013aa2703" - integrity sha512-DFcd9r51lmcEKn0JW43CWkkI2D6T9XI1juW/Yo86i04v43O9w2/k4/nx2XTJv4Yv+iXwUw7Ok81PGltwGJSDSA== - dependencies: - "@graphql-tools/delegate" "^9.0.31" - "@graphql-tools/schema" "^9.0.18" - "@graphql-tools/utils" "^9.2.1" - tslib "^2.4.0" - value-or-promise "^1.0.12" - "@graphql-typed-document-node/core@3.1.2": version "3.1.2" resolved "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.1.2.tgz#6fc464307cbe3c8ca5064549b806360d84457b04" @@ -2600,28 +2498,13 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@internationalized/date@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.2.0.tgz#1d266e5e5543a059cf8cca9b954fa033c3e58a75" - integrity sha512-VDMHN1m33L4eqPs5BaihzgQJXyaORbMoHOtrapFxx179J8ucY5CRIHYsq5RRLKPHZWgjNfa5v6amWWDkkMFywA== - dependencies: - "@swc/helpers" "^0.4.14" - -"@internationalized/date@^3.5.0": - version "3.5.0" - resolved "https://registry.npmmirror.com/@internationalized/date/-/date-3.5.0.tgz#67f1dd62355f05140cc80e324842e9bfb4553abe" - integrity sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ== +"@internationalized/date@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@internationalized/date/-/date-3.5.1.tgz#14401139f70c1ef14b845d3cac8912e82e82adcc" + integrity sha512-LUQIfwU9e+Fmutc/DpRTGXSdgYZLBegi4wygCWDSVmUdLTaMHsQyASDiJtREwanwKuQLq0hY76fCJ9J/9I2xOQ== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/message@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@internationalized/message/-/message-3.1.0.tgz#b284014cd8bbb430a648b76c87c62bdca968b04c" - integrity sha512-Oo5m70FcBdADf7G8NkUffVSfuCdeAYVfsvNjZDi9ELpjvkc4YNJVTHt/NyTI9K7FgAVoELxiP9YmN0sJ+HNHYQ== - dependencies: - "@swc/helpers" "^0.4.14" - intl-messageformat "^10.1.0" - "@internationalized/message@^3.1.1": version "3.1.1" resolved "https://registry.npmmirror.com/@internationalized/message/-/message-3.1.1.tgz#0f29c5a239b5dcd457b55f21dcd38d1a44a1236a" @@ -2630,34 +2513,25 @@ "@swc/helpers" "^0.5.0" intl-messageformat "^10.1.0" -"@internationalized/number@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.2.0.tgz#dffb661cacd61a87b814c47b7d5240a286249066" - integrity sha512-GUXkhXSX1Ee2RURnzl+47uvbOxnlMnvP9Er+QePTjDjOPWuunmLKlEkYkEcLiiJp7y4l9QxGDLOlVr8m69LS5w== - dependencies: - "@swc/helpers" "^0.4.14" - -"@internationalized/number@^3.2.1": - version "3.2.1" - resolved "https://registry.npmmirror.com/@internationalized/number/-/number-3.2.1.tgz#570e4010544a84a8225e65b34a689a36187caaa8" - integrity sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg== +"@internationalized/number@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@internationalized/number/-/number-3.5.0.tgz#9de6018424b441a6545f209afa286ad7df4a2906" + integrity sha512-ZY1BW8HT9WKYvaubbuqXbbDdHhOUMfE2zHHFJeTppid0S+pc8HtdIxFxaYMsGjCb4UsF+MEJ4n2TfU7iHnUK8w== dependencies: "@swc/helpers" "^0.5.0" -"@internationalized/string@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.1.0.tgz#0b365906a8c3f44800b0db52c2e990cff345abce" - integrity sha512-TJQKiyUb+wyAfKF59UNeZ/kELMnkxyecnyPCnBI1ma4NaXReJW+7Cc2mObXAqraIBJUVv7rgI46RLKrLgi35ng== - dependencies: - "@swc/helpers" "^0.4.14" - -"@internationalized/string@^3.1.1": - version "3.1.1" - resolved "https://registry.npmmirror.com/@internationalized/string/-/string-3.1.1.tgz#2ab7372d58bbb7ffd3de62fc2a311e4690186981" - integrity sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA== +"@internationalized/string@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@internationalized/string/-/string-3.2.0.tgz#cb7d2229919ccbfb9f3312710477f28986d217d6" + integrity sha512-Xx3Sy3f2c9ctT+vh8c7euEaEHQZltp0euZ3Hy4UfT3E13r6lxpUS3kgKyumEjboJZSnaZv7JhqWz3D75v+IxQg== dependencies: "@swc/helpers" "^0.5.0" +"@ioredis/commands@^1.1.1": + version "1.2.0" + resolved "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" + integrity sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg== + "@ipld/dag-cbor@^7.0.0", "@ipld/dag-cbor@^7.0.1": version "7.0.3" resolved "https://registry.npmjs.org/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz#aa31b28afb11a807c3d627828a344e5521ac4a1e" @@ -2990,11 +2864,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@ledgerhq/connect-kit-loader@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@ledgerhq/connect-kit-loader/-/connect-kit-loader-1.1.0.tgz#10343b78ef13436818bf3453568a559c0eeb9d48" - integrity sha512-HUy12FEczoWY2FPubnsm1uOA8tkVWc0j90i47suThV3C9NL2xx69ZAIEU3Ytzs2bwLek9S1Q2S1VQJvA+3Ygkg== - "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" @@ -3012,10 +2881,10 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@material-design-icons/svg@^0.14.7": - version "0.14.7" - resolved "https://registry.npmjs.org/@material-design-icons/svg/-/svg-0.14.7.tgz#8142aba3926fd998fb7da9eaa8ab961f780b80f9" - integrity sha512-r3mDjzAJ1EsErok8c2wMPmeGnjX2iF+RgvvbP/5OdZrygszE77syTy9XdcRtfU2f0b0iQ24lXE76F8xmkq0y6w== +"@material-design-icons/svg@^0.14.13": + version "0.14.13" + resolved "https://registry.npmjs.org/@material-design-icons/svg/-/svg-0.14.13.tgz#de5a79038cf8b281f4b47d79c07399b2b92fcfb7" + integrity sha512-nCExGZOtoLoFeeqShEOM4XA9DkkLzLlQdk/ZxHxps0//dz6e1Lw3fvQbZ2X/+0Dz2O+udiEukfZ4Nd4KpHg8aA== "@metamask/safe-event-emitter@2.0.0", "@metamask/safe-event-emitter@^2.0.0": version "2.0.0" @@ -3121,11 +2990,6 @@ resolved "https://registry.npmjs.org/@multiavatar/multiavatar/-/multiavatar-1.0.7.tgz#bc2b855bab728a51ee9cee2412ee9f76282b7c78" integrity sha512-Yg9Uw57bmlErsWL0CSv4d6D4ZqVBE00OZmYr9MRgygoXZdboNtsEI6FbBRw1AY8l88Sm1ARcyojtlm2uwUn0Zg== -"@multiformats/base-x@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@multiformats/base-x/-/base-x-4.0.1.tgz#95ff0fa58711789d53aefb2590a8b7a4e715d121" - integrity sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw== - "@n1ru4l/push-pull-async-iterable-iterator@^3.1.0": version "3.2.0" resolved "https://registry.npmjs.org/@n1ru4l/push-pull-async-iterable-iterator/-/push-pull-async-iterable-iterator-3.2.0.tgz#c15791112db68dd9315d329d652b7e797f737655" @@ -3150,7 +3014,7 @@ dependencies: "@noble/hashes" "1.3.0" -"@noble/curves@^1.0.0", "@noble/curves@^1.1.0": +"@noble/curves@1.2.0", "@noble/curves@^1.0.0", "@noble/curves@^1.1.0", "@noble/curves@~1.2.0": version "1.2.0" resolved "https://registry.npmmirror.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== @@ -3182,6 +3046,11 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== +"@noble/hashes@~1.3.2": + version "1.3.3" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@^1.6.3": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -3243,32 +3112,124 @@ wordwrap "^1.0.0" wrap-ansi "^7.0.0" -"@peculiar/asn1-schema@^2.3.6": - version "2.3.6" - resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" - integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== - dependencies: - asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" +"@parcel/watcher-android-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.3.0.tgz#d82e74bb564ebd4d8a88791d273a3d2bd61e27ab" + integrity sha512-f4o9eA3dgk0XRT3XhB0UWpWpLnKgrh1IwNJKJ7UJek7eTYccQ8LR7XUWFKqw6aEq5KUNlCcGvSzKqSX/vtWVVA== -"@peculiar/json-schema@^1.1.12": - version "1.1.12" - resolved "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" - integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== - dependencies: - tslib "^2.0.0" +"@parcel/watcher-darwin-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.3.0.tgz#c9cd03f8f233d512fcfc873d5b4e23f1569a82ad" + integrity sha512-mKY+oijI4ahBMc/GygVGvEdOq0L4DxhYgwQqYAz/7yPzuGi79oXrZG52WdpGA1wLBPrYb0T8uBaGFo7I6rvSKw== -"@peculiar/webcrypto@^1.4.0": - version "1.4.2" - resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.2.tgz#66d70ee476608fa45ebd60af0aa3c69640d0d85a" - integrity sha512-dMvTarTKRx3FzlRUD7Zi2qEsnWVedb/XNRvfM/JaanhTPm+ug9wPsvLXfPHDdl4mjbGdD+Lo/DXRd9sJRuQV3w== - dependencies: - "@peculiar/asn1-schema" "^2.3.6" - "@peculiar/json-schema" "^1.1.12" - pvtsutils "^1.3.2" - tslib "^2.5.0" - webcrypto-core "^1.7.7" +"@parcel/watcher-darwin-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.3.0.tgz#83c902994a2a49b9e1ab5050dba24876fdc2c219" + integrity sha512-20oBj8LcEOnLE3mgpy6zuOq8AplPu9NcSSSfyVKgfOhNAc4eF4ob3ldj0xWjGGbOF7Dcy1Tvm6ytvgdjlfUeow== + +"@parcel/watcher-freebsd-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.3.0.tgz#7a0f4593a887e2752b706aff2dae509aef430cf6" + integrity sha512-7LftKlaHunueAEiojhCn+Ef2CTXWsLgTl4hq0pkhkTBFI3ssj2bJXmH2L67mKpiAD5dz66JYk4zS66qzdnIOgw== + +"@parcel/watcher-linux-arm-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.3.0.tgz#3fc90c3ebe67de3648ed2f138068722f9b1d47da" + integrity sha512-1apPw5cD2xBv1XIHPUlq0cO6iAaEUQ3BcY0ysSyD9Kuyw4MoWm1DV+W9mneWI+1g6OeP6dhikiFE6BlU+AToTQ== + +"@parcel/watcher-linux-arm64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.3.0.tgz#f7bbbf2497d85fd11e4c9e9c26ace8f10ea9bcbc" + integrity sha512-mQ0gBSQEiq1k/MMkgcSB0Ic47UORZBmWoAWlMrTW6nbAGoLZP+h7AtUM7H3oDu34TBFFvjy4JCGP43JlylkTQA== + +"@parcel/watcher-linux-arm64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.3.0.tgz#de131a9fcbe1fa0854e9cbf4c55bed3b35bcff43" + integrity sha512-LXZAExpepJew0Gp8ZkJ+xDZaTQjLHv48h0p0Vw2VMFQ8A+RKrAvpFuPVCVwKJCr5SE+zvaG+Etg56qXvTDIedw== + +"@parcel/watcher-linux-x64-glibc@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.3.0.tgz#193dd1c798003cdb5a1e59470ff26300f418a943" + integrity sha512-P7Wo91lKSeSgMTtG7CnBS6WrA5otr1K7shhSjKHNePVmfBHDoAOHYRXgUmhiNfbcGk0uMCHVcdbfxtuiZCHVow== + +"@parcel/watcher-linux-x64-musl@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.3.0.tgz#6dbdb86d96e955ab0fe4a4b60734ec0025a689dd" + integrity sha512-+kiRE1JIq8QdxzwoYY+wzBs9YbJ34guBweTK8nlzLKimn5EQ2b2FSC+tAOpq302BuIMjyuUGvBiUhEcLIGMQ5g== + +"@parcel/watcher-wasm@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.3.0.tgz#73b66c6fbd2a3326ae86a1ec77eab7139d0dd725" + integrity sha512-ejBAX8H0ZGsD8lSICDNyMbSEtPMWgDL0WFCt/0z7hyf5v8Imz4rAM8xY379mBsECkq/Wdqa5WEDLqtjZ+6NxfA== + dependencies: + is-glob "^4.0.3" + micromatch "^4.0.5" + napi-wasm "^1.1.0" + +"@parcel/watcher-win32-arm64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.3.0.tgz#59da26a431da946e6c74fa6b0f30b120ea6650b6" + integrity sha512-35gXCnaz1AqIXpG42evcoP2+sNL62gZTMZne3IackM+6QlfMcJLy3DrjuL6Iks7Czpd3j4xRBzez3ADCj1l7Aw== + +"@parcel/watcher-win32-ia32@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.3.0.tgz#3ee6a18b08929cd3b788e8cc9547fd9a540c013a" + integrity sha512-FJS/IBQHhRpZ6PiCjFt1UAcPr0YmCLHRbTc00IBTrelEjlmmgIVLeOx4MSXzx2HFEy5Jo5YdhGpxCuqCyDJ5ow== + +"@parcel/watcher-win32-x64@2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.3.0.tgz#14e7246289861acc589fd608de39fe5d8b4bb0a7" + integrity sha512-dLx+0XRdMnVI62kU3wbXvbIRhLck4aE28bIGKbRGS7BJNt54IIj9+c/Dkqb+7DJEbHUZAX1bwaoM8PqVlHJmCA== + +"@parcel/watcher@^2.3.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.3.0.tgz#803517abbc3981a1a1221791d9f59dc0590d50f9" + integrity sha512-pW7QaFiL11O0BphO+bq3MgqeX/INAk9jgBldVDYjlQPO4VddoZnF22TcF9onMhnLVHuNqBJeRf+Fj7eezi/+rQ== + dependencies: + detect-libc "^1.0.3" + is-glob "^4.0.3" + micromatch "^4.0.5" + node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-android-arm64" "2.3.0" + "@parcel/watcher-darwin-arm64" "2.3.0" + "@parcel/watcher-darwin-x64" "2.3.0" + "@parcel/watcher-freebsd-x64" "2.3.0" + "@parcel/watcher-linux-arm-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-glibc" "2.3.0" + "@parcel/watcher-linux-arm64-musl" "2.3.0" + "@parcel/watcher-linux-x64-glibc" "2.3.0" + "@parcel/watcher-linux-x64-musl" "2.3.0" + "@parcel/watcher-win32-arm64" "2.3.0" + "@parcel/watcher-win32-ia32" "2.3.0" + "@parcel/watcher-win32-x64" "2.3.0" + +"@peculiar/asn1-schema@^2.3.6": + version "2.3.6" + resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" + integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.2" + resolved "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.2.tgz#66d70ee476608fa45ebd60af0aa3c69640d0d85a" + integrity sha512-dMvTarTKRx3FzlRUD7Zi2qEsnWVedb/XNRvfM/JaanhTPm+ug9wPsvLXfPHDdl4mjbGdD+Lo/DXRd9sJRuQV3w== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.5.0" + webcrypto-core "^1.7.7" "@pmmmwh/react-refresh-webpack-plugin@^0.5.3": version "0.5.10" @@ -3290,17 +3251,19 @@ resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== -"@rainbow-me/rainbowkit@1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-1.0.2.tgz#d6113ffe95c7af0ef03a8c0dcf227862e7730136" - integrity sha512-CIcEekBBlYiqg2oNS7LZqqN882OfJ0T1ORe4c46dscSuMCaX9sdbviQR1m8LoA4KocSCzSxOPAnfoVN8eC/HNA== +"@rainbow-me/rainbowkit@^1.3.0": + version "1.3.1" + resolved "https://registry.npmjs.org/@rainbow-me/rainbowkit/-/rainbowkit-1.3.1.tgz#b5add291363e77dd9cb09496f65dd3b8c2236df5" + integrity sha512-4Upi+S12ZHosimzlUpCiOocg4dtfGU2wkzcpxeat/FYHrvhVIOgm0TuzbsIM96W1p7OXabosd7xuxPvwduUygQ== dependencies: "@vanilla-extract/css" "1.9.1" "@vanilla-extract/dynamic" "2.0.2" "@vanilla-extract/sprinkles" "1.5.0" clsx "1.1.1" + i18n-js "^4.3.2" qrcode "1.5.0" react-remove-scroll "2.5.4" + ua-parser-js "^1.0.35" "@reach/auto-id@0.17.0": version "0.17.0" @@ -3454,2029 +3417,1029 @@ prop-types "^15.7.2" tslib "^2.3.0" -"@react-aria/breadcrumbs@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.1.tgz#e4bddbaebc7fe0fed34c904a03929618affc5730" - integrity sha512-/7UMNtwTBbhPiswoEZF2zGUtezinKeLrEMmywzWgxryJ6A/edfT5KXXcPr7MZdWH5faEFq27WSYsMqdX1J3MsA== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/link" "^3.5.0" - "@react-aria/utils" "^3.16.0" - "@react-types/breadcrumbs" "^3.5.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/breadcrumbs@^3.5.5": - version "3.5.5" - resolved "https://registry.npmmirror.com/@react-aria/breadcrumbs/-/breadcrumbs-3.5.5.tgz#eb7c812d2608382286b9e177da5ead515712a7e9" - integrity sha512-8O+ntzq8yxmsXVQmLTJGovSespTAuJ17PWvgIL8HsYh7FOU/TRM/rhileaDlZBlIpZtI/hbs+d9MuC6ZOXkl7w== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/link" "^3.5.4" - "@react-aria/utils" "^3.20.0" - "@react-types/breadcrumbs" "^3.6.2" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/button@^3.7.1": - version "3.7.1" - resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.7.1.tgz#780eb2e50bfd2078dd4c880cef7a53f67acf9df5" - integrity sha512-l4Xqu83mT9STB89JLNsejHjHdFZClp/xez07LYfqibdvgcXiH311I76n1QCZqga2OGuIsW+fKmpMtuVPDdS61g== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/toggle" "^3.5.1" - "@react-types/button" "^3.7.2" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/button@^3.8.2": - version "3.8.2" - resolved "https://registry.npmmirror.com/@react-aria/button/-/button-3.8.2.tgz#b392df6db7368198be6e6e4791c0f9d8e23b96ae" - integrity sha512-d1Fgx2XrSk8WMFtGu/ta76m5Rx+f2CuHY1k6nD45QciszD26GbzHdLOSjxev97M6vHj/BOsGL01XcwmTL4fZHA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/calendar@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.2.0.tgz#f0f3fdedf65f3813ab98dc557dd3eb77d92e48bb" - integrity sha512-3wnCusOi7mU9kRMDxspAL81SXAsEVzWuPILOl6OXQHbVtDvRWqkhlqWkjDDoStKD9uwDDB9rfcCsfOQBJnj63A== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/calendar" "^3.2.0" - "@react-types/button" "^3.7.2" - "@react-types/calendar" "^3.2.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/calendar@^3.5.0": - version "3.5.0" - resolved "https://registry.npmmirror.com/@react-aria/calendar/-/calendar-3.5.0.tgz#ac092c7724d801bb9c6c142c5370e628cf99423b" - integrity sha512-n/VrAJlKmsNrBKCPMI3tmCqpV38+Cihtinzp3yp8DeL44WH3IJij6aftkEcI7pIVNajY6vYLS9BbjscvIdg+fw== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/utils" "^3.20.0" - "@react-stately/calendar" "^3.4.0" - "@react-types/button" "^3.8.0" - "@react-types/calendar" "^3.4.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/checkbox@^3.11.0": - version "3.11.0" - resolved "https://registry.npmmirror.com/@react-aria/checkbox/-/checkbox-3.11.0.tgz#f4249befb42b0639af53ce4014bdbd53d4aafcd3" - integrity sha512-3C5ON4IvFu69LihMOB6Y2Zr4T0zjkuPfQ6HrHuS9SiFU+IZuv1z38K/bXk7UkmZoiLtWLloNA5XKNCwf+Y+6Xw== - dependencies: - "@react-aria/label" "^3.7.0" - "@react-aria/toggle" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/checkbox" "^3.5.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/checkbox@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.9.0.tgz#021d612f2578140a9a288b854da3430e4da226d6" - integrity sha512-r6f7fQIZMv5k8x73v9i8Q/WsWqd6Q2yJ8F9TdOrYg5vrRot+QaxzC61HFyW7o+e7A5+UXQfTgU9E/Lezy9YSbA== - dependencies: - "@react-aria/label" "^3.5.1" - "@react-aria/toggle" "^3.6.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/checkbox" "^3.4.1" - "@react-stately/toggle" "^3.5.1" - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/combobox@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.6.0.tgz#5859445ee5ed280e2deabdd35af51ab06974b2fe" - integrity sha512-GQqKUlSZy7wciSbLstq0zTTDP2zPPLxwrsqH/SahruRQqFYG8D/5aaqDMooPg17nGWg6wQ693Ho572+dIIgx6A== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/listbox" "^3.9.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/menu" "^3.9.0" - "@react-aria/overlays" "^3.14.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/textfield" "^3.9.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/combobox" "^3.5.0" - "@react-stately/layout" "^3.12.0" - "@react-types/button" "^3.7.2" - "@react-types/combobox" "^3.6.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/combobox@^3.6.4": - version "3.6.4" - resolved "https://registry.npmmirror.com/@react-aria/combobox/-/combobox-3.6.4.tgz#12b4a1ba9b4c65f344ad24608c19c647c708a212" - integrity sha512-L6KAB9P7ztyKM8B3WISRtVFdz9R66ZA6h+m128JmmTc3DrvSs0lxQMZIKfFuh31IZfAe62p2IwDlR1UbhXffVg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/listbox" "^3.10.2" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/menu" "^3.10.2" - "@react-aria/overlays" "^3.17.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/combobox" "^3.7.0" - "@react-stately/layout" "^3.13.1" - "@react-types/button" "^3.8.0" - "@react-types/combobox" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/datepicker@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.4.0.tgz#152d361aba5688f58c9ac1a62fb9e1a6ee2313d2" - integrity sha512-KhyyeLgWU5eJ+LqpfgOXFm/QBS6SIsX60zOgcQmst+LstsyuYjGQD7oqZX3UIMRWWgWj6urkYHk1yrZtam6doQ== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/number" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/spinbutton" "^3.4.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/datepicker" "^3.4.0" - "@react-types/button" "^3.7.2" - "@react-types/calendar" "^3.2.0" - "@react-types/datepicker" "^3.3.0" - "@react-types/dialog" "^3.5.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/datepicker@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-aria/datepicker/-/datepicker-3.7.0.tgz#a21436989eca57c256855cdedcede41deb2fd6a5" - integrity sha512-zekxxC2dpQIEFFb2Yj6odwgBb9s81g3V7VwjUilkthW2vaVzTjWTZTUYffgcmbfVv++ZGtvlY7iSSTLN7+54Og== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/number" "^3.2.1" - "@internationalized/string" "^3.1.1" - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/spinbutton" "^3.5.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/datepicker" "^3.7.0" - "@react-types/button" "^3.8.0" - "@react-types/calendar" "^3.4.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/dialog" "^3.5.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dialog@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.1.tgz#b9b2ca2c7d4c56e5ed987e26d903234535589dbe" - integrity sha512-nvBIO7GbRSoLPtbS38wCuCHXEbRUIAhD87XKGsFslsmK8csZgJiJa8ZQQNknfvNcEBRIYzNRz2XMPJmnN4H1og== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/overlays" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/overlays" "^3.5.1" - "@react-types/dialog" "^3.5.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/dialog@^3.5.5": - version "3.5.5" - resolved "https://registry.npmmirror.com/@react-aria/dialog/-/dialog-3.5.5.tgz#6cf967fa1c0915636bf5de7e0657df6781bff7de" - integrity sha512-nfh1fg5h8jEe8ktoq1YrlOHuyqoZgZOCYh0PourwfY26Pl7BxFrMyG7HCnY2mjDxnXLJLULONVmUN3WxbgzhxQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/overlays" "^3.17.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/overlays" "^3.6.2" - "@react-types/dialog" "^3.5.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/dnd@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.2.0.tgz#1a0f632952b8b72756739473f2578d0232612bc7" - integrity sha512-O0/JhHA2Qf5gMDqI9DD7xJIZBovUFbn4Y25xMiN52dighmdVLKtw8opgIp+K4lL3n+KR3aG/49R2JYiwJIxHOA== - dependencies: - "@internationalized/string" "^3.1.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/overlays" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-aria/visually-hidden" "^3.8.0" - "@react-stately/dnd" "^3.2.0" - "@react-types/button" "^3.7.2" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/dnd@^3.4.1": - version "3.4.1" - resolved "https://registry.npmmirror.com/@react-aria/dnd/-/dnd-3.4.1.tgz#75674c44e626ad6b701bb5440a368caa3fdbfffb" - integrity sha512-eugNj9/blh5niEeDuhXLsb3juhateoa+t+2u3+awUgWS4jq/csfFHdjT2FPtTS4DVZvZ9sH/JuC1Sp/yxIvhjA== +"@react-aria/breadcrumbs@^3.5.9": + version "3.5.9" + resolved "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.9.tgz#6175244b7428db87e274448778df767fbde8a8de" + integrity sha512-asbXTL5NjeHl1+YIF0K70y8tNHk8Lb6VneYH8yOkpLO49ejyNDYBK0tp0jtI9IZAQiTa2qkhYq58c9LloTwebQ== dependencies: - "@internationalized/string" "^3.1.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/overlays" "^3.17.0" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/dnd" "^3.2.4" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/link" "^3.6.3" + "@react-aria/utils" "^3.23.0" + "@react-types/breadcrumbs" "^3.7.2" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/focus@^3.12.0": - version "3.12.0" - resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.12.0.tgz#ac01f13782c608d0ed24a3f0b39c96b4a0031716" - integrity sha512-nY6/2lpXzLep6dzQEESoowiSqNcy7DFWuRD/qHj9uKcQwWpYH/rqBrHVS/RNvL6Cz/fBA7L/4AzByJ6pTBtoeA== - dependencies: - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" - -"@react-aria/focus@^3.14.1": - version "3.14.1" - resolved "https://registry.npmmirror.com/@react-aria/focus/-/focus-3.14.1.tgz#f91733e158eed0fda4dd495511c8e4a7a7bcd998" - integrity sha512-2oVJgn86Rt7xgbtLzVlrYb7MZHNMpyBVLMMGjWyvjH5Ier2bgZ6czJJmm18Xe4kjlDHN0dnFzBvoRoTCWkmivA== - dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-aria/grid@^3.7.0": - version "3.7.0" - resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.7.0.tgz#f09f3a1697fe39c246cb6aa4bfd47aa8ab00f8c8" - integrity sha512-jXo+/wQotHDSaMSVdVT7Hxzz65Nj2yK1wssIUQPEZalRhcosGWI1vhdQOD0g9GQL1l5DLyw0m55sych6naeBlw== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/grid" "^3.6.0" - "@react-stately/selection" "^3.13.0" - "@react-stately/virtualizer" "^3.5.1" - "@react-types/checkbox" "^3.4.3" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/grid@^3.8.2": - version "3.8.2" - resolved "https://registry.npmmirror.com/@react-aria/grid/-/grid-3.8.2.tgz#0323601f819e985d95478ababe705b06af583a30" - integrity sha512-AaUVDY+oonIISDUzEH+1v6ncv7jnWog1zhBQ+sRFie+8apogv/M0Uj7sSX/lse+K42jIXK67472vz2+s0AJVEA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/live-announcer" "^3.3.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/grid" "^3.8.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/gridlist@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.3.0.tgz#fd0829b8b2b5208a8ac0448f6d9dab006bf1b797" - integrity sha512-VNXnNRcAPel1C9KvhIj+lAC3UvtAg8nrkrtdBvuJTWJPuorAvfF8Dy5Oan+bHoo5KFT/SW96KsR7olH5aZucoQ== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/grid" "^3.7.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/list" "^3.8.0" - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/gridlist@^3.6.0": - version "3.6.0" - resolved "https://registry.npmmirror.com/@react-aria/gridlist/-/gridlist-3.6.0.tgz#6907d57cb5f61f54b320525ea6afc3414a67e9fd" - integrity sha512-Owz21N1iB37iDSPrkPzK6cUoLCn4ch6TC2SIbAst65NytQP5oF+l+u1qHhqFvJC5qdEcA6yIQs3wioax1EdqqA== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/grid" "^3.8.2" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/i18n@^3.7.1": - version "3.7.1" - resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.7.1.tgz#bd52869f67a5847f2dbe89603255a2dfc5ef45b4" - integrity sha512-2fu1cv8yD3V+rlhOqstTdGAubadoMFuPE7lA1FfYdaJNxXa09iWqvpipUPlxYJrahW0eazkesOPDKFwOEMF1iA== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/message" "^3.1.0" - "@internationalized/number" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/i18n@^3.8.2": - version "3.8.2" - resolved "https://registry.npmmirror.com/@react-aria/i18n/-/i18n-3.8.2.tgz#7d7e267647271b45ce5095652d9fa9d83459d0ef" - integrity sha512-WsdByq3DmqEhr8sOdooVcDoS0CGGv+7cegZmmpw5VfUu0f0+0y7YBj/lRS9RuEqlgvSH+K3sPW/+0CkjM/LRGQ== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/message" "^3.1.1" - "@internationalized/number" "^3.2.1" - "@internationalized/string" "^3.1.1" - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/interactions@^3.15.0": - version "3.15.0" - resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.15.0.tgz#db638d6ae0407be52ecaa1882c2ebc2931880da8" - integrity sha512-8br5uatPDISEWMINKGs7RhNPtqLhRsgwQsooaH7Jgxjs0LBlylODa8l7D3NA1uzVzlvfnZm/t2YN/y8ieRSDcQ== - dependencies: - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/interactions@^3.18.0": - version "3.18.0" - resolved "https://registry.npmmirror.com/@react-aria/interactions/-/interactions-3.18.0.tgz#20d242e3d8349533fdc74e88fb9ca7d1ecee91ab" - integrity sha512-V96uRZTVe2KcU5HW+r2cuUcLIfo0KuPOchywk9r48xtJC8u//sv5fAo0LMX6AgsQJ7bV09JO8nDqmZP0gkRElQ== - dependencies: - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/label@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.5.1.tgz#ad7f9c141a1d5af143957716e01404ed4ab558e0" - integrity sha512-3KNg6/MJNMN25o0psBbCWzhJNFjtT5NtYJPrFwGHbAfVWvMTRqNftoyrhR490Ac0q2eMKIXkULl1HVn3izrAuw== - dependencies: - "@react-aria/utils" "^3.16.0" - "@react-types/label" "^3.7.3" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/label@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-aria/label/-/label-3.7.0.tgz#c927d7aed3b3ba581bd7d11a8e17af2fe2063325" - integrity sha512-OEBFKp4zSS9O/IPoVUU/YdThQWI4EXOuUO8z2mog9I3wU1FQHEASGtqkg0fzxhBh8LYnPIl56y02dIBJ7eyxlA== - dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/label" "^3.8.0" - "@react-types/shared" "^3.20.0" +"@react-aria/button@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/button/-/button-3.9.1.tgz#f76f8a74fe6c6b3ffe1fc446d6f750188a33042e" + integrity sha512-nAnLMUAnwIVcRkKzS1G2IU6LZSkIWPJGu9amz/g7Y02cGUwFp3lk5bEw2LdoaXiSDJNSX8g0SZFU8FROg57jfQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/link@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.5.0.tgz#6c8e14b8f11f2a67a0f910f77670c0d4f274dda4" - integrity sha512-GcQEHL1MauvTEfqWy4JGP7/bHPaJZ8QJKmDOKrCQCzcT4ts+YaaG6dGGzkkaKK7gymRAF4ePHWWFHySN5mSE7w== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-types/link" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/link@^3.5.4": +"@react-aria/calendar@^3.5.4": version "3.5.4" - resolved "https://registry.npmmirror.com/@react-aria/link/-/link-3.5.4.tgz#8b0505bcaa5b2a01c900a7abc24f4fefabc87d8d" - integrity sha512-ZHDxf9gbaqit1akkBRwnlMQZH/h/CfKe+rV+Cvw9cKrAgvJXfGHfNQVI3YxoMU7kSTOooKnzXOGWxoMJ11ql8w== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/link" "^3.4.5" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/listbox@^3.10.2": - version "3.10.2" - resolved "https://registry.npmmirror.com/@react-aria/listbox/-/listbox-3.10.2.tgz#58ff21896b49eee6cf294e7768e96a8e8ac05674" - integrity sha512-7w75yGyNUGwxB8dSNuXTe7Yd+ab6VmtpROLIhf3b92BPE51oy77i3/Dy1F8IdZMTUqOFd5Nm8K0Z0ZSjOchDfQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-types/listbox" "^3.4.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/listbox@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.9.0.tgz#243d9a863d2592f003aa2c7604962e4db1d57dee" - integrity sha512-CWJBw+R9eGrd2I/RRIpXeTmCTiJRPz9JgL2EYage1+8lCV0sp7HIH2StTMsVBzCA1eH+vJ06LBcPuiZBdtZFlA== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/list" "^3.8.0" - "@react-types/listbox" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/live-announcer@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.3.0.tgz#04a2a233c2f48c53994f83cafdc4336ec1ea3700" - integrity sha512-6diTS6mIf70KdxfGqiDxHV+9Qv8a9A88EqBllzXGF6HWPdcwde/GIEmfpTwj8g1ImNGZYUwDkv4Hd9lFj0MXEg== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-aria/live-announcer@^3.3.1": - version "3.3.1" - resolved "https://registry.npmmirror.com/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz#bf864b8820fb02daaeefc1c972782a0174fd60b9" - integrity sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-aria/menu@^3.10.2": - version "3.10.2" - resolved "https://registry.npmmirror.com/@react-aria/menu/-/menu-3.10.2.tgz#e875ce43f7c7417563a888dc770e07daf944b423" - integrity sha512-qqnOj6gU7GQAvdTBM9Y+lclaKEciVwfYylmJRu8RBt72jceSBkdR78et9ZLaNMwVPMYCEUxbOv8vvL7VoRKddg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/overlays" "^3.17.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/menu" "^3.5.5" - "@react-stately/tree" "^3.7.2" - "@react-types/button" "^3.8.0" - "@react-types/menu" "^3.9.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/menu@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.9.0.tgz#cad4caf1aca4bbed8c4a02cac94ffb87f42adf28" - integrity sha512-lIbfWzFvYE7EPOno3lVogXHlc6fzswymlpJWiMBKaB68wkfCtknIIL1cwWssiwgGU63v08H5YpQOZdxRwux2PQ== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/overlays" "^3.14.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/menu" "^3.5.1" - "@react-stately/tree" "^3.6.0" - "@react-types/button" "^3.7.2" - "@react-types/menu" "^3.9.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/meter@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.1.tgz#6d1fe833f4a5a4469ceca49570a2f3107acb7e58" - integrity sha512-z+FGa8mZgLk/A0leNrGXb43YnOafRea+pZbDQvRQZa5E9kNIVhXaIfFrs0f+Wro8rnOPM8G2V17/XSfy9M809A== - dependencies: - "@react-aria/progress" "^3.4.1" - "@react-types/meter" "^3.3.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/meter@^3.4.5": - version "3.4.5" - resolved "https://registry.npmmirror.com/@react-aria/meter/-/meter-3.4.5.tgz#c51a48132bc57ec6073ce6860a2182a31b377582" - integrity sha512-ly0x8rHsBW/pGGyQ8MF5qW1SiyPmD/7HGL3La9sJ9Gd8bGqz5CM7MCbPZN27DEwAEdu2BFqAaOKzhxDt2AU65g== - dependencies: - "@react-aria/progress" "^3.4.5" - "@react-types/meter" "^3.3.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/numberfield@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.5.0.tgz#ddd8352d33f5455b558751f0a7142b2d5a691e48" - integrity sha512-gOe0BKrYGXrjqn0dkMuMoB+WYzn1qwxR7QvKwwfceutUmirjEvMSQOldnBhHao55pxd4/4bWssrEHhJb7YmPiQ== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/spinbutton" "^3.4.0" - "@react-aria/textfield" "^3.9.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/numberfield" "^3.4.1" - "@react-types/button" "^3.7.2" - "@react-types/numberfield" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@react-types/textfield" "^3.7.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/numberfield@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-aria/numberfield/-/numberfield-3.8.0.tgz#3f931f6e95e00d4f9b83be5782b5e4d13b87c332" - integrity sha512-yfytm+cuKBFlszCL0RCuEKOxyX3xW320MN1RotrfGxMbalssEJyj4a0sBPi2NteG6YtvzOrzwHvRdQP5FjSu5w== + resolved "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.5.4.tgz#a3afd32346668cc574763be0b36d91c9d2e18a8d" + integrity sha512-8k7khgea5kwfWriZJWCADNB0R2d7g5A6tTjUEktK4FFZcTb0RCubFejts4hRyzKlF9XHUro2dfh6sbZrzfMKDQ== dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" + "@internationalized/date" "^3.5.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" "@react-aria/live-announcer" "^3.3.1" - "@react-aria/spinbutton" "^3.5.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/numberfield" "^3.6.1" - "@react-types/button" "^3.8.0" - "@react-types/numberfield" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/overlays@^3.14.0": - version "3.14.0" - resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.14.0.tgz#2206ca33010dbf6f1986dac6019caeeb5632c03d" - integrity sha512-lt4vOj44ho0LpmpaHwQ4VgX7eNfKXig9VD7cvE9u7uyECG51jqt9go19s4+/O+otX7pPrhdYlEB2FxLFJocxfw== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/ssr" "^3.6.0" - "@react-aria/utils" "^3.16.0" - "@react-aria/visually-hidden" "^3.8.0" - "@react-stately/overlays" "^3.5.1" - "@react-types/button" "^3.7.2" - "@react-types/overlays" "^3.7.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/overlays@^3.17.0": - version "3.17.0" - resolved "https://registry.npmmirror.com/@react-aria/overlays/-/overlays-3.17.0.tgz#93976917cf094d5e5ee5453659d9cdd5fe730d38" - integrity sha512-wfQ00llAIMLDtIid+0MvNqvbLP6Fqi2/hfvAxhDaRqrkiARwuCAclWNCIdCzF599IpZOMcjjBgIILEXdfA0ziw== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/ssr" "^3.8.0" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/overlays" "^3.6.2" - "@react-types/button" "^3.8.0" - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/progress@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.1.tgz#5eef5dae40275614125928f5c54d81e2f645f83c" - integrity sha512-hSM4TDfL9Sy0hMFEEXjYsKDR1ZnNdVV8EQ6WDe1RdHkqifKtbEoUC5fvQu5ZdPx65jG6xWx/WG9Mv/ylMiYnig== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/label" "^3.5.1" - "@react-aria/utils" "^3.16.0" - "@react-types/progress" "^3.4.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/progress@^3.4.5": - version "3.4.5" - resolved "https://registry.npmmirror.com/@react-aria/progress/-/progress-3.4.5.tgz#ee3c9f816bb53285e5dd4bb3923c51bda712469a" - integrity sha512-9i/+v3BVX79kwSiy+K9cozLSXjO5jb3WCZTm2O7KaZaLq5beCnSVuZdYxRo8C22ooeh0TXdYEl6Duujh86k+yg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-types/progress" "^3.4.3" - "@react-types/shared" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/calendar" "^3.4.3" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.3" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/radio@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.6.0.tgz#e9bf6fffd1f0f11d3f7c62b247a9a327f550ec39" - integrity sha512-yMyaqFSf05P8w4LE50ENIJza4iM74CEyAhVlQwxRszXhJk6uro5bnxTSJqPrdRdI5+anwOijH53+x5dISO3KWA== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/radio" "^3.8.0" - "@react-types/radio" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/radio@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-aria/radio/-/radio-3.8.0.tgz#20800ef83d072362903382e344ad0ae74a408548" - integrity sha512-KvE7UeSDVgdOVLNt/RzTCroMRbVcnn6QZHp0fde9HjQV14Umebyu/fWAmfvIMe/th1Lelf6NtliGXOAZpfOLrg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/radio" "^3.9.0" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/searchfield@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.5.1.tgz#cfb9ba1a6414b6a590e338a1b40c02044f3699c8" - integrity sha512-gJQWgBIycxZXdmluHWUdCGN5gSArLJnDnuri3el8ECURZM7C+zxDeHd6A8xlKPNF+m5X0HcarrDAnEdXNjKKlQ== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/textfield" "^3.9.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/searchfield" "^3.4.1" - "@react-types/button" "^3.7.2" - "@react-types/searchfield" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/searchfield@^3.5.5": - version "3.5.5" - resolved "https://registry.npmmirror.com/@react-aria/searchfield/-/searchfield-3.5.5.tgz#53780d51031dfc85cb5dc719d04fcc4424b48327" - integrity sha512-/CL4H5X8kqk3237CZ0RSnnR6KMeI6xzdr0lqwL1m9d2NkTBcTgm/0xa8JRxVi/4aKWSvApbcPv/8iF05FA1sAQ== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/textfield" "^3.12.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/searchfield" "^3.4.5" - "@react-types/button" "^3.8.0" - "@react-types/searchfield" "^3.5.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/select@^3.10.0": - version "3.10.0" - resolved "https://registry.npmjs.org/@react-aria/select/-/select-3.10.0.tgz#51c1741a91bfacf5e7c8a5abe35b6d9f9da7368c" - integrity sha512-Adn/uQdGj0BUTe/gqvhtyEdkUQ0j0oZPrhxo6MIwXiX3vyu/GJJBgeSe67Z848iZvYzVk3iheFS88qvwmJ0Qbg== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/listbox" "^3.9.0" - "@react-aria/menu" "^3.9.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-aria/visually-hidden" "^3.8.0" - "@react-stately/select" "^3.5.0" - "@react-types/button" "^3.7.2" - "@react-types/select" "^3.8.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/select@^3.12.1": - version "3.12.1" - resolved "https://registry.npmmirror.com/@react-aria/select/-/select-3.12.1.tgz#d1032645bf05d00600b414969c12369173a0b3d7" - integrity sha512-RBEbay8RGUuwxoKLKtWmL/3MU8Wk2xmofg9PdYGAcgkq88Ucyt+ejKNnRLTm/dOLgwgUcreHhEDEe5QrYQQqbg== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/listbox" "^3.10.2" - "@react-aria/menu" "^3.10.2" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/select" "^3.5.4" - "@react-types/button" "^3.8.0" - "@react-types/select" "^3.8.3" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/selection@^3.14.0": - version "3.14.0" - resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.14.0.tgz#33520cee7d3f67da0f1c718694c8f557f03a487f" - integrity sha512-4/cq3mP75/qbhz2OkWmrfL6MJ+7+KfFsT6wvVNvxgOWR0n4jivHToKi3DXo2TzInvNU+10Ha7FCWavZoUNgSlA== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/selection" "^3.13.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/selection@^3.16.2": - version "3.16.2" - resolved "https://registry.npmmirror.com/@react-aria/selection/-/selection-3.16.2.tgz#f6dfdbb0e071268111e5dcbd397321802bed00c9" - integrity sha512-C6zS5F1W38pukaMTFDTKbMrEvKkGikrXF94CtyxG1EI6EuZaQg1olaEeMCc3AyIb+4Xq+XCwjZuuSnS03qdVGQ== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/separator@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.1.tgz#2018c643adc7e2ae42702adf653a5b0aa1e709e4" - integrity sha512-BNiJpkzHDnNBeZFGud9MSLzUkYevq7WT0+XO60SMvD/OhDBoBPp26b6fK1W81HKTbs+bk/dvmlnnbx9ViGsLzw== - dependencies: - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/separator@^3.3.5": - version "3.3.5" - resolved "https://registry.npmmirror.com/@react-aria/separator/-/separator-3.3.5.tgz#b6e1ad8f5797a53717a147d7cdfcc5d0930ac200" - integrity sha512-gW/WgQy9LPTqZtN/DlmC1qcA1liCO1hdS9SBvnYbA6MymKUOyqz6Ui6oSkN+LlAHcZBtnepTeDoClGMWAQmL5g== - dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/slider@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.4.0.tgz#f5615861cc77dc240f2d3d7776f07badac364dcf" - integrity sha512-fW3gQhafs8ACAN7HGBpzmGV+hHVMUxI4UZ/V3h/LJ1vIxZY857iSQolzfJFBYhCyV0YU4D4uDUcYZhoH18GZnQ== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/radio" "^3.8.0" - "@react-stately/slider" "^3.3.1" - "@react-types/radio" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@react-types/slider" "^3.5.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/slider@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-aria/slider/-/slider-3.7.0.tgz#c7fafc7b824e17c558242e2058f79e2bda0fbb10" - integrity sha512-aQ3d89M3scWIBJjpjQ0OxeNGuklxX9gxeAhSvYkhsyFd37DCBNNtHIiLfPzQpsSJOjSJofBsEzrG4y+JHGcrdg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/radio" "^3.9.0" - "@react-stately/slider" "^3.4.2" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@react-types/slider" "^3.6.1" +"@react-aria/checkbox@^3.13.0": + version "3.13.0" + resolved "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.13.0.tgz#05d6f94204b56ed73119a9eeb825343f183b4fd5" + integrity sha512-eylJwtADIPKJ1Y5rITNJm/8JD8sXG2nhiZBIg1ko44Szxrpu+Le53NoGtg8nlrfh9vbUrXVvuFtf2jxbPXR5Jw== + dependencies: + "@react-aria/form" "^3.0.1" + "@react-aria/label" "^3.7.4" + "@react-aria/toggle" "^3.10.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/checkbox" "^3.6.1" + "@react-stately/form" "^3.0.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/spinbutton@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.4.0.tgz#a500f5eb42e459f2a2789728832446f61c365313" - integrity sha512-8JEHw3pnosEYOQSZol0QpXMRhdb3z4FtaSovUdCPo7x7A7BtGCVsy3lAt31+WvQAknzZIDwxSBaNAcOj0cYhWQ== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/utils" "^3.16.0" - "@react-types/button" "^3.7.2" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/spinbutton@^3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@react-aria/spinbutton/-/spinbutton-3.5.2.tgz#e887174b8fcf2d5801c5ce5281ccbf1453ce0d81" - integrity sha512-qD1yjCE7dMdiyFMV7DPz/+qn7lLdU2BqMx/aT4eN2RMcrjSw5AIc1IYsfwQGg9XkQw7FWSRxDud+EuuGSzMB2w== +"@react-aria/combobox@^3.8.1": + version "3.8.1" + resolved "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.8.1.tgz#ed4fac6cbab4ceed9b5952843fd96db942d8b4dc" + integrity sha512-0Zsy91WC2uhnIjtProL1E5qRjBtRVdsNgpr8T9QCQht4i2sHd8L/srrOx7b6vRIngUMZq7GofOpQcKVdxx4kEA== dependencies: - "@react-aria/i18n" "^3.8.2" + "@react-aria/i18n" "^3.10.0" + "@react-aria/listbox" "^3.11.3" "@react-aria/live-announcer" "^3.3.1" - "@react-aria/utils" "^3.20.0" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" + "@react-aria/menu" "^3.12.0" + "@react-aria/overlays" "^3.20.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/combobox" "^3.8.1" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/combobox" "^3.10.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/ssr@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz#e5d52bd1686ff229f68f806cf94ee29dd9f54fb7" - integrity sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-aria/ssr@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-aria/ssr/-/ssr-3.8.0.tgz#e7f467ac42f72504682724304ce221f785d70d49" - integrity sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A== - dependencies: +"@react-aria/datepicker@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.9.1.tgz#3f4a494a90b27b300668d687531ee20f6665bd12" + integrity sha512-bdlY2H/zwe3hQf64Lp1oGTf7Va8ennDyAv4Ffowb+BOoL8+FB9smtGyONKe87zXu7VJL2M5xYAi4n7c004PM+w== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/number" "^3.5.0" + "@internationalized/string" "^3.2.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/spinbutton" "^3.6.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/datepicker" "^3.9.1" + "@react-stately/form" "^3.0.0" + "@react-types/button" "^3.9.1" + "@react-types/calendar" "^3.4.3" + "@react-types/datepicker" "^3.7.1" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/switch@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.5.0.tgz#a83fb396a113d6ce918c2cb723e565039775a7bf" - integrity sha512-nMrwT0McuQ7ki6rSDFIuf9qa9UjcA1XJQ9zDRD2CC10F48xpHHi12iZpS8GAEdG2jTNdCZ3qSO1HsIt63uEQoQ== - dependencies: - "@react-aria/toggle" "^3.6.0" - "@react-stately/toggle" "^3.5.1" - "@react-types/switch" "^3.3.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/switch@^3.5.4": - version "3.5.4" - resolved "https://registry.npmmirror.com/@react-aria/switch/-/switch-3.5.4.tgz#edcd70bd19d54b3021e645a39fc5255ac5bf70e8" - integrity sha512-u5nkxLuToz7qsRoH8qiZSe4rdKJ7LJK5AoEVQzlqlw2oLTcaitRpnYYNfGJuMasAAnmdIx6SJ60gb3vly+5SMQ== +"@react-aria/dialog@^3.5.9": + version "3.5.9" + resolved "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.9.tgz#d1b6d2c8c33cda0a65adbc5ede1fb4b9590a5238" + integrity sha512-Eg5pFJN3b5NitKL60nf30iPpQGCyOcU4YakUVn5+GWKLBlm8ryE8jyoIIO0e0LCM65K+fL+gGHGK01GCZyKrpQ== dependencies: - "@react-aria/toggle" "^3.8.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/switch" "^3.4.1" + "@react-aria/focus" "^3.16.0" + "@react-aria/overlays" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-types/dialog" "^3.5.7" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/table@^3.12.0": - version "3.12.0" - resolved "https://registry.npmmirror.com/@react-aria/table/-/table-3.12.0.tgz#3b95778231fa502080d7523bbb0b00e5085ff6c7" - integrity sha512-Pso4AaeIdBRMguq/ijYnNzEqFhMcV/TxxpfR/9V3wRVfTzl1Z1wA99T3QBxoaT5ZjR8JIBYtzF1ErNZ0c1vsAw== +"@react-aria/dnd@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@react-aria/dnd/-/dnd-3.5.1.tgz#4fecbfbad38f42ddd0c12a88ca11d90548f112d0" + integrity sha512-7OPGePdle+xNYHAIAUOvIETRMfnkRt7h/C0bCkxUR2GYefEbTzfraso4ppNH2JZ7fCRd0K/Qe+jvQklwusHAKA== dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/grid" "^3.8.2" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" + "@internationalized/string" "^3.2.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" "@react-aria/live-announcer" "^3.3.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-stately/collections" "^3.10.1" - "@react-stately/flags" "^3.0.0" - "@react-stately/table" "^3.11.1" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/table@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.9.0.tgz#d626649702567b7b519bb712bd1b76022845e476" - integrity sha512-hY1tM7NRjP+gRvm2OGgWeEZ8An0tzljj0O19JCg7oi6IpypFJqeSqSUQml1OIv5wbZ04pQnoYGtMkP7h7YqkPw== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/grid" "^3.7.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/live-announcer" "^3.3.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-aria/visually-hidden" "^3.8.0" - "@react-stately/collections" "^3.7.0" - "@react-stately/table" "^3.9.0" - "@react-stately/virtualizer" "^3.5.1" - "@react-types/checkbox" "^3.4.3" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@react-types/table" "^3.6.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/tabs@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.5.0.tgz#fb2c110002f9a00bb82aed7ca8f006b4f7d8b710" - integrity sha512-QnCoNHDmeRoPWLHsr1Q81RN/KymwU79XS/zHguhZ3fx59je9bswUDG77NjylcPRXoOEOZ18gZ+Y7reBVRhNEog== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/list" "^3.8.0" - "@react-stately/tabs" "^3.4.0" - "@react-types/shared" "^3.18.0" - "@react-types/tabs" "^3.2.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/tabs@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-aria/tabs/-/tabs-3.7.0.tgz#db86f229a8e6f8430b6c74986ad57956111f174c" - integrity sha512-st0fdbnTizYu+gvJ+UAbhKdEdUA2rPodFl7Knxo8FidM1lOgf6B6gQowUyvLAcLpxVRpJmhbePVU+uzJTZajog== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-stately/tabs" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@react-types/tabs" "^3.3.2" - "@swc/helpers" "^0.5.0" - -"@react-aria/tag@^3.1.2": - version "3.1.2" - resolved "https://registry.npmmirror.com/@react-aria/tag/-/tag-3.1.2.tgz#cd5a2c3b7372d6ba3bb12b13419201650bd2e6e4" - integrity sha512-tsgl7K/+AkZKa89mWZVqTxgrEQLeCuV6aOric3X4CH9Gh5PgSrQIb5Nslx9+OT5b/PwesFkqa422TOPki5bQLQ== - dependencies: - "@react-aria/gridlist" "^3.6.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/selection" "^3.16.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/list" "^3.9.2" - "@react-types/button" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/textfield@^3.12.0": - version "3.12.0" - resolved "https://registry.npmmirror.com/@react-aria/textfield/-/textfield-3.12.0.tgz#16b477b9eb57f006609872a2df7cdeefce4ae9b3" - integrity sha512-okvCR7vPrSx/0AW+YxPWo3ucJkgRuX77QWVeYBXhQiBKooHEYSfaceMgMZc/KS5HGZsY8bEKpGOIVkZBitzQsg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/label" "^3.7.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/textfield@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.9.1.tgz#e032b0a5f2006891de7ff3465dc76381990341fc" - integrity sha512-IxJ6QupBD8yiEwF1etj4BWfwjNpc3Y00j+pzRIuo07bbkEOPl0jtKxW5YHG9un6nC9a5CKIHcILato1Q0Tsy0g== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/label" "^3.5.1" - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@react-types/textfield" "^3.7.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/toggle@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.6.0.tgz#c80b5743b58ab11daf3f46a2142fd87e898b3a2a" - integrity sha512-W6xncx5zzqCaPU2XsgjWnACHL3WBpxphYLvF5XlICRg0nZVjGPIWPDDUGyDoPsSUeGMW2vxtFY6erKXtcy4Kgw== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/toggle" "^3.5.1" - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" - "@react-types/switch" "^3.3.1" - "@swc/helpers" "^0.4.14" - -"@react-aria/toggle@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-aria/toggle/-/toggle-3.8.0.tgz#15449d06d7a90fbabab12926297648918d95adb6" - integrity sha512-HQgx8rBEwGsVyJKU47GTZcWWn3Kv0DgZfUY/lXkdhMFf14/NWTRpJEuKRfEut+/wVFbcNcv9WDT7fEe7yTvGWg== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/toggle" "^3.6.2" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@react-types/switch" "^3.4.1" - "@swc/helpers" "^0.5.0" - -"@react-aria/tooltip@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.5.0.tgz#0581c4647f1ddf71baca893ecb2dda3d7aceaffb" - integrity sha512-zjKJDUMVbkzRpSHLGYpK12NpWy2NPfqS7MlGPB8fjjdY4bQjVOGlGWPqcfnE28gdNRYWZuMBwJSC0NrT8iylUg== - dependencies: - "@react-aria/focus" "^3.12.0" - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/tooltip" "^3.4.0" - "@react-types/shared" "^3.18.0" - "@react-types/tooltip" "^3.4.0" - "@swc/helpers" "^0.4.14" - -"@react-aria/tooltip@^3.6.2": - version "3.6.2" - resolved "https://registry.npmmirror.com/@react-aria/tooltip/-/tooltip-3.6.2.tgz#6f446effe6c8d206485824417ab40522fbb7cffe" - integrity sha512-y8dAxRrL4lPmYrg+UoKbHymeIuOxBq994XXWbHw2dlM4ZnBfXAaFWYuV9Pfp+JXk9Oi1atJYc3O70Z9TmgXGVw== - dependencies: - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/tooltip" "^3.4.4" - "@react-types/shared" "^3.20.0" - "@react-types/tooltip" "^3.4.4" + "@react-aria/overlays" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/dnd" "^3.2.7" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-aria/utils@^3.16.0": +"@react-aria/focus@^3.16.0": version "3.16.0" - resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.16.0.tgz#0394f575e47b1c48a15844dc58e1775a9f72f8f5" - integrity sha512-BumpgENDlXuoRPQm1OfVUYRcxY9vwuXw1AmUpwF61v55gAZT3LvJWsfF8jgfQNzLJr5jtr7xvUx7pXuEyFpJMA== - dependencies: - "@react-aria/ssr" "^3.6.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" - -"@react-aria/utils@^3.20.0": - version "3.20.0" - resolved "https://registry.npmmirror.com/@react-aria/utils/-/utils-3.20.0.tgz#46a03b36b790b9acc3338390023daa5f4aa987fc" - integrity sha512-TpvP9fw2/F0E+D05+S1og88dwvmVSLVB4lurVAodN1E6rCZyw+M/SHlCez0I7j1q9ZWAnVjRuHpBIRG5heX1Ug== - dependencies: - "@react-aria/ssr" "^3.8.0" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-aria/visually-hidden@^3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.0.tgz#9bdcf708e4e628041d8fbac66c7dcb98b9529da9" - integrity sha512-Ox7VcO8vfdA1rCHPcUuP9DWfCI9bNFVlvN/u66AfjwBLH40MnGGdob5hZswQnbxOY4e0kwkMQDmZwNPYzBQgsg== - dependencies: - "@react-aria/interactions" "^3.15.0" - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - clsx "^1.1.1" - -"@react-aria/visually-hidden@^3.8.4": - version "3.8.4" - resolved "https://registry.npmmirror.com/@react-aria/visually-hidden/-/visually-hidden-3.8.4.tgz#7812ec32d5a317019acb2639b5e47d3de2886a4c" - integrity sha512-TRDtrndL/TiXjVac7o1vEmrHltSPugH0B6uqc1KRCSspFa1vg9tsgh9/N+qCXrEHynfNyK9FPjI70pAH+PXcqw== + resolved "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.0.tgz#521677a452de254bd48d3a469d6411d69188593d" + integrity sha512-GP6EYI07E8NKQQcXHjpIocEU0vh0oi0Vcsd+/71fKS0NnTR0TUOEeil0JuuQ9ymkmPDTu51Aaaa4FxVsuN/23A== dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" - clsx "^1.1.1" - -"@react-stately/calendar@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.2.0.tgz#ecfd9469e4c26ec9e372658409b37e9cce52ac5e" - integrity sha512-A13QSmlzLI5rtpIu2QIkij4ST29MWkCJd1kM6WFDS/1if8lSzfPL3kI4tdFDaFzFCwmv2Hb2cIfv9soIG8KASQ== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-stately/utils" "^3.6.0" - "@react-types/calendar" "^3.2.0" - "@react-types/datepicker" "^3.3.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" + clsx "^2.0.0" -"@react-stately/calendar@^3.4.0": - version "3.4.0" - resolved "https://registry.npmmirror.com/@react-stately/calendar/-/calendar-3.4.0.tgz#ddcb9e6729249247533413dba1698502f74052e2" - integrity sha512-MUGJ0fvUV999r+zCkK00YXkHojpL5dSCPiuYdrv/GeXxqksr2no780JmKkUcp4OUG8gnmgo37LRc8xJ0TX3Hug== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-stately/utils" "^3.7.0" - "@react-types/calendar" "^3.4.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/checkbox@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.4.1.tgz#3b0930ce773d64c465a8ddfdb0d461d4ea8a79b5" - integrity sha512-Ju1EBuIE/JJbuhd8xMkgqf3KuSNpRrwXsgtI+Ur42F+lAedZH7vqy+5bZPo0Q3u0yHcNJzexZXOxHZNqq1ij8w== - dependencies: - "@react-stately/toggle" "^3.5.1" - "@react-stately/utils" "^3.6.0" - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/checkbox@^3.5.0": - version "3.5.0" - resolved "https://registry.npmmirror.com/@react-stately/checkbox/-/checkbox-3.5.0.tgz#a19ad2b7f676d4453ba07af3c6c2d046f1e39c03" - integrity sha512-DSSC5nXd9P07ddyDZ6FBwaMAypURCwCRhC8kli5MNRF8/KCDJxWOpWe6LDRXeDgA6EN7ExE1deb8gydIrYmUOw== - dependencies: - "@react-stately/toggle" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/collections@^3.10.1": - version "3.10.1" - resolved "https://registry.npmmirror.com/@react-stately/collections/-/collections-3.10.1.tgz#c936d2f97f5508ead5c22aa0d600cae410bf82ae" - integrity sha512-C9FPqoQUt7NeCmmP8uabQXapcExBOTA3PxlnUw+Nq3+eWH1gOi93XWXL26L8/3OQpkvAbUcyrTXhCybLk4uMAg== - dependencies: - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/collections@^3.7.0": - version "3.7.0" - resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.7.0.tgz#5f032ba5e8b554e90bf1a2077220d2560618dbf7" - integrity sha512-xZHJxjGXFe3LUbuNgR1yATBVSIQnm+ItLq2DJZo3JzTtRu3gEwLoRRoapPsBQnC5VsjcaimgoqvT05P0AlvCTQ== - dependencies: - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/combobox@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.5.0.tgz#f3ea28dd743d5d9bc8ebd17bfeab1fa3ea21f176" - integrity sha512-1klrkm1q1awoPUIXt0kKRrUu+rISLQkHRkStjLupXgGOnJUyYP0XWPYHCnRV+IR2K2RnWYiEY5kOi7TEp/F7Fw== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/list" "^3.8.0" - "@react-stately/menu" "^3.5.1" - "@react-stately/select" "^3.5.0" - "@react-stately/utils" "^3.6.0" - "@react-types/combobox" "^3.6.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/combobox@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-stately/combobox/-/combobox-3.7.0.tgz#251c6d52853df1f9059fdfe76c152b4d607eac03" - integrity sha512-tkPgv2cDS5wfkPVrA5Jffpi9kxUnsFuvk/T1VZXYt1ItAsxy7IGli+JwHYFgTqadDyF+yRNMj5QYRY0mnbIxrg== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-stately/menu" "^3.5.5" - "@react-stately/select" "^3.5.4" - "@react-stately/utils" "^3.7.0" - "@react-types/combobox" "^3.8.0" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/data@^3.10.2": - version "3.10.2" - resolved "https://registry.npmmirror.com/@react-stately/data/-/data-3.10.2.tgz#2d315a4b50ad1da437462a63c1af639a13416e56" - integrity sha512-myAGJHTFUy2zUtiOzUrDlu2Wp32lDlc8tg4E5w+lwQ/d4TTY1MX4TtUCW8LGc8tDm5Bv2/Le/I8Vu0T+vmesng== +"@react-aria/form@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@react-aria/form/-/form-3.0.1.tgz#2fdb28231cbee80684c9500e606da42e4ca65318" + integrity sha512-6586oODMDR4/ciGRwXjpvEAg7tWGSDrXE//waK0n5e5sMuzlPOo1DHc5SpPTvz0XdJsu6VDt2rHdVWVIC9LEyw== dependencies: - "@react-types/shared" "^3.20.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/data@^3.9.1": - version "3.9.1" - resolved "https://registry.npmjs.org/@react-stately/data/-/data-3.9.1.tgz#bfa817330f78b6308595c1ddab53cbdffab252f8" - integrity sha512-UClgI8jQTF3hVR/WLa2ht7Gjd2x2PRnYycDmfY+mfbd+ONBD7rX/m3KWGgrR8AvO05qSpQoSlab8D+cfLXvgWA== +"@react-aria/grid@^3.8.6": + version "3.8.6" + resolved "https://registry.npmjs.org/@react-aria/grid/-/grid-3.8.6.tgz#61ac7e8b460c962614cb807b0def9d404cda3ec5" + integrity sha512-JlQDkdm5heG1FfRyy5KnB8b6s/hRqSI6Xt2xN2AccLX5kcbfFr2/d5KVxyf6ahfa4Gfd46alN6477ju5eTWJew== dependencies: - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/datepicker@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.4.0.tgz#d531cf792edafa14733de17528b7b17df8e0a696" - integrity sha512-JiRQBQYDXOQDdJl5YUGob10aVYp2N/F5rSSkRt7MrBJhC87bkDW0ARfs83gnl398WOJ6d9rJp0f+CJa1mjtzUw== - dependencies: - "@internationalized/date" "^3.2.0" - "@internationalized/string" "^3.1.0" - "@react-stately/overlays" "^3.5.1" - "@react-stately/utils" "^3.6.0" - "@react-types/datepicker" "^3.3.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/datepicker@^3.7.0": - version "3.7.0" - resolved "https://registry.npmmirror.com/@react-stately/datepicker/-/datepicker-3.7.0.tgz#ac1093b6d9068a680f458012311f28b9e234bea4" - integrity sha512-yPEfgKVXmwLwn41H8KeLuwgAN5oVmmcQemyn6iKLCPaIsQjXGpbfB0diQhg/aTjnm0VtdqdCBYPhHZzPkCml/w== - dependencies: - "@internationalized/date" "^3.5.0" - "@internationalized/string" "^3.1.1" - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/datepicker" "^3.6.0" - "@react-types/shared" "^3.20.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/grid" "^3.8.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/virtualizer" "^3.6.6" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/dnd@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.0.tgz#a9d600ca5124c059a73dfdec6b2e6cbb2f04af86" - integrity sha512-e+f5lBiBBHmgqwcKKPxJBpCSx08iuNacNUFQ5/yIWm/enpjwTQhCMyfOFCLM1DfSllM/19GlqV/GiDRM7xjEAQ== - dependencies: - "@react-stately/selection" "^3.13.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/dnd@^3.2.4": - version "3.2.4" - resolved "https://registry.npmmirror.com/@react-stately/dnd/-/dnd-3.2.4.tgz#9f0fbf827ffd4789fd478af50b7f4d4ccbb6a067" - integrity sha512-ZPhcEcnCvEtRQzkDzNUJvZDzW2GUL0nr8++AYf4VhXPh7geFyGmYtvfoFTxESov3AMFhCLLDClxKejLTwrzzbw== - dependencies: - "@react-stately/selection" "^3.13.4" - "@react-types/shared" "^3.20.0" +"@react-aria/gridlist@^3.7.3": + version "3.7.3" + resolved "https://registry.npmjs.org/@react-aria/gridlist/-/gridlist-3.7.3.tgz#dac639f2e2d808316e9759026319a536c10a2acf" + integrity sha512-rkkepYM7xJiebR0g3uC4zzkdR7a8z0fLaM+sg9lSTbdElHMLAlrebS2ytEyZnhiu9nbOnw13GN1OC4/ZenzbHQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/grid" "^3.8.6" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/list" "^3.10.2" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/flags@^3.0.0": - version "3.0.0" - resolved "https://registry.npmmirror.com/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" - integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== - dependencies: - "@swc/helpers" "^0.4.14" - -"@react-stately/grid@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.6.0.tgz#210d09efc4df415cfcffb73b6c8cfa18f5bab0f4" - integrity sha512-Sq/ivfq9Kskghoe6rYh2PfhB9/jBGfoj8wUZ4bqHcalTrBjfUvkcWMSFosibYPNZFDkA7r00bbJPDJVf1VLhuw== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/selection" "^3.13.0" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/grid@^3.8.1": - version "3.8.1" - resolved "https://registry.npmmirror.com/@react-stately/grid/-/grid-3.8.1.tgz#8dcc44147c42a3fcbcfabbb83d7bccacda51000b" - integrity sha512-7eKPoES4eKD7JU9UXcRGVKZ/auaD5F/srVhkWjygKcJ2ibt48N0dh6JwPqPoxzqApUX0DuUjebL9hCRgagEvdQ== +"@react-aria/i18n@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.0.tgz#bc61c8d05a0193a4c4322ddaefb4ee382190169a" + integrity sha512-sviD5Y1pLPG49HHRmVjR+5nONrp0HK219+nu9Y7cDfUhXu2EjyhMS9t/n9/VZ69hHChZ2PnHYLEE2visu9CuCg== dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@swc/helpers" "^0.5.0" - -"@react-stately/layout@^3.12.0": - version "3.12.0" - resolved "https://registry.npmjs.org/@react-stately/layout/-/layout-3.12.0.tgz#ce93b4459a24024ae886692d7338e6b8a954b334" - integrity sha512-CsBGh1Xp3SL64g5xTxNYEWdnNmmqryOyrK4BW59pzpXFytVquv4MBb6t/YRl5PnhtsORxk5aTR21NZkhDQa7jA== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/table" "^3.9.0" - "@react-stately/virtualizer" "^3.5.1" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@react-types/table" "^3.6.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/layout@^3.13.1": - version "3.13.1" - resolved "https://registry.npmmirror.com/@react-stately/layout/-/layout-3.13.1.tgz#5e43cca85c9a77bb8db1919897213757f7ef9408" - integrity sha512-gJNK1bpnrWNHz/uhTg7OpVFuSyLdYwqNjXt2He+i66/lZ6TG36smsi9MYtTYdC72Js5rsA9ngWtfhNpQ9bMeCQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/table" "^3.11.1" - "@react-stately/virtualizer" "^3.6.2" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" + "@internationalized/date" "^3.5.1" + "@internationalized/message" "^3.1.1" + "@internationalized/number" "^3.5.0" + "@internationalized/string" "^3.2.0" + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/list@^3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.8.0.tgz#a5de6f3b125c8cb90b65188978bace4eabe9a9a5" - integrity sha512-eJ1iUFnXPZi5MGW2h/RdNTrKtq4HLoAlFAQbC4eSPlET6VDeFsX9NkKhE/A111ia24DnWCqJB5zH20EvNbOxxA== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/selection" "^3.13.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/list@^3.9.2": - version "3.9.2" - resolved "https://registry.npmmirror.com/@react-stately/list/-/list-3.9.2.tgz#ca4119bae68efd27c242dc7097fdf0b413414abb" - integrity sha512-1PBnQ3UFSeKe2Jk4kYZM/11uzQsNEs098tbEkqR3JJwYzJ4htjdd1I0P9Z2INFWiHw071OJD18Ynbbz90jMldw== +"@react-aria/interactions@^3.20.1": + version "3.20.1" + resolved "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.20.1.tgz#397f6724935024e7d3f4f38e8fae07ee37da868d" + integrity sha512-PLNBr87+SzRhe9PvvF9qvzYeP4ofTwfKSorwmO+hjr3qoczrSXf4LRQlb27wB6hF10C7ZE/XVbUI1lj4QQrZ/g== dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/menu@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.5.1.tgz#2cffe84d8c93920822fdd92bf716205460873db7" - integrity sha512-nnuZlDBFIc3gB34kofbKDStFg9r8rijY+7ez2VWQmss72I9D7+JTn7OXJxV0oQt2lBYmNfS5W6bC9uXk3Z4dLg== - dependencies: - "@react-stately/overlays" "^3.5.1" - "@react-stately/utils" "^3.6.0" - "@react-types/menu" "^3.9.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/menu@^3.5.5": - version "3.5.5" - resolved "https://registry.npmmirror.com/@react-stately/menu/-/menu-3.5.5.tgz#0c70431726a6f955537f26cc38f11206f2f97820" - integrity sha512-5IW26YURvwCs2a0n6PwlGOZ1K+M5xwfgR/q6mbQPfbZGZG6a14buHTHK8kISHAl2hHFcn0TV6yRYDmw2nxTM0A== +"@react-aria/label@^3.7.4": + version "3.7.4" + resolved "https://registry.npmjs.org/@react-aria/label/-/label-3.7.4.tgz#c7ba2c9d795b05da9f041eace9211d3c71b11c64" + integrity sha512-3Y0yyrqpLzZdzHw+TOyzwuyx5wa2ujU5DGfKuL5GFnU9Ii4DtdwBGSYS7Yu7qadU+eQmG4OGhAgFVswbIgIwJw== dependencies: - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/menu" "^3.9.4" - "@react-types/shared" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/numberfield@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.4.1.tgz#b4e1c7e49ad600dbd902b256e0a9b3e49a6f69b4" - integrity sha512-fpIyk3Wf9HN/fY/T2y4q9mA/9z4no8QMY4tEIn/tkumjU6QGzxCSRO0qb3RFE8sU0etsVAZOkPi+97DeQVLExw== - dependencies: - "@internationalized/number" "^3.2.0" - "@react-stately/utils" "^3.6.0" - "@react-types/numberfield" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/numberfield@^3.6.1": - version "3.6.1" - resolved "https://registry.npmmirror.com/@react-stately/numberfield/-/numberfield-3.6.1.tgz#5f34ff84408e48e4aa81d7c348f8add59749ffd6" - integrity sha512-vR2kvi0GSQhshh3jhlTRyZyVpvOpAGu1xo1sQM5vbgM8fzKLw3gZvnaPy+XvSkfxUk0MCYZxYtkOvf6QJV7p8w== +"@react-aria/link@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@react-aria/link/-/link-3.6.3.tgz#a9966a2a488014bbd39861329f1f6cdb99ceb78e" + integrity sha512-8kPWc4u/lDow3Ll0LDxeMgaxt9Y3sl8UldKLGli8tzRSltYFugNh/n+i9sCnmo4Qv9Tp9kYv+yxBK50Uk9sINw== dependencies: - "@internationalized/number" "^3.2.1" - "@react-stately/utils" "^3.7.0" - "@react-types/numberfield" "^3.6.0" - "@react-types/shared" "^3.20.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/overlays@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.5.1.tgz#7d876261fe288cfbc4cc56869481b7cd7a14e30f" - integrity sha512-lDKqqpdaIQdJb8DS4+tT7p0TLyCeaUaFpEtWZNjyv1/nguoqYtSeRwnyPR4p/YM4AW7SJspNiTJSLQxkTMIa8w== - dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/overlays" "^3.7.1" - "@swc/helpers" "^0.4.14" - -"@react-stately/overlays@^3.6.2": - version "3.6.2" - resolved "https://registry.npmmirror.com/@react-stately/overlays/-/overlays-3.6.2.tgz#478e4a9312f763242f4443b7fd1f90c49afcbaed" - integrity sha512-iIU/xtYEzG91abHFHqe8LL53ZrDDo8kblfdA7TTZwrtxZhQHU3AbT0pLc3BNe3sXmJspxuI1nS1cszcRlSuDww== - dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/overlays" "^3.8.2" +"@react-aria/listbox@^3.11.3": + version "3.11.3" + resolved "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.11.3.tgz#a24ff6f3c55206f2fe20ab13338af61add74682a" + integrity sha512-PBrnldmyEYUUJvfDeljW8ITvZyBTfGpLNf0b5kfBPK3TDgRH4niEH2vYEcaZvSqb0FrpdvcunuTRXcOpfb+gCQ== + dependencies: + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/list" "^3.10.2" + "@react-types/listbox" "^3.4.6" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/radio@^3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.8.0.tgz#0d67dc499b2bebf2411e5ac272bf98e4911f2d24" - integrity sha512-3xNocZ8jlS8JcQtlS+pGhGLmrTA/P6zWs7Xi3Cx/I6ialFVL7IE0W37Z0XTYrvpNhE9hmG4+j63ZqQDNj2nu6A== - dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/radio" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" - -"@react-stately/radio@^3.9.0": - version "3.9.0" - resolved "https://registry.npmmirror.com/@react-stately/radio/-/radio-3.9.0.tgz#b54b58f0eb73aeeeaeddfabaa8072d5f7f92594d" - integrity sha512-Q2vt5VjxLbsvbMWQmDqwm9JUJ3fkmUEzSBUOSYOkUcBchnzUunpaMe3nQjbJLekIWolubsVaE3bTxCKvY8hGZA== +"@react-aria/live-announcer@^3.3.1": + version "3.3.1" + resolved "https://registry.npmmirror.com/@react-aria/live-announcer/-/live-announcer-3.3.1.tgz#bf864b8820fb02daaeefc1c972782a0174fd60b9" + integrity sha512-hsc77U7S16trM86d+peqJCOCQ7/smO1cybgdpOuzXyiwcHQw8RQ4GrXrS37P4Ux/44E9nMZkOwATQRT2aK8+Ew== dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/radio" "^3.5.1" - "@react-types/shared" "^3.20.0" "@swc/helpers" "^0.5.0" -"@react-stately/searchfield@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.4.1.tgz#cb3109bb0803f79fa49e98acb7eae25cea22b783" - integrity sha512-iEMcT2hH15TSoONi6FyFa9mh+H/UyNneYFzaUgl7kEClfL38Dq/y0zF18N9T8PJ0GvXN2Yj9Fc0AvycNy3DQ8g== - dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/searchfield" "^3.4.1" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" +"@react-aria/menu@^3.12.0": + version "3.12.0" + resolved "https://registry.npmjs.org/@react-aria/menu/-/menu-3.12.0.tgz#3daf48b968d0942fdf7f97615898b7deb97f0777" + integrity sha512-Nsujv3b61WR0gybDKnBjAeyxDVJOfPLMggRUf9SQDfPWnrPXEsAFxaPaVcAkzlfI4HiQs1IxNwsKFNpc3PPZTQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/overlays" "^3.20.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/menu" "^3.6.0" + "@react-stately/tree" "^3.7.5" + "@react-types/button" "^3.9.1" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/searchfield@^3.4.5": - version "3.4.5" - resolved "https://registry.npmmirror.com/@react-stately/searchfield/-/searchfield-3.4.5.tgz#4c1890dbb6ea83bcc16c166a72dfbe9e3c74944c" - integrity sha512-0aQ7oeiqUgTzh3DcZDe2VdWdyERvxrZ27O1/GYvWj0uMJcqHmd1iA9oa3v725PmylmRvD6A42K2GqeF5c5Ue8g== +"@react-aria/meter@^3.4.9": + version "3.4.9" + resolved "https://registry.npmjs.org/@react-aria/meter/-/meter-3.4.9.tgz#bea1835f21e574465793a5145c5cc17212baf5be" + integrity sha512-1/FHFmFmSyfQBJ2oH152lp4nps76v1UdhnFbIsmRIH+0g0IfMv1yDT2M9dIZ/b9DgVZSx527FmWOXm0eHGKD6w== dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/searchfield" "^3.5.0" - "@react-types/shared" "^3.20.0" + "@react-aria/progress" "^3.4.9" + "@react-types/meter" "^3.3.6" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.5.0.tgz#7a443c9d4a3542a24ac9380db4ed328285de1ba3" - integrity sha512-65gCPkIcyhGBDlWKYQY+Xvx38r7dtZ/GMp09LFZqqZTYSe29EgY45Owv4+EQ2ZSoZxb3cEvG/sv+hLL0VSGjgQ== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/list" "^3.8.0" - "@react-stately/menu" "^3.5.1" - "@react-stately/selection" "^3.13.0" - "@react-stately/utils" "^3.6.0" - "@react-types/select" "^3.8.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" +"@react-aria/numberfield@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.10.1.tgz#2b6c9dbbb8c812293f1ce65186ab9940ee6bb9a2" + integrity sha512-9rt+O63UL3zKR99c+8njbtBeVoEhitzzSCFWsqbtStyoUEV5tJQDgD9kSlozFLAzYftq2pJ7uazlptMEXyS13g== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/spinbutton" "^3.6.1" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-stately/numberfield" "^3.8.0" + "@react-types/button" "^3.9.1" + "@react-types/numberfield" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/select@^3.5.4": - version "3.5.4" - resolved "https://registry.npmmirror.com/@react-stately/select/-/select-3.5.4.tgz#9bd2c82fe6b27e1c459514e4bef82b328081cb7b" - integrity sha512-CO+5ORMwx/nEKAf7285S3QRAWLJlD1TZPKosO5ND87SZt9j6LKTyJjsT5IYcny8W/ejFOKg5VP4evYNkd5ZtEQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/list" "^3.9.2" - "@react-stately/menu" "^3.5.5" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/select" "^3.8.3" - "@react-types/shared" "^3.20.0" +"@react-aria/overlays@^3.20.0": + version "3.20.0" + resolved "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.20.0.tgz#9d7e0529aa9e28f8055ef5d8486ce5aa0ede41dd" + integrity sha512-2m7MpRJL5UucbEuu08lMHsiFJoDowkJV4JAIFBZYK1NzVH0vF/A+w9HRNM7jRwx2DUxE+iIsZnl8yKV/7KY8OQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/ssr" "^3.9.1" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/overlays" "^3.6.4" + "@react-types/button" "^3.9.1" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/selection@^3.13.0": - version "3.13.0" - resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.13.0.tgz#a4efe8ebebd99cc38fa5cfe90c9038bbe155192a" - integrity sha512-F6FiB5GIS6wdmDDJtD2ofr+y6ysLHcvHVyUZHm00aEup2hcNjtNx3x4MlFIc3tO1LvxDSIIWXJhPXdB4sb32uw== +"@react-aria/progress@^3.4.9": + version "3.4.9" + resolved "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.9.tgz#266be752c9a6fb548480978839aac5b5045aa7bd" + integrity sha512-CME1ZLsJHOmSgK8IAPOC/+vYO5Oc614mkEw5MluT/yclw5rMyjAkK1XsHLjEXy81uwPeiRyoQQIMPKG2/sMxFQ== dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" + "@react-aria/i18n" "^3.10.0" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-types/progress" "^3.5.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/selection@^3.13.4": - version "3.13.4" - resolved "https://registry.npmmirror.com/@react-stately/selection/-/selection-3.13.4.tgz#88d30907d467e2994951ee362a61879cc0182283" - integrity sha512-agxSYVi70zSDSKuAXx4GdD8aG5RWFs1djcrLsQybtkFV2hUMrjipfvPfNYz56ITtz6qj5Dq2eXOZpSEAR6EfOg== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" +"@react-aria/radio@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/radio/-/radio-3.10.0.tgz#8c17fe18a499fc06303329e674e0f06b47ceb411" + integrity sha512-6NaKzdGymdcVWLYgHT0cHsVmNzPOp89o8r41w29OPBQWu8w2c9mxg4366OiIZn/uXIBS4abhQ4nL4toBRLgBrg== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/radio" "^3.10.1" + "@react-types/radio" "^3.7.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.3.1.tgz#4097840556259d1c89b166add3af44178d13d301" - integrity sha512-d38VY/jAvDzohYvqsdwsegcRCmzO1Ed4N3cdSGqYNTkr/nLTye/NZGpzt8kGbPUsc4UzOH7GoycqG6x6hFlyuw== - dependencies: - "@react-aria/i18n" "^3.7.1" - "@react-aria/utils" "^3.16.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@react-types/slider" "^3.5.0" - "@swc/helpers" "^0.4.14" +"@react-aria/searchfield@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-aria/searchfield/-/searchfield-3.7.0.tgz#8be2aa202aab1dc5c1c897be650d7ae4d0af601a" + integrity sha512-btBbkIwsExXWv5av62gINEbm4QFmDDT7r+d5TAKin5tvKqU8zrsM9fm7KCDEhIGcpUW+q2AUS589iw19z9uCcA== + dependencies: + "@react-aria/i18n" "^3.10.0" + "@react-aria/textfield" "^3.14.0" + "@react-aria/utils" "^3.23.0" + "@react-stately/searchfield" "^3.5.0" + "@react-types/button" "^3.9.1" + "@react-types/searchfield" "^3.5.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/slider@^3.4.2": - version "3.4.2" - resolved "https://registry.npmmirror.com/@react-stately/slider/-/slider-3.4.2.tgz#cd22aff0099d5748706f0bf593233a8496aaed8e" - integrity sha512-3Acil4Pu1aQnTGYUcGCeO7gO7C6LpmUCwjnjcRlJbYf1VibLWrMC+EGYKcha+2dsXYAvvsI4HD6Zuf5HmFkomA== - dependencies: - "@react-aria/i18n" "^3.8.2" - "@react-aria/utils" "^3.20.0" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@react-types/slider" "^3.6.1" +"@react-aria/select@^3.14.1": + version "3.14.1" + resolved "https://registry.npmjs.org/@react-aria/select/-/select-3.14.1.tgz#4d556098c44660427a891d538c12a30541c95401" + integrity sha512-pAy/+Xbj11Lx6bi/O1hWH0NSIDRxFb6V7N0ry2L8x7MALljh516VbpnAc5RgvbjbuKq0cHUAcdINOzOzpYWm4A== + dependencies: + "@react-aria/form" "^3.0.1" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/listbox" "^3.11.3" + "@react-aria/menu" "^3.12.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/select" "^3.6.1" + "@react-types/button" "^3.9.1" + "@react-types/select" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/selection@^3.17.3": + version "3.17.3" + resolved "https://registry.npmjs.org/@react-aria/selection/-/selection-3.17.3.tgz#ed4b3c51cc9abc72ad19d6beb536b194db1cbd7d" + integrity sha512-xl2sgeGH61ngQeE05WOWWPVpGRTPMjQEFmsAWEprArFi4Z7ihSZgpGX22l1w7uSmtXM/eN/v0W8hUYUju5iXlQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/selection" "^3.14.2" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.11.1": - version "3.11.1" - resolved "https://registry.npmmirror.com/@react-stately/table/-/table-3.11.1.tgz#e8bc36cb081d76dfa66caafdecab1b2d72c7a008" - integrity sha512-iI0IeEmg91bwR/2UX2PTB8k34MrfxlMVD/XlZ+6XWQGjXftdeB8QNKDAClWMZwQmYA7HTq6bLvP2CochJ68k5w== +"@react-aria/separator@^3.3.9": + version "3.3.9" + resolved "https://registry.npmjs.org/@react-aria/separator/-/separator-3.3.9.tgz#ee3e73841ddd705b772a93faec055de5420a6d4d" + integrity sha512-1wEXiaSJjq2+DR5TC0RKnUBsfZN+YXTzyI7XMzjQoc3YlclumX8wQtzPAOGOEjHB1JKUgo1Gw70FtupVXz58QQ== dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/flags" "^3.0.0" - "@react-stately/grid" "^3.8.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/table@^3.9.0": - version "3.9.0" - resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.9.0.tgz#8e8e60adec80f943d0f842b1629bfe84b0bef16b" - integrity sha512-Cl0jmC5eCEhWBAhCjhGklsgYluziNZHF34lHnc99T/DPP+OxwrgwS9rJKTW7L6UOvHU/ADKjEwkE/fZuqVBohg== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/grid" "^3.6.0" - "@react-stately/selection" "^3.13.0" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@react-types/table" "^3.6.0" - "@swc/helpers" "^0.4.14" +"@react-aria/slider@^3.7.4": + version "3.7.4" + resolved "https://registry.npmjs.org/@react-aria/slider/-/slider-3.7.4.tgz#d6cabfdae842265ef75b4aea9990488a44dc95d8" + integrity sha512-OFJWeGSL2duVDFs/kcjlWsY6bqCVKZgM0aFn2QN4wmID+vfBvBnqGHAgWv3BCePTAPS3+GBjMN002TrftorjwQ== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/slider" "^3.5.0" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.4.0.tgz#7cd90cc65dae46d86a45bdbb1bb09102ad627556" - integrity sha512-GeU0cykAEsyTf2tWC7JZqqLrgxPT1WriCmu9QAswJ7Dev1PkPvwDy3CEhJ3QDklTlhiLXLZOooyHh37lZTjRdg== +"@react-aria/spinbutton@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-aria/spinbutton/-/spinbutton-3.6.1.tgz#f175bb90532bb419c826c05d2934d02c3091f01c" + integrity sha512-u5GuOP3k4Zis055iY0fZJNHU7dUNCoSfUq5LKwJ1iNaCqDcavdstAnAg+X1a7rhpp5zCnJmAMseo3Qmzi9P+Ew== dependencies: - "@react-stately/list" "^3.8.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@react-types/tabs" "^3.2.1" - "@swc/helpers" "^0.4.14" + "@react-aria/i18n" "^3.10.0" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.23.0" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/tabs@^3.6.0": - version "3.6.0" - resolved "https://registry.npmmirror.com/@react-stately/tabs/-/tabs-3.6.0.tgz#bd2cf9028a5f3f6a40fa6746b652ccd234e01ecd" - integrity sha512-JKEIh+4nn6Tgs434x0xoaXqaINWlUuqtQXAdoVmaL6tNY97K8zWcN08ACAbB66Os7E59FVMJczEpbUz/xja2Hg== +"@react-aria/ssr@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz#a1252fd5ef87eada810dd9dd6751a5e21359d1d2" + integrity sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg== dependencies: - "@react-stately/list" "^3.9.2" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" - "@react-types/tabs" "^3.3.2" "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.5.1.tgz#9e8a2c55f8e18c5904c07f724cf7c056fd55660c" - integrity sha512-PF4ZaATpXWu7DkneGSZ2/PA6LJ1MrhKNiaENTZlbojXMRr5kK33wPzaDW7I8O25IUm0+rvQicv7A6QkEOxgOPg== +"@react-aria/switch@^3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@react-aria/switch/-/switch-3.6.0.tgz#ebf42690b0fdb97055811190bb0c3145a653a3c5" + integrity sha512-YNWc5fGLNXE4XlmDAKyqAdllRiClGR7ki4KGFY7nL+xR5jxzjCGU3S3ToMK5Op3QSMGZLxY/aYmC4O+MvcoADQ== dependencies: - "@react-stately/utils" "^3.6.0" - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" + "@react-aria/toggle" "^3.10.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/switch" "^3.5.0" + "@swc/helpers" "^0.5.0" -"@react-stately/toggle@^3.6.2": - version "3.6.2" - resolved "https://registry.npmmirror.com/@react-stately/toggle/-/toggle-3.6.2.tgz#6f6e6c3010e45210cd18c147541876857930f570" - integrity sha512-O+0XtIjRX9YgAwNRhSdX2qi49PzY4eGL+F326jJfqc17HU3Qm6+nfqnODuxynpk1gw79sZr7AtROSXACTVueMQ== +"@react-aria/table@^3.13.3": + version "3.13.3" + resolved "https://registry.npmjs.org/@react-aria/table/-/table-3.13.3.tgz#84e01d8329ea201004b90f362a2cd9ffb97d5167" + integrity sha512-AzmETpyxwNqISTzwHJPs85x9gujG40IIsSOBUdp49oKhB85RbPLvMwhadp4wCVAoHw3erOC/TJxHtVc7o2K1LA== dependencies: - "@react-stately/utils" "^3.7.0" - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/grid" "^3.8.6" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/live-announcer" "^3.3.1" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-stately/collections" "^3.10.4" + "@react-stately/flags" "^3.0.0" + "@react-stately/table" "^3.11.4" + "@react-stately/virtualizer" "^3.6.6" + "@react-types/checkbox" "^3.6.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.0.tgz#9d5118e71083b8a419a5d49bc993c7fa376c2365" - integrity sha512-TQyDIcugRah4eGmbK6UsyrtJrKJKte+xKv8X7kgdiGVMWiENiMG5h+3pGa8OT07FJzg7FvQHkMH+hrIuAqXT2g== - dependencies: - "@react-stately/overlays" "^3.5.1" - "@react-stately/utils" "^3.6.0" - "@react-types/tooltip" "^3.4.0" - "@swc/helpers" "^0.4.14" +"@react-aria/tabs@^3.8.3": + version "3.8.3" + resolved "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.8.3.tgz#53f481404d4798bd5e60893f0ee80c9467ad6cfa" + integrity sha512-Plw0K/5Qv35vYq7pHZFfQB2BF5OClFx4Abzo9hLVx4oMy3qb7i5lxmLBVbt81yPX/MdjYeP4zO1EHGBl4zMRhA== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/tabs" "^3.6.3" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" -"@react-stately/tooltip@^3.4.4": - version "3.4.4" - resolved "https://registry.npmmirror.com/@react-stately/tooltip/-/tooltip-3.4.4.tgz#a93c5a7b05a6e04765a61d51971ae49c9e4e16ea" - integrity sha512-Tb69T2uRep/9AF0+WR7j3kp4hZzRpp5N9r52j3zKsbHQ/qirAAQUJZegg5VgSfL2ncI7n2VijbBo8DfuJTbm8g== - dependencies: - "@react-stately/overlays" "^3.6.2" - "@react-stately/utils" "^3.7.0" - "@react-types/tooltip" "^3.4.4" +"@react-aria/tag@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@react-aria/tag/-/tag-3.3.1.tgz#9236d1c6492c64124fec8b2f3a632a9c33bf5400" + integrity sha512-w7d8sVZqxTo8VFfeg2ixLp5kawtrcguGznVY4mt5aE6K8LMJOeNVDqNNfolfyia80VjOWjeX+RpVdVJRdrv/GQ== + dependencies: + "@react-aria/gridlist" "^3.7.3" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/selection" "^3.17.3" + "@react-aria/utils" "^3.23.0" + "@react-stately/list" "^3.10.2" + "@react-types/button" "^3.9.1" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.6.0.tgz#bdcb645ca2e566d0a7e3dc1cdde13b491f34dfc1" - integrity sha512-9ekYGaebgMmd2p6PGRzsvr8KsDsDnrJF2uLV1GMq9hBaMxOLN5/dpxgfZGdHWoF3MXgeHeLloqrleMNfO6g64Q== - dependencies: - "@react-stately/collections" "^3.7.0" - "@react-stately/selection" "^3.13.0" - "@react-stately/utils" "^3.6.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" +"@react-aria/textfield@^3.14.0": + version "3.14.0" + resolved "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.14.0.tgz#bac949e4846aa194106139c9a8be94d62a125643" + integrity sha512-LtHFcPK/N9m3KWSRM5KdmlIk7cUEk0OF+uBUrfKsGGc1bJKVToimdW7jQusChHmHhslHUR7WQ4KDjXyFjoLXOw== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/form" "^3.0.1" + "@react-aria/label" "^3.7.4" + "@react-aria/utils" "^3.23.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" + "@swc/helpers" "^0.5.0" -"@react-stately/tree@^3.7.2": - version "3.7.2" - resolved "https://registry.npmmirror.com/@react-stately/tree/-/tree-3.7.2.tgz#a0f13c76cb5d02ef29f4da0665ebaca7c821c372" - integrity sha512-Re18E7Tfu01xjZXEDZlFwibAomD7PHGZ9cFNTkRysA208uhKVrVVfh+8vvar4c9ybTGUWk5tT6zz+hslGBuLVQ== - dependencies: - "@react-stately/collections" "^3.10.1" - "@react-stately/selection" "^3.13.4" - "@react-stately/utils" "^3.7.0" - "@react-types/shared" "^3.20.0" +"@react-aria/toggle@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.0.tgz#4869ef2858938e05aadd4c41b1db115aca349fda" + integrity sha512-6cUf4V9TuG2J7AvXUdU/GspEPFCubUOID3mrselSe563RViy+mMZk0vUEOdyoNanDcEXl58W4dE3SGWxFn71vg== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/toggle" "^3.7.0" + "@react-types/checkbox" "^3.6.0" "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.6.0.tgz#f273e7fcb348254347d2e88c8f0c45571060c207" - integrity sha512-rptF7iUWDrquaYvBAS4QQhOBQyLBncDeHF03WnHXAxnuPJXNcr9cXJtjJPGCs036ZB8Q2hc9BGG5wNyMkF5v+Q== +"@react-aria/toolbar@3.0.0-beta.1": + version "3.0.0-beta.1" + resolved "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.1.tgz#7331c8a06b89d9f293ebf4cbec418aeeffb680d5" + integrity sha512-GTQ76i0N8/BzWRJ/95RpOFGmbtv0lV3T2zd7CUis6xmP1zJCpSycs1V2jAUs6ggkVDedHLU2d0AOMkXorZLiUg== dependencies: - "@swc/helpers" "^0.4.14" + "@react-aria/focus" "^3.16.0" + "@react-aria/i18n" "^3.10.0" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-stately/utils@^3.7.0": +"@react-aria/tooltip@^3.7.0": version "3.7.0" - resolved "https://registry.npmmirror.com/@react-stately/utils/-/utils-3.7.0.tgz#ea99c2c4b5fba7e5079434a1de1ef53fbb21f6a8" - integrity sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ== - dependencies: + resolved "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.7.0.tgz#70f0f951caabb04d33adf8785c1a716cb0e01c48" + integrity sha512-+u9Sftkfe09IDyPEnbbreFKS50vh9X/WTa7n1u2y3PenI9VreLpUR6czyzda4BlvQ95e9jQz1cVxUjxTNaZmBw== + dependencies: + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/tooltip" "^3.4.6" + "@react-types/shared" "^3.22.0" + "@react-types/tooltip" "^3.4.6" "@swc/helpers" "^0.5.0" -"@react-stately/virtualizer@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.5.1.tgz#176516da9b97f2a78159655d95412e98f1226c82" - integrity sha512-TVszEl8+os5eAwoETAJ0ndz5cnYFQs52OIcWonKRYbNp5KvWAV+OA2HuIrB3SSC29ZRB2bDqpj4S2LY4wWJPCw== +"@react-aria/utils@^3.23.0": + version "3.23.0" + resolved "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.0.tgz#15548db55fcb7da1920e21735467157328f0223f" + integrity sha512-fJA63/VU4iQNT8WUvrmll3kvToqMurD69CcgVmbQ56V7ZbvlzFi44E7BpnoaofScYLLtFWRjVdaHsohT6O/big== dependencies: - "@react-aria/utils" "^3.16.0" - "@react-types/shared" "^3.18.0" - "@swc/helpers" "^0.4.14" + "@react-aria/ssr" "^3.9.1" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" -"@react-stately/virtualizer@^3.6.2": - version "3.6.2" - resolved "https://registry.npmmirror.com/@react-stately/virtualizer/-/virtualizer-3.6.2.tgz#e07ba0ab00f6a98ffa6cd00c75b729466f3b7add" - integrity sha512-BM7h7AlJNEB/X6XlMLlUoqye4SCGFmHiOIwEtha3QfJA52O1/0lgzD9yj5cLbdQPwZNmFH4R95b/OHqSIpgEBw== +"@react-aria/visually-hidden@^3.8.8": + version "3.8.8" + resolved "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.8.tgz#0f2a70ca21974154383080cf486caff5e7f2240f" + integrity sha512-Cn2PYKD4ijGDtF0+dvsh8qa4y7KTNAlkTG6h20r8Q+6UTyRNmtE2/26QEaApRF8CBiNy9/BZC/ZC4FK2OjvCoA== dependencies: - "@react-aria/utils" "^3.20.0" - "@react-types/shared" "^3.20.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" "@swc/helpers" "^0.5.0" -"@react-types/breadcrumbs@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.5.1.tgz#9dfc1542d94512261f7c96946fdc82e40f4101fc" - integrity sha512-+l9134cLOrLpxfzrCzEZiVpH7rfhFm8/+xklpbbpz4RguAHmP5bvi9TMRqK0mC9LAdm2GhG7i23YED8Gcv5EVQ== +"@react-stately/calendar@^3.4.3": + version "3.4.3" + resolved "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.4.3.tgz#3fa1f7abc8b5c5362949b54031435f9acf3cb9a0" + integrity sha512-OrEcdskszDjnjVnFuSiDC2PVBJ6lWMCJROD5s6W1LUehUtBp8LX9wPavAGHV43LbhN9ldj560sxaQ4WCddrRCA== dependencies: - "@react-types/link" "^3.4.1" - "@react-types/shared" "^3.18.0" + "@internationalized/date" "^3.5.1" + "@react-stately/utils" "^3.9.0" + "@react-types/calendar" "^3.4.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/breadcrumbs@^3.6.2": - version "3.6.2" - resolved "https://registry.npmmirror.com/@react-types/breadcrumbs/-/breadcrumbs-3.6.2.tgz#447932438ef6f2b9c0f1174f3dbd6132744e1492" - integrity sha512-CI4j7m15X3C7qznPZpXV8z6EyqCvIV2arfb+FH+Odu4AvcMCUrOKSolEtTl1tmv3uOTAwbd81jVxsUD6aJ6SCw== +"@react-stately/checkbox@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.6.1.tgz#2e213b2ca39f10410827d12f35bc7210727767f3" + integrity sha512-rOjFeVBy32edYwhKiHj3ZLdLeO+xZ2fnBwxnOBjcygnw4Neygm8FJH/dB1J0hdYYR349yby86ED2x0wRc84zPw== dependencies: - "@react-types/link" "^3.4.5" - "@react-types/shared" "^3.20.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/button@^3.7.2": - version "3.7.2" - resolved "https://registry.npmjs.org/@react-types/button/-/button-3.7.2.tgz#954566e9b576780bda0c018d7f5046a1d44f5677" - integrity sha512-P7L+r+k4yVrvsfEWx3wlzbb+G7c9XNWzxEBfy6WX9HnKb/J5bo4sP5Zi8/TFVaKTlaG60wmVhdr+8KWSjL0GuQ== +"@react-stately/collections@^3.10.4": + version "3.10.4" + resolved "https://registry.npmjs.org/@react-stately/collections/-/collections-3.10.4.tgz#aa81328a0996ba39ee39d469e65135812ebecef1" + integrity sha512-OHhCrItGt4zB2bSrgObRo0H2SC7QlkH8ReGxo+NVIWchXRLRoiWBP7S+IwleewEo5gOqDVPY3hqA9n4iiI8twg== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/button@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-types/button/-/button-3.8.0.tgz#e5ced04d718a9aaae6af175e7d2cb38552354cc9" - integrity sha512-hVVK5iWXhDYQZwxOBfN7nQDeFQ4Pp48uYclQbXWz8D74XnuGtiUziGR008ioLXRHf47dbIPLF1QHahsCOhh05g== - dependencies: - "@react-types/shared" "^3.20.0" +"@react-stately/combobox@^3.8.1": + version "3.8.1" + resolved "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.8.1.tgz#71adcd16df67a5889e58c9f5dfa1465087ea6163" + integrity sha512-FaWkqTXQdWg7ptaeU4iPcqF/kxbRg2ZNUcvW/hiL/enciV5tRCsddvfNqvDvy1L30z9AUwlp9MWqzm/DhBITCw== + dependencies: + "@react-stately/collections" "^3.10.4" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/overlays" "^3.6.4" + "@react-stately/select" "^3.6.1" + "@react-stately/utils" "^3.9.0" + "@react-types/combobox" "^3.10.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/calendar@^3.2.0": - version "3.2.0" - resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.2.0.tgz#7e5dae7cf7a2ec3795ece0b445a3d6c40a424e4e" - integrity sha512-MunGx/lQgf/Lf9v2MrWoqKTZhJJcyAhUno2MewytdMQNXwtY2FB1X4fUufMMrKHwhVnFVkGfEQJCh4FAm5P9JA== +"@react-stately/data@^3.11.0": + version "3.11.0" + resolved "https://registry.npmjs.org/@react-stately/data/-/data-3.11.0.tgz#d744d868ee810126aef4a0a827ab394e3059d33a" + integrity sha512-0BlPT58WrAtUvpiEfUuyvIsGFTzp/9vA5y+pk53kGJhOdc5tqBGHi9cg40pYE/i1vdHJGMpyHGRD9nkQb8wN3Q== dependencies: - "@internationalized/date" "^3.2.0" - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/calendar@^3.4.0": - version "3.4.0" - resolved "https://registry.npmmirror.com/@react-types/calendar/-/calendar-3.4.0.tgz#e441b9db468bdcf9eefdbdce1996f3d2e6fe8364" - integrity sha512-kHEjkZ+NAPOhLGpIMGKwe2xPgwDvtFiKU6FWPghSeslxGUAzC0mop/sSdD8NvWbSdqKd/GqeCen5khlA1MoyGQ== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-types/shared" "^3.20.0" +"@react-stately/datepicker@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.9.1.tgz#1567d3035f03eed8e54ebb9b189001fad1932448" + integrity sha512-o5xLvlZGJyAbTev2yruGlV2fzQyIDuYTgL19TTt0W0WCfjGGr/AAA9GjGXXmyoRA7sZMxqIPnnv7lNrdA38ofA== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/string" "^3.2.0" + "@react-stately/form" "^3.0.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/utils" "^3.9.0" + "@react-types/datepicker" "^3.7.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/checkbox@^3.4.3": - version "3.4.3" - resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.4.3.tgz#fb1585030b000a9fcc87d624a218dd3f2e3038d1" - integrity sha512-kn2f8mK88yvRrCfh8jYCDL2xpPhSApFWk9+qjWGsX/bnGGob7D5n71YYQ4cS58117YK2nrLc/AyQJXcZnJiA7Q== +"@react-stately/dnd@^3.2.7": + version "3.2.7" + resolved "https://registry.npmjs.org/@react-stately/dnd/-/dnd-3.2.7.tgz#47b72b5e6af4bdd991f4584889614406431a1538" + integrity sha512-QqSCvE9Rhp+Mr8Mt/SrByze24BFX1cy7gmXbwoqAYgHNIx3gWCVdBLqxfpfgYIhZdF9H72EWS8lQkfkZla06Ng== dependencies: - "@react-types/shared" "^3.18.0" + "@react-stately/selection" "^3.14.2" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/checkbox@^3.5.1": - version "3.5.1" - resolved "https://registry.npmmirror.com/@react-types/checkbox/-/checkbox-3.5.1.tgz#ba86d4ec8230781df2aed8bc7d21dfe88f4deb15" - integrity sha512-7iQqBRnpNC/k8ztCC+gNGTKpTWj6yJijXPKJ8UduqPNuJ0mIqWgk7DJDBuIG0cVvnenTNxYuOL6mt3dgdcEj9w== +"@react-stately/flags@^3.0.0": + version "3.0.0" + resolved "https://registry.npmmirror.com/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" + integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== dependencies: - "@react-types/shared" "^3.20.0" + "@swc/helpers" "^0.4.14" -"@react-types/combobox@^3.6.1": - version "3.6.1" - resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.6.1.tgz#8b951474e8be26bc6c44315b53dc1d1ddd3b4a53" - integrity sha512-CydRYMc80d4Wi6HeXUhmVPrVUnvQm60WJUaX2hM71tkKFo9ZOM6oW02YuOicjkNr7gpM7PLUxvM4Poc9EvDQTw== +"@react-stately/form@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@react-stately/form/-/form-3.0.0.tgz#584af339a128045c357c1b8ca440c87460a41b0f" + integrity sha512-C8wkfFmtx1escizibhdka5JvTy9/Vp173CS9cakjvWTmnjYYC1nOlzwp7BsYWTgerCFbRY/BU/Cf/bJDxPiUKQ== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/combobox@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-types/combobox/-/combobox-3.8.0.tgz#c8c050220227c6f79651c3c0a5d100227a4fc087" - integrity sha512-P1LDS283OegZGnRJcpJhDAbX0JE8cnW4FzIP04GJWzF9fSf/GrlrLEDt4VTXKXxtdLWy3T+H4gmAYO10ZZVmBQ== +"@react-stately/grid@^3.8.4": + version "3.8.4" + resolved "https://registry.npmjs.org/@react-stately/grid/-/grid-3.8.4.tgz#d52534c54c1a3e5dbb56d5a93b0458cf26cbf19d" + integrity sha512-rwqV1K4lVhaiaqJkt4TfYqdJoVIyqvSm98rKAYfCNzrKcivVpoiCMJ2EMt6WlYCjDVBdEOQ7fMV1I60IV0pntA== dependencies: - "@react-types/shared" "^3.20.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/datepicker@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.3.0.tgz#587d5c05b25cb3b494235b6cb230b7bb5f3273cc" - integrity sha512-dKhkpG3UhdwYqdpVjg5dCQgMefpr7sa4a6Ep6fvbyD/q7gv9+h0/1J5F3FJynW+CBL6uYhcZjNev2vjYVTDbEg== +"@react-stately/list@^3.10.2": + version "3.10.2" + resolved "https://registry.npmjs.org/@react-stately/list/-/list-3.10.2.tgz#5c93f33dbe8d3cc0d063fc2d59d4d4b788be379a" + integrity sha512-INt+zofkIg2KN8B95xPi9pJG7ZFWAm30oIm/lCPBqM3K1Nm03/QaAbiQj2QeJcOsG3lb7oqI6D6iwTolwJkjIQ== dependencies: - "@internationalized/date" "^3.2.0" - "@react-types/overlays" "^3.7.1" - "@react-types/shared" "^3.18.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/datepicker@^3.6.0": +"@react-stately/menu@^3.6.0": version "3.6.0" - resolved "https://registry.npmmirror.com/@react-types/datepicker/-/datepicker-3.6.0.tgz#59f8c57fc4803a92f8637414d1399a3e6eb178b9" - integrity sha512-eMWAqsavA7PpjKwUuij4RjThAc3l2MtxKT51XnTA192EoYyTRVcDK+cuYjzWYn1kTj6+dNap+WvKJlYrxmS5aA== + resolved "https://registry.npmjs.org/@react-stately/menu/-/menu-3.6.0.tgz#5366d6674d2c3d7b50efc51a8c0083d9588788f7" + integrity sha512-OB6CjNyfOkAuirqx1oTL8z8epS9WDzLyrXjmRnxdiCU9EgRXLGAQNECuO7VIpl58oDry8tgRJiJ8fn8FivWSQA== dependencies: - "@internationalized/date" "^3.5.0" - "@react-types/calendar" "^3.4.0" - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" + "@react-stately/overlays" "^3.6.4" + "@react-types/menu" "^3.9.6" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/dialog@^3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.1.tgz#0e1faa133238e026c4ba52c62fd2c8d748539b1f" - integrity sha512-a0eeGIITFuOxY2fIL1WkJT5yWIMIQ+VM4vE5MtS59zV9JynDaiL4uNL4yg08kJZm8oyzxIWwrov4gAbEVVWbDQ== +"@react-stately/numberfield@^3.8.0": + version "3.8.0" + resolved "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.8.0.tgz#0b0104b7460f3617d31ea1282fe15afb69910287" + integrity sha512-1XvB8tDOvZKcFnMM6qNLEaTVJcIc0jRFS/9jtS8MzalZvh8DbKi0Ucm1bGU7S5rkCx2QWqZ0rGOIm2h/RlcpkA== dependencies: - "@react-types/overlays" "^3.7.1" - "@react-types/shared" "^3.18.0" + "@internationalized/number" "^3.5.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/numberfield" "^3.7.0" + "@swc/helpers" "^0.5.0" -"@react-types/dialog@^3.5.5": - version "3.5.5" - resolved "https://registry.npmmirror.com/@react-types/dialog/-/dialog-3.5.5.tgz#bcd8d40bedc4c704161496d4c19a417ecc753b6a" - integrity sha512-XidCDLmbagLQZlnV8QVPhS3a63GdwiSa/0MYsHLDeb81+7P2vc3r+wNgnHWZw64mICWYzyyKxpzV3QpUm4f6+g== +"@react-stately/overlays@^3.6.4": + version "3.6.4" + resolved "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.4.tgz#1d0d974413fa3f13d97eec2cac5b48c49978d1a0" + integrity sha512-tHEaoAGpE9dSnsskqLPVKum59yGteoSqsniTopodM+miQozbpPlSjdiQnzGLroy5Afx5OZYClE616muNHUILXA== dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" + "@react-stately/utils" "^3.9.0" + "@react-types/overlays" "^3.8.4" + "@swc/helpers" "^0.5.0" -"@react-types/grid@^3.1.7": - version "3.1.7" - resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.1.7.tgz#f031b7c258550610cc3ba2e197b95214c1472177" - integrity sha512-YKo/AbJrgWErPmr5y0K4o6Ts9ModFv5+2FVujecIydu3zLuHsVcx//6uVeHSy2W+uTV9vU/dpMP+GGgg+vWQhw== +"@react-stately/radio@^3.10.1": + version "3.10.1" + resolved "https://registry.npmjs.org/@react-stately/radio/-/radio-3.10.1.tgz#d3d8bdcd6f1d9385b581094a7f2dab6836f7f229" + integrity sha512-MsBYbcLCvjKsqTAKe43T681F2XwKMsS7PLG0eplZgWP9210AMY78GeY1XPYZKHPAau8XkbYiuJqbqTerIJ3DBw== dependencies: - "@react-types/shared" "^3.18.0" + "@react-stately/form" "^3.0.0" + "@react-stately/utils" "^3.9.0" + "@react-types/radio" "^3.7.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/grid@^3.2.1": - version "3.2.1" - resolved "https://registry.npmmirror.com/@react-types/grid/-/grid-3.2.1.tgz#0ddfff7051a12936106be26fb0c080f3a3279330" - integrity sha512-diliZjyTyNeJDR+5rfh9RRNeM8KFOSaFARkbO42j11CteN1Rpo66x2R53xM+0BO63rCUGrJ8RAg2E4BCp7al6w== +"@react-stately/searchfield@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-stately/searchfield/-/searchfield-3.5.0.tgz#8493eefd684bc85117b42c7c714f6541afe54816" + integrity sha512-SStjChkn/33pEn40slKQPnBnmQYyxVazVwPjiBkdeVejC42lUVairUTrGJgF0PNoZTbxn0so2/XzjqTC9T8iCw== dependencies: - "@react-types/shared" "^3.20.0" + "@react-stately/utils" "^3.9.0" + "@react-types/searchfield" "^3.5.2" + "@swc/helpers" "^0.5.0" -"@react-types/label@^3.7.3": - version "3.7.3" - resolved "https://registry.npmjs.org/@react-types/label/-/label-3.7.3.tgz#adab02949088a450f9dd947319bc5ca66eef5c4b" - integrity sha512-TKuQ2REPl4UVq/wl3CAujzixeNVVso0Kob+0T1nP8jIt9k9ssdLMAgSh8Z4zNNfR+oBIngYOA9IToMnbx6qACA== +"@react-stately/select@^3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@react-stately/select/-/select-3.6.1.tgz#f2ddd1b6b1ff659388ee321a081d1da6aaa3be70" + integrity sha512-e5ixtLiYLlFWM8z1msDqXWhflF9esIRfroptZsltMn1lt2iImUlDRlOTZlMtPQzUrDWoiHXRX88sSKUM/jXjQQ== + dependencies: + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/overlays" "^3.6.4" + "@react-types/select" "^3.9.1" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/selection@^3.14.2": + version "3.14.2" + resolved "https://registry.npmjs.org/@react-stately/selection/-/selection-3.14.2.tgz#6a3d5b59db951c34d04494b28373f4fe8ce6f581" + integrity sha512-mL7OoiUgVWaaF7ks5XSxgbXeShijYmD4G3bkBHhqkpugU600QH6BM2hloCq8KOUupk1y8oTljPtF9EmCv375DA== dependencies: - "@react-types/shared" "^3.18.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/label@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-types/label/-/label-3.8.0.tgz#73b1ae3b3cd63ff70f3019215c6809c1c7cbb252" - integrity sha512-hZTSguqyblAF83kLImjxw46DywRMpSihkP1829T8N2I/i8oFSu74OYBJ8woklk26AOUMDJ4NFTdimdqWVMdRcQ== +"@react-stately/slider@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-stately/slider/-/slider-3.5.0.tgz#d59bcd6fe58c238772b771ffb1a5640fb22d839c" + integrity sha512-dOVpIxb7XKuiRxgpHt1bUSlsklciFki100tKIyBPR+Okar9iC/CwLYROYgVfLkGe77jEBNkor9tDLjDGEWcc1w== dependencies: - "@react-types/shared" "^3.20.0" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@react-types/slider" "^3.7.0" + "@swc/helpers" "^0.5.0" -"@react-types/link@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/link/-/link-3.4.1.tgz#e6aa92b640f8e09c29c84b6954f9da3f89a965e1" - integrity sha512-ZoCfuS+0A0QrCG5kfp4ZeqXCMW39WCyTRSD9FCQvtTYOgCT4G5rvXBnCKIaN8T8w6WbgEbkg2wpRSG3Qd0GZJQ== +"@react-stately/table@^3.11.4": + version "3.11.4" + resolved "https://registry.npmjs.org/@react-stately/table/-/table-3.11.4.tgz#501c721576a373caa025b9d2967545e135500b2b" + integrity sha512-dWINJIEOKQl4qq3moq+S8xCD3m+yJqBj0dahr+rOkS+t2uqORwzsusTM35D2T/ZHZi49S2GpE7QuDa+edCynPw== dependencies: - "@react-aria/interactions" "^3.15.0" - "@react-types/shared" "^3.18.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/flags" "^3.0.0" + "@react-stately/grid" "^3.8.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" + "@swc/helpers" "^0.5.0" -"@react-types/link@^3.4.5": - version "3.4.5" - resolved "https://registry.npmmirror.com/@react-types/link/-/link-3.4.5.tgz#6e9bb9f8b3dd00a6c3e0dbcb5ecc6cbabd22ce2c" - integrity sha512-wwLIFjg35LBxv29rA6jPyChPH6b18U1SXaCyVa2koRIOvXTdNSRnautyE3ZQ7LyufJDc5SRTOWQHjPK1IiOfaA== +"@react-stately/tabs@^3.6.3": + version "3.6.3" + resolved "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.6.3.tgz#65bd11595624f2e0c49069758973d520c47f5b5a" + integrity sha512-Nj+Gacwa2SIzYIvHW40GsyX4Q6c8kF7GOuXESeQswbCjnwqhrSbDBp+ngPcUPUJxqFh6JhDCVwAS3wMhUoyUwA== dependencies: - "@react-aria/interactions" "^3.18.0" - "@react-types/shared" "^3.20.0" + "@react-stately/list" "^3.10.2" + "@react-types/shared" "^3.22.0" + "@react-types/tabs" "^3.3.4" + "@swc/helpers" "^0.5.0" -"@react-types/listbox@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.1.tgz#3d9f5859ad4eb550a6c1c532042316b32e43b606" - integrity sha512-2h1zJDQI3v4BFBwpjKc+OYXM2EzN2uxG5DiZ4MZUcWJDpa1+rOlfaPtBNUPiEVHt6fm6qeuoYVPf3r65Lo3IDw== +"@react-stately/toggle@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.0.tgz#abe2f08f37a0f41e6513d4fde3d46f49500bb5cc" + integrity sha512-TRksHkCJk/Xogq4181g3CYgJf+EfsJCqX5UZDSw1Z1Kgpvonjmdf6FAfQfCh9QR2OuXUL6hOLUDVLte5OPI+5g== + dependencies: + "@react-stately/utils" "^3.9.0" + "@react-types/checkbox" "^3.6.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.4.6.tgz#e240184dedc35018f7b1e2d46eaca20a90d919bb" + integrity sha512-uL93bmsXf+OOgpKLPEKfpDH4z+MK2CuqlqVxx7rshN0vjWOSoezE5nzwgee90+RpDrLNNNWTNa7n+NkDRpI1jA== dependencies: - "@react-types/shared" "^3.18.0" + "@react-stately/overlays" "^3.6.4" + "@react-types/tooltip" "^3.4.6" + "@swc/helpers" "^0.5.0" -"@react-types/listbox@^3.4.4": - version "3.4.4" - resolved "https://registry.npmmirror.com/@react-types/listbox/-/listbox-3.4.4.tgz#1205acd6334c4fc85088a62edb4a5a8110ec7b82" - integrity sha512-c0FFM73tGZZ5AV9Yu5/Vd/cji5AVcI2QZvs4+mpRcSpzH3zSCVvVLr7GayZFS70tYQVPLHFH2E202wLxoiLK9A== +"@react-stately/tree@^3.7.5": + version "3.7.5" + resolved "https://registry.npmjs.org/@react-stately/tree/-/tree-3.7.5.tgz#6e084e1b7d3d0b31fe619a5d5c45dea9b0a63ff2" + integrity sha512-xTJVwvhAeY0N5rui4N/TxN7f8hjXdqApDuGDxMZeFAWoQz8Abf7LFKBVQ3OkT6qVr7P+23dgoisUDBhD5a45Hg== dependencies: - "@react-types/shared" "^3.20.0" + "@react-stately/collections" "^3.10.4" + "@react-stately/selection" "^3.14.2" + "@react-stately/utils" "^3.9.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/menu@^3.9.0": +"@react-stately/utils@^3.9.0": version "3.9.0" - resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.0.tgz#2c98335e9e563f06a25996cde73b99a8920ef6a9" - integrity sha512-aalUYwOkzcHn8X59vllgtH96YLqZvAr4mTj5GEs8chv5JVlmArUzcDiOymNrYZ0p9JzshzSUqxxXyCFpnnxghw== + resolved "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.0.tgz#9cb2c8eea5dd1b58256ecb436b963c01526bae37" + integrity sha512-yPKFY1F88HxuZ15BG2qwAYxtpE4HnIU0Ofi4CuBE0xC6I8mwo4OQjDzi+DZjxQngM9D6AeTTD6F1V8gkozA0Gw== dependencies: - "@react-types/overlays" "^3.7.1" - "@react-types/shared" "^3.18.0" + "@swc/helpers" "^0.5.0" -"@react-types/menu@^3.9.4": - version "3.9.4" - resolved "https://registry.npmmirror.com/@react-types/menu/-/menu-3.9.4.tgz#58256482f63efdda4a0d9cfacd98445ee0c4f327" - integrity sha512-8OnPQHMPZw126TuLi21IuHWMbGOqoWZa+0uJCg2gI+Xpe1F0dRK/DNzCIKkGl1EXgZATJbRC3NcxyZlWti+/EQ== +"@react-stately/virtualizer@^3.6.6": + version "3.6.6" + resolved "https://registry.npmjs.org/@react-stately/virtualizer/-/virtualizer-3.6.6.tgz#3eb15f15e0a578b95373cb8bd6ad4f459ff8e961" + integrity sha512-9hWvfITdE/028q4YFve6FxlmA3PdSMkUwpYA+vfaGCXI/4DFZIssBMspUeu4PTRJoV+k+m0z1wYHPmufrq6a3g== dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" + "@react-aria/utils" "^3.23.0" + "@react-types/shared" "^3.22.0" + "@swc/helpers" "^0.5.0" -"@react-types/meter@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.1.tgz#236301c6c86ae6962488aefa42785247d1cc118d" - integrity sha512-KWaJ3OFW4X3tROpz/Dtun1d/RmghzXEBqAKeuv0AQDwy2QaQhQdAKgMpS7mPbkF906Xl8eNNDms+0Yi56EYJog== +"@react-types/breadcrumbs@^3.7.2": + version "3.7.2" + resolved "https://registry.npmjs.org/@react-types/breadcrumbs/-/breadcrumbs-3.7.2.tgz#3dc0c8ccebf75844efc56ac8e53dc072df083d5f" + integrity sha512-esl6RucDW2CNMsApJxNYfMtDaUcfLlwKMPH/loYsOBbKxGl2HsgVLMcdpjEkTRs2HCTNCbBXWpeU8AY77t+bsw== dependencies: - "@react-types/progress" "^3.4.0" - "@react-types/shared" "^3.18.0" + "@react-types/link" "^3.5.2" + "@react-types/shared" "^3.22.0" -"@react-types/meter@^3.3.4": - version "3.3.4" - resolved "https://registry.npmmirror.com/@react-types/meter/-/meter-3.3.4.tgz#9ff07a7d98c03640637c50258eaf0b02646a174f" - integrity sha512-GYxba83AU59wARkWJen5BnmzdqSRT3IFg0gg3CZ4Dq4NgEKoN9Pw2ISxyogvBgwDPdxFuN8QK6QExxm4rPBS/A== +"@react-types/button@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-types/button/-/button-3.9.1.tgz#eb54745133bdaad345d8d589021b67ef2882e1c5" + integrity sha512-bf9iTar3PtqnyV9rA+wyFyrskZKhwmOuOd/ifYIjPs56YNVXWH5Wfqj6Dx3xdFBgtKx8mEVQxVhoX+WkHX+rtw== dependencies: - "@react-types/progress" "^3.4.3" - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/numberfield@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.4.1.tgz#f52d053b0ab6a3bd894878f621532224d3480caf" - integrity sha512-iS+s2BgOWUxYnMt+LG1OxlKZWeggKMBs55/NzVF5I2MCe1ju8ZUgM27g9A/gvUTdjt+fqx6VZu0MCipw0rVkIQ== +"@react-types/calendar@^3.4.3": + version "3.4.3" + resolved "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.4.3.tgz#475c970b263a18bff87c4cbba2379aba87d1dd8a" + integrity sha512-96x57ctX5wNEl+8et3sc2NQm8neOJayEeqOQQpyPtI7jyvst/xBrKCwysf9W/dhgPlUC+KeBAYFWfjd5hFVHYA== dependencies: - "@react-types/shared" "^3.18.0" + "@internationalized/date" "^3.5.1" + "@react-types/shared" "^3.22.0" -"@react-types/numberfield@^3.6.0": +"@react-types/checkbox@^3.6.0": version "3.6.0" - resolved "https://registry.npmmirror.com/@react-types/numberfield/-/numberfield-3.6.0.tgz#7fb16e138180f278bed2f333c273cf72a26add76" - integrity sha512-Kg+7CQYj2FY78zmYDK6kxZYu1/JNfkptsu0lhBJKcsQenXZc6CSZyiFpVZN7T+fQGnX0YbAcUQp9MOt5tbZcGg== + resolved "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.6.0.tgz#ba702be25555c1520f78be39c8260354638792b6" + integrity sha512-vgbuJzQpVCNT5AZWV0OozXCnihqrXxoZKfJFIw0xro47pT2sn3t5UC4RA9wfjDGMoK4frw1K/4HQLsQIOsPBkw== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/overlays@^3.7.1": - version "3.7.1" - resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.7.1.tgz#f06bf0b7845e5a609c3a3eda0bb3f2aea71a143a" - integrity sha512-2AwYQkelr4p1uXR1KJIGQEbubOumzM853Hsyup2y/TaMbjvBWOVyzYWSrQURex667JZmpwUb0qjkEH+4z3Q74g== +"@react-types/combobox@^3.10.0": + version "3.10.0" + resolved "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.10.0.tgz#d60f103f299280eb5873f9ae6c9203b5d484926d" + integrity sha512-1IXSNS02TPbguyYopaW2snU6sZusbClHrEyVr4zPeexTV4kpUUBNXOzFQ+eSQRR0r2XW57Z0yRW4GJ6FGU0yCA== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/overlays@^3.8.2": - version "3.8.2" - resolved "https://registry.npmmirror.com/@react-types/overlays/-/overlays-3.8.2.tgz#1411e0a1626f4140de0ce67835f24a6a18f8d5de" - integrity sha512-HpLYzkNvuvC6nKd06vF9XbcLLv3u55+e7YUFNVpgWq8yVxcnduOcJdRJhPaAqHUl6iVii04mu1GKnCFF8jROyQ== +"@react-types/datepicker@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.7.1.tgz#a9a7e8f192a49232f919b921d7b6f8bb7667eb01" + integrity sha512-5juVDULOytNzkotqX8j5mYKJckeIpkgbHqVSGkPgLw0++FceIaSZ6RH56cqLup0pO45paqIt9zHh+QXBYX+syg== dependencies: - "@react-types/shared" "^3.20.0" + "@internationalized/date" "^3.5.1" + "@react-types/calendar" "^3.4.3" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/progress@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.4.0.tgz#6a8b7642e38bbc73389dfa1eceb32ab57561cae8" - integrity sha512-aSb7mn6nqVla8svO75/QZba7PhhdTh2rsvdwhvPkB7S06pbX6f0x+YCqXrpT+v9aPGxQ8q6U1b2I0fLrmQTSeA== +"@react-types/dialog@^3.5.7": + version "3.5.7" + resolved "https://registry.npmjs.org/@react-types/dialog/-/dialog-3.5.7.tgz#3fd93875ff317d6014e814b6e1a2abb87272a1ef" + integrity sha512-geYoqAyQaTLG43AaXdMUVqZXYgkSifrD9cF7lR2kPAT0uGFv0YREi6ieU+aui8XJ83EW0xcxP+EPWd2YkN4D4w== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/progress@^3.4.3": - version "3.4.3" - resolved "https://registry.npmmirror.com/@react-types/progress/-/progress-3.4.3.tgz#70be9231ede045a5b377438d5a352c1d9f245a63" - integrity sha512-g0HrxOf3ubQ4Tp9jwOMhl+WOd4cYh/cCwO6B8LFKw0m5erJWh5VdlyBql+5rmQmYWUaG8RcWyfnKY1C6WShl1g== +"@react-types/form@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/form/-/form-3.7.0.tgz#4a7d2f851e84633d3114bbc7db902b42a4cdbc75" + integrity sha512-IPmFCh3/psQqJ9X+64tpdHyRNGXDzKvsHfZq27WVxkEDN2KC0g3nnVvuwKXY6gdzYEl6B4RRcmAk8bmGoZpvqg== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/radio@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.4.1.tgz#e79efb40c35109d888d3aa8de4d8dd0f4c4028e3" - integrity sha512-8r7s+Zj0JoIpYgbuHjhE/eWUHKiptaFvYXMH986yKAg969VQlQiP9Dm4oWv2d+p26WbGK7oJDQJCt8NjASWl8g== +"@react-types/grid@^3.2.3": + version "3.2.3" + resolved "https://registry.npmjs.org/@react-types/grid/-/grid-3.2.3.tgz#20b19b73315343630145ff9e43138e7f2855d946" + integrity sha512-GQM4RDmYhstcYZ0Odjq+xUwh1fhLmRebG6qMM8OXHTPQ77nhl3wc1UTGRhZm6mzEionplSRx4GCpEMEHMJIU0w== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/radio@^3.5.1": - version "3.5.1" - resolved "https://registry.npmmirror.com/@react-types/radio/-/radio-3.5.1.tgz#11cdf4eb54ba54a5720828e7b6d0739d4943a767" - integrity sha512-jPF8zt+XdgW9DaTvB5ZYCh0uk7DVko1VZ/jOlCRs82w3P884Wc7MMpwdl1T5PBdhtLcdr+xjM1YI6/31reIBfQ== +"@react-types/link@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-types/link/-/link-3.5.2.tgz#b363abca3365adc64b49c47163ce00235c01c667" + integrity sha512-/s51/WejmpLiyxOgP89s4txgxYoGaPe8pVDItVo1h4+BhU1Puyvgv/Jx8t9dPvo6LUXbraaN+SgKk/QDxaiirw== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/searchfield@^3.4.1": - version "3.4.1" - resolved "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.4.1.tgz#d20f2389af230cfa4b53e1e5913c0b2f6bcbdf56" - integrity sha512-JmIwylx88IYrntfw7vAWCL1Ip5okJIRtC8Ne6mr2IjT4oGA9BRF5LpoPdEZlXfVPwLt7jlwGLUwKphbkds+yUA== +"@react-types/listbox@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-types/listbox/-/listbox-3.4.6.tgz#da0887dbb89a868d53b87486111bf0a51042da7b" + integrity sha512-XOQvrTqNh5WIPDvKiWiep8T07RAsMfjAXTjDbnjxVlKACUXkcwpts9kFaLnJ9LJRFt6DwItfP+WMkzvmx63/NQ== dependencies: - "@react-types/shared" "^3.18.0" - "@react-types/textfield" "^3.7.1" + "@react-types/shared" "^3.22.0" -"@react-types/searchfield@^3.5.0": - version "3.5.0" - resolved "https://registry.npmmirror.com/@react-types/searchfield/-/searchfield-3.5.0.tgz#8b1d1c9554c4be20b7c28f91270dd6492a724759" - integrity sha512-llp3K3Z0e7tCLyiYQilAl4XJZiuXr+G9dboogU0ypLeIwMW69b9OgQx2KzLILN/CdtNqN6PBpBXMPnG+mHCcqg== +"@react-types/menu@^3.9.6": + version "3.9.6" + resolved "https://registry.npmjs.org/@react-types/menu/-/menu-3.9.6.tgz#1b36842cbdb4590dfff78437316aec4a3f47b1f6" + integrity sha512-w/RbFInOf4nNayQDv5c2L8IMJbcFOkBhsT3xvvpTy+CHvJcQdjggwaV1sRiw7eF/PwB81k2CwigmidUzHJhKDg== dependencies: - "@react-types/shared" "^3.20.0" - "@react-types/textfield" "^3.8.0" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" -"@react-types/select@^3.8.0": - version "3.8.0" - resolved "https://registry.npmjs.org/@react-types/select/-/select-3.8.0.tgz#a5ad61f99bf4f490a24ef82bd76270ffcf4633f5" - integrity sha512-hdaB3CzK8GSip9oGahfnlwolRqdNow85CQwf5P0oEtIDdijihrG6hyphPu5HYGK687EF+lfhnWUYUMwckEwB8Q== +"@react-types/meter@^3.3.6": + version "3.3.6" + resolved "https://registry.npmjs.org/@react-types/meter/-/meter-3.3.6.tgz#ae5960b27012f52ca33970f2ff416af71dad274d" + integrity sha512-1XYp1fA9UU0lO6kjf3TwVE8mppOJa64mBKAcLWtTyq1e/cYIAbx5o6CsuUx0YDpXKF6gdtvIWvfmxeWsmqJ1jQ== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/progress" "^3.5.1" -"@react-types/select@^3.8.3": - version "3.8.3" - resolved "https://registry.npmmirror.com/@react-types/select/-/select-3.8.3.tgz#18888bf42cae6e89e1dc4b5112c08382152bf650" - integrity sha512-x0x/qJq48QqVnBXFqvPaiS/TQOmCIL9ZmzM4AzRtYMU++kxjy3L03cdnzDBmxKN+KkfDn7OU++vKI44ksgTCRA== +"@react-types/numberfield@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.7.0.tgz#a029bf2a8a07049c96ea5ffe1f7533ab2305bcf4" + integrity sha512-gaGi+vqm1Y8LCWRsWYUjcGftPIzl+8W2VOfkgKMLM8y76nnwTPtmAqs+Ap1cg7sEJSfsiKMq93e9yvP3udrC2w== dependencies: - "@react-types/shared" "^3.20.0" - -"@react-types/shared@^3.18.0": - version "3.18.0" - resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.18.0.tgz#4f2bacad5912eba6667695ee3f9e8ac9f79849f7" - integrity sha512-WJj7RAPj7NLdR/VzFObgvCju9NMDktWSruSPJ3DrL5qyrrvJoyMW67L4YjNoVp2b7Y+k10E0q4fSMV0PlJoL0w== + "@react-types/shared" "^3.22.0" -"@react-types/shared@^3.20.0": - version "3.20.0" - resolved "https://registry.npmmirror.com/@react-types/shared/-/shared-3.20.0.tgz#15f0cbe3978831589f083c8e316810669b4fa606" - integrity sha512-lgTO/S/EMIZKU1EKTg8wT0qYP5x/lZTK2Xw6BZZk5c4nn36JYhGCRb/OoR/jBCIeRb2x9yNbwERO6NYVkoQMSw== - -"@react-types/slider@^3.5.0": - version "3.5.0" - resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.5.0.tgz#3cf51b11ee57ac54d4314f4cabab0d47dc433c85" - integrity sha512-ri0jGWt1x/+nWLLJmlRKaS0xyAjTE1UtsobEYotKkQjzG93WrsEZrb0tLmDnXyEfWi3NXyrReQcORveyv4EQ5g== +"@react-types/overlays@^3.8.4": + version "3.8.4" + resolved "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.4.tgz#a538f6f2fb9826f1da78d3b4f0f6326a709ce37d" + integrity sha512-pfgNlQnbF6RB/R2oSxyqAP3Uzz0xE/k5q4n5gUeCDNLjY5qxFHGE8xniZZ503nZYw6VBa9XMN1efDOKQyeiO0w== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/slider@^3.6.1": - version "3.6.1" - resolved "https://registry.npmmirror.com/@react-types/slider/-/slider-3.6.1.tgz#337570fc19879df5b88f4f84d4df3eada11ddede" - integrity sha512-K234amXGLfDekJOQimhPpd2OE14Set7+LrzZZx1ut5ayIK3QgeneUqaybQcB7plfO1thNaAoDOy7JPqZ13k1JA== +"@react-types/progress@^3.5.1": + version "3.5.1" + resolved "https://registry.npmjs.org/@react-types/progress/-/progress-3.5.1.tgz#b988cd2d2ff194c7652d74f714b230f26ab73c6c" + integrity sha512-CqsUjczUK/SfuFzDcajBBaXRTW0D3G9S/yqLDj9e8E0ii+lGDLt1PHj24t1J7E88U2rVYqmM9VL4NHTt8o3IYA== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/switch@^3.3.1": - version "3.3.1" - resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.3.1.tgz#76f644391918d3035c7dc3228724b462dfd81924" - integrity sha512-EvKWPtcOLTF7Wh8YCxJEtmqRZX3qSLRYPaIntl/CKF+14QXErPXwOn0ObLfy6VNda5jDJBOecWpgC69JEjkvfw== +"@react-types/radio@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/radio/-/radio-3.7.0.tgz#4610fc7f97f6ed1d54a4d314717e3605c4422fac" + integrity sha512-EcwGAXzSHjSqpFZha7xn3IUrhPiJLj+0yb1Ip0qPmhWz0VVw2DwrkY7q/jfaKroVvQhTo2TbfGhcsAQrt0fRqg== dependencies: - "@react-types/checkbox" "^3.4.3" - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/switch@^3.4.1": - version "3.4.1" - resolved "https://registry.npmmirror.com/@react-types/switch/-/switch-3.4.1.tgz#3475ee497cb0bba491c47d0594cf9a62df823c70" - integrity sha512-2XfPsu2Yiap+pthO2rvCNlLjzo9mDejrYY3rsYMw/jLzCHvuR8Xe2/l01svHcq3pVuNIMElqZR4vTq9OvGNBnQ== +"@react-types/searchfield@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@react-types/searchfield/-/searchfield-3.5.2.tgz#e663899f42344243ea7b4cd6f0ab0bfe6020151e" + integrity sha512-JAK2/Kg4Dr393FYfbRw0TlXKnJPX77sq1x/ZBxtO6p64+MuuIYKqw0i9PwDlo1PViw2QI5u8GFhKA2TgemY9uA== dependencies: - "@react-types/checkbox" "^3.5.1" - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" + "@react-types/textfield" "^3.9.0" -"@react-types/table@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@react-types/table/-/table-3.6.0.tgz#f71718ac85a9352a5f52a2d8d8bdf98883cf1f54" - integrity sha512-jUp8yTWJuJlqpJY+EIEppgjFsZ3oj4y9zg1oUO+l1rqRWEqmAdoq42g3dTZHmnz9hQJkUeo34I1HGaB9kxNqvg== +"@react-types/select@^3.9.1": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-types/select/-/select-3.9.1.tgz#12ea11e6a81629f44ceff81635b4ec12acfc6565" + integrity sha512-EpKSxrnh8HdZvOF9dHQkjivAcdIp1K81FaxmvosH8Lygqh0iYXxAdZGtKLMyBoPI8YFhA+rotIzTcOqgCCnqWA== dependencies: - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/table@^3.8.1": - version "3.8.1" - resolved "https://registry.npmmirror.com/@react-types/table/-/table-3.8.1.tgz#915a54a0153386a676e7fba05d795ad3787dd385" - integrity sha512-zUZ0jTnTBz0JWhnbz7U0LnnKqGhPvmQz+xyADrBIrgj8hk1jQdWNTwAFwqUg8uaReSy+9b3jjPPNOnpTu9DmgA== - dependencies: - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" +"@react-types/shared@^3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.0.tgz#70f85aad46cd225f7fcb29f1c2b5213163605074" + integrity sha512-yVOekZWbtSmmiThGEIARbBpnmUIuePFlLyctjvCbgJgGhz8JnEJOipLQ/a4anaWfzAgzSceQP8j/K+VOOePleA== -"@react-types/tabs@^3.2.1": - version "3.2.1" - resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.2.1.tgz#060438afba1a400993a4733e33542046cb1495b0" - integrity sha512-KgvhrYvISQUq540iuNc3bRvOCfLvaeqpB5VwDYR8amG1FVWHklCW8xx8Uz63SVkOvNtExYCrlw63M/OnjRUzOw== +"@react-types/slider@^3.7.0": + version "3.7.0" + resolved "https://registry.npmjs.org/@react-types/slider/-/slider-3.7.0.tgz#d9e4dbe1b2109c7accfcc0e2e330ff10cd3a837c" + integrity sha512-uyQXUVFfqc9SPUW0LZLMan2n232F/OflRafiHXz9viLFa9tVOupVa7GhASRAoHojwkjoJ1LjFlPih7g5dOZ0/Q== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/tabs@^3.3.2": - version "3.3.2" - resolved "https://registry.npmmirror.com/@react-types/tabs/-/tabs-3.3.2.tgz#54bdf0b690e8880d1155c5b931ebe2244ef07e38" - integrity sha512-eC6gGKH+Z2sCaHsCsSqT6gDE9E0ghbxL5d/yBjJ8VHxXkNLvM6dXwoYaEhA2JEdQqf0vC/7bZdjI3swV63DgKg== +"@react-types/switch@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.0.tgz#8ebf07c60aef22b181eb4ab884cf3d2abddd66c6" + integrity sha512-/wNmUGjk69bP6t5k2QkAdrNN5Eb9Rz4dOyp0pCPmoeE+5haW6sV5NmtkvWX1NSc4DQz1xL/a5b+A0vxPCP22Jw== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/textfield@^3.7.1": - version "3.7.1" - resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.7.1.tgz#6dc0c98384a1acba3f69a21b6a1563aa7b20de48" - integrity sha512-6V5+6/VgDbmgN61pyVct1VrXb2hqq7Y43BFQ+/ZhFDlVaMpC5xKWKgW/gPbGLLc27gax8t2Brt7VHJj+d+yrUw== +"@react-types/table@^3.9.2": + version "3.9.2" + resolved "https://registry.npmjs.org/@react-types/table/-/table-3.9.2.tgz#43fd0601fea554765b49a29d65510bd31310cb58" + integrity sha512-brw5JUANOzBa2rYNpN8AIl9nDZ9RwRZC6G/wTM/JhtirjC1S42oCtf8Ap5rWJBdmMG/5KOfcGNcAl/huyqb3gg== dependencies: - "@react-types/shared" "^3.18.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" -"@react-types/textfield@^3.8.0": - version "3.8.0" - resolved "https://registry.npmmirror.com/@react-types/textfield/-/textfield-3.8.0.tgz#aa5d87482d613916818e1c1c61059bc69b1b63e1" - integrity sha512-KRIEiIaB7pi0VlyOXNv39qeY0nBVmaXHwReCmEktQxKtXQ5lbEU6pvbc6srMZIplJffutQCZSXAucw/2ewLLVQ== +"@react-types/tabs@^3.3.4": + version "3.3.4" + resolved "https://registry.npmjs.org/@react-types/tabs/-/tabs-3.3.4.tgz#43fa93a4a67dcc53031afc56a8ad3bf5f44473a8" + integrity sha512-4mCTtFrwMRypyGTZCvNYVT9CkknexO/UYvqwDm2jMYb8JgjRvxnomu776Yh7uyiYKWyql2upm20jqasEOm620w== dependencies: - "@react-types/shared" "^3.20.0" + "@react-types/shared" "^3.22.0" -"@react-types/tooltip@^3.4.0": - version "3.4.0" - resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.0.tgz#5d02407903257ed888b7d45898a1903ed597e2e3" - integrity sha512-dvMwX377uJAMTuditfvwWed53YjV62XWMqW29Fave4xg3A807VVK3H1iEgwCIGA9ve2XHF8cJbqSHD635qU+tQ== +"@react-types/textfield@^3.9.0": + version "3.9.0" + resolved "https://registry.npmjs.org/@react-types/textfield/-/textfield-3.9.0.tgz#ad29f0a70421f9d2cd6cf2795df10a7712954e69" + integrity sha512-D/DiwzsfkwlAg3uv8hoIfwju+zhB/hWDEdTvxQbPkntDr0kmN/QfI17NMSzbOBCInC4ABX87ViXLGxr940ykGA== dependencies: - "@react-types/overlays" "^3.7.1" - "@react-types/shared" "^3.18.0" + "@react-types/shared" "^3.22.0" -"@react-types/tooltip@^3.4.4": - version "3.4.4" - resolved "https://registry.npmmirror.com/@react-types/tooltip/-/tooltip-3.4.4.tgz#c528e876c7fa31a209f05e1ee8ced269da5c440a" - integrity sha512-pEy4eKWXV9IW/h76dzEPRDJdPyYGis4OoJC1BYHjDRILq0kV1F/lzCJaL29f5VHkYOTIHmwaEMbDX3m7OSJjrw== +"@react-types/tooltip@^3.4.6": + version "3.4.6" + resolved "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.6.tgz#1f1eb22873a5d5ad355e0de1be46f48759b55f6f" + integrity sha512-RaZewdER7ZcsNL99RhVHs8kSLyzIBkwc0W6eFZrxST2MD9J5GzkVWRhIiqtFOd5U1aYnxdJ6woq72Ef+le6Vfw== dependencies: - "@react-types/overlays" "^3.8.2" - "@react-types/shared" "^3.20.0" + "@react-types/overlays" "^3.8.4" + "@react-types/shared" "^3.22.0" "@remix-run/router@1.4.0": version "1.4.0" @@ -5530,18 +4493,18 @@ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@safe-global/safe-apps-provider@^0.17.1": - version "0.17.1" - resolved "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.17.1.tgz#72df2a66be5343940ed505efe594ed3b0f2f7015" - integrity sha512-lYfRqrbbK1aKU1/UGkYWc/X7PgySYcumXKc5FB2uuwAs2Ghj8uETuW5BrwPqyjBknRxutFbTv+gth/JzjxAhdQ== +"@safe-global/safe-apps-provider@^0.18.1": + version "0.18.1" + resolved "https://registry.npmjs.org/@safe-global/safe-apps-provider/-/safe-apps-provider-0.18.1.tgz#287b5a1e2ef3be630dacde54279409df3ced8202" + integrity sha512-V4a05A3EgJcriqtDoJklDz1BOinWhC6P0hjUSxshA4KOZM7rGPCTto/usXs09zr1vvL28evl/NldSTv97j2bmg== dependencies: - "@safe-global/safe-apps-sdk" "8.0.0" + "@safe-global/safe-apps-sdk" "^8.1.0" events "^3.3.0" -"@safe-global/safe-apps-sdk@8.0.0", "@safe-global/safe-apps-sdk@^8.0.0": - version "8.0.0" - resolved "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.0.0.tgz#9bdfe0e0d85e1b2d279bb840f40c4b930aaf8bc1" - integrity sha512-gYw0ki/EAuV1oSyMxpqandHjnthZjYYy+YWpTAzf8BqfXM3ItcZLpjxfg+3+mXW8HIO+3jw6T9iiqEXsqHaMMw== +"@safe-global/safe-apps-sdk@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@safe-global/safe-apps-sdk/-/safe-apps-sdk-8.1.0.tgz#d1d0c69cd2bf4eef8a79c5d677d16971926aa64a" + integrity sha512-XJbEPuaVc7b9n23MqlF6c+ToYIS3f7P2Sel8f3cSBQ9WORE4xrSuvhMpK9fDSFqJ7by/brc+rmJR/5HViRr0/w== dependencies: "@safe-global/safe-gateway-typescript-sdk" "^3.5.3" viem "^1.0.0" @@ -5568,6 +4531,11 @@ resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== +"@scure/base@~1.1.2": + version "1.1.5" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz#1d85d17269fe97694b9c592552dd9e5e33552157" + integrity sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ== + "@scure/bip32@1.3.0": version "1.3.0" resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" @@ -5577,6 +4545,15 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz#90e78c027d5e30f0b22c1f8d50ff12f3fb7559f8" + integrity sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA== + dependencies: + "@noble/curves" "~1.2.0" + "@noble/hashes" "~1.3.2" + "@scure/base" "~1.1.2" + "@scure/bip39@1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" @@ -5593,6 +4570,14 @@ "@noble/hashes" "~1.3.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -6430,7 +5415,7 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.11": +"@types/react-dom@^18.0.0": version "18.0.11" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== @@ -6513,6 +5498,11 @@ "@types/react" "*" csstype "^3.0.2" +"@types/stylis@^4.0.2": + version "4.2.5" + resolved "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz#1daa6456f40959d06157698a653a9ab0a70281df" + integrity sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw== + "@types/testing-library__jest-dom@^5.9.1": version "5.14.5" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f" @@ -6649,66 +5639,47 @@ "@typescript-eslint/types" "5.56.0" eslint-visitor-keys "^3.3.0" -"@us3r-network/auth-with-rainbowkit@^0.1.8": - version "0.1.8" - resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.1.8.tgz#af2039e67c3426e052b7651b0fa6028b3fd0fc6c" - integrity sha512-k4zMN8XpHNANhqIk9s1xX5JYrF7vUxnvdWImGtOiWq5Z0iixtN7HY6tTiQhKM1C3W2hD/ZgsCUBKBso11Jdc2A== +"@us3r-network/auth-with-rainbowkit@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.2.1.tgz#bce3345a54eca8499ce6a52fff2de814b27fb03b" + integrity sha512-7Futy5KEinrmbO5YPRAteLKaJyzU/3KkRkqsznrobcODVaa0ZVNcuQhdHvsivfPPkHKoxuvkD5LTCq4x8iySMQ== dependencies: - "@rainbow-me/rainbowkit" "1.0.2" - "@us3r-network/auth" "^0.2.2" + "@us3r-network/auth" "^0.2.3" buffer "^6.0.3" - viem "^0.3.37" - wagmi "^1.0.7" -"@us3r-network/auth@^0.2.2": - version "0.2.2" - resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.2.tgz#62fbed90a9d7145e42f0d2e7c738133a69cb1e6f" - integrity sha512-/N+6NvHnaTWoc3C7VQga1cB6KNqkmTg+urAkyuWhtLrNmVGq30lXhcVR+FAWldN8O1YU8gquE8SztbD0Pc/jCA== +"@us3r-network/auth@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.3.tgz#cc2e5488be6811599409fad1a3102e0dab8944f8" + integrity sha512-gBMu9eEcb6r9dkdA2jZNjUSskELmEPeWqYYKwYPD2nYdJh83p4mo8DT1/09IHuvkDIEhz0dbwZEHc5jIvORo0A== dependencies: - "@didtools/pkh-ethereum" "^0.2.1" - "@didtools/pkh-solana" "^0.1.0" - did-session "^2.0.0" - -"@us3r-network/data-model@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@us3r-network/data-model/-/data-model-0.1.0.tgz#ffd2a697615fcc7cee0a70ace4d4e26088075896" - integrity sha512-cEtg+wAYH2iuysdZXlYYYoJaFFuCKqAEww1Db2DZTroxS3+wYa86DffwAA2+j6NFFftUfL/gpkbcias6IYgx2Q== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@composedb/client" "^0.4.3" - "@composedb/types" "^0.4.3" - "@types/react-dom" "^18.0.11" - did-session "^2.0.0" - dids "^4.0.0" - react "^18.2.0" - react-dom "^18.2.0" + "@didtools/pkh-ethereum" "^0.4.1" + "@didtools/pkh-solana" "^0.1.1" + did-session "^2.1.2" -"@us3r-network/data-model@^0.2.1": - version "0.2.1" - resolved "https://registry.npmmirror.com/@us3r-network/data-model/-/data-model-0.2.1.tgz#f66e33a87c9a2da6aa929b70f86bb9e1571a095c" - integrity sha512-wNbvDQ7dAAsdeq9yI/+2DSCWT/ke4X+3bYh78YAECpjpNg9CWrS2v0XI2ADAlTP2uZqZudITCVWtwGWZueLbaQ== - dependencies: - "@ceramicnetwork/common" "^2.24.0" - "@composedb/client" "^0.4.3" - "@composedb/types" "^0.4.3" - did-session "^2.0.0" - dids "^4.0.0" +"@us3r-network/data-model@^0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@us3r-network/data-model/-/data-model-0.7.0.tgz#53c46e933d9b216457724abcaab6c1bd40de259d" + integrity sha512-knwoYSC4A3UZvOyWidEZdQs9vQY27R1tbcxGccSpyCHRd6VeTLCMBBOf9e+Uc4avi40G9CqHBWyFRxYBc6T/QQ== + dependencies: + "@ceramicnetwork/common" "^3.2.0" + "@composedb/client" "^0.6.0" + "@composedb/devtools" "^0.6.1" + "@composedb/types" "^0.6.0" + did-session "^2.1.2" + dids "^4.0.4" -"@us3r-network/profile@^0.4.2": - version "0.4.2" - resolved "https://registry.npmjs.org/@us3r-network/profile/-/profile-0.4.2.tgz#eb98f501729f8dd80f4d46f4522becae5692f54c" - integrity sha512-6jl5sL0cMi6Zz03/pEM2eMyiA2jJG/bTI0tdh5nazuk2lDpP4Q8XzzmgRtbhSQDyP074xe2PBXP6+CXQ9vL9nA== +"@us3r-network/profile@^0.7.0": + version "0.7.0" + resolved "https://registry.npmjs.org/@us3r-network/profile/-/profile-0.7.0.tgz#1764af30a9ba9120e974ef7989f19a1028c0a572" + integrity sha512-YDsCwsit4chbYgf7xCUSzB+ALcEjqFhISsMJckq18pAE/k5NjrT3F6e1F2iCbkXF2fBv+6dyycmPL6P9Wocf9A== dependencies: - "@composedb/devtools" "^0.4.3" - "@composedb/types" "^0.4.3" - "@material-design-icons/svg" "^0.14.7" + "@material-design-icons/svg" "^0.14.13" "@multiavatar/multiavatar" "^1.0.7" - "@us3r-network/data-model" "^0.1.0" - did-session "^2.0.0" + "@us3r-network/data-model" "^0.7.0" lodash.isfunction "^3.0.9" - react-aria "^3.24.0" - react-aria-components "^1.0.0-alpha.3" - styled-components "^5.3.10" + react-aria "^3.31.0" + react-aria-components "^1.0.0" + styled-components "^6.1.1" "@vanilla-extract/css@1.9.1": version "1.9.1" @@ -6744,65 +5715,54 @@ resolved "https://registry.npmjs.org/@vanilla-extract/sprinkles/-/sprinkles-1.5.0.tgz#c921183ae518bb484299c2dc81f2acefd91c3dbe" integrity sha512-W58f2Rzz5lLmk0jbhgStVlZl5wEiPB1Ur3fRvUaBM+MrifZ3qskmFq/CiH//fEYeG5Dh9vF1qRviMMH46cX9Nw== -"@wagmi/chains@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@wagmi/chains/-/chains-1.0.0.tgz#41710941f2c2a699a246c4e3a6112b4efd996171" - integrity sha512-eNbqRWyHbivcMNq5tbXJks4NaOzVLHnNQauHPeE/EDT9AlpqzcrMc+v2T1/2Iw8zN4zgqB86NCsxeJHJs7+xng== - "@wagmi/chains@1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@wagmi/chains/-/chains-1.2.0.tgz#d59eaa70ec51a5fdcd113975926992acfb17ab12" integrity sha512-dmDRipsE54JfyudOBkuhEexqQWcrZqxn/qiujG8SBzMh/az/AH5xlJSA+j1CPWTx9+QofSMF3B7A4gb6XRmSaQ== -"@wagmi/chains@1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@wagmi/chains/-/chains-1.3.0.tgz#a17438d44abe98fdf1ec3a91df115c6bfaed39c0" - integrity sha512-7tyr1irTZQpA4/4HoIiJP3XYZuJIZuWiZ1V1j5WEG3cjm8TXIlMEzO0N+hT/cZKw4/UtF2EukvB8GkDWa2S77w== - -"@wagmi/connectors@2.6.1": - version "2.6.1" - resolved "https://registry.npmjs.org/@wagmi/connectors/-/connectors-2.6.1.tgz#4d8cf7713f96f052dfd0c36daaba13df127b452f" - integrity sha512-8dWFGvJ6XjImIWVjxadblBh7dbCzmgVUpS5ZE3YtQYmwYcVp7W1B4Qh1xdZ5GgDPh2qRKjKdzlel1jZ1DqwScw== +"@wagmi/connectors@3.1.10": + version "3.1.10" + resolved "https://registry.npmjs.org/@wagmi/connectors/-/connectors-3.1.10.tgz#830cd788579ef56a2526574914481f2d3aabc9f7" + integrity sha512-ZLJC1QaeiZarkF07Cr9mOlVjPO1Lf5TBx+JKBms2y5fUIXlKrxCfQgO/gDCureboI+Us2X3IRI659+XacSGpbA== dependencies: "@coinbase/wallet-sdk" "^3.6.6" - "@ledgerhq/connect-kit-loader" "^1.1.0" - "@safe-global/safe-apps-provider" "^0.17.1" - "@safe-global/safe-apps-sdk" "^8.0.0" - "@walletconnect/ethereum-provider" "2.8.4" + "@safe-global/safe-apps-provider" "^0.18.1" + "@safe-global/safe-apps-sdk" "^8.1.0" + "@walletconnect/ethereum-provider" "2.10.6" "@walletconnect/legacy-provider" "^2.0.0" - "@walletconnect/modal" "2.5.4" + "@walletconnect/modal" "2.6.2" + "@walletconnect/utils" "2.10.2" abitype "0.8.7" eventemitter3 "^4.0.7" -"@wagmi/core@1.3.2": - version "1.3.2" - resolved "https://registry.npmjs.org/@wagmi/core/-/core-1.3.2.tgz#895a69d48bffe1cc0da8409df3edbc5b56115c81" - integrity sha512-NBu++pEY8uiSleWwncywNmS4XcMSwG0U2tGiHWm217KQjpuy1jGLT7zQn4tYqeSrMdESTkxCpX4GaWFMKAzp0A== +"@wagmi/core@1.4.12": + version "1.4.12" + resolved "https://registry.npmjs.org/@wagmi/core/-/core-1.4.12.tgz#84558d1af746b2bcef02337dc3c46108242b1dd7" + integrity sha512-bLcYmmGgjtl3jAGo8X3Sm6oUwsdjbVxFMu9SWnwHdE4S9JdYeWM57dEhQgq8SYul2yQ7yY2/gimBf1Or0Ky3dQ== dependencies: - "@wagmi/chains" "1.3.0" - "@wagmi/connectors" "2.6.1" + "@wagmi/connectors" "3.1.10" abitype "0.8.7" eventemitter3 "^4.0.7" zustand "^4.3.1" -"@walletconnect/core@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.8.4.tgz#fc207c8fa35a53e30012b0c85b6ca933cec7d955" - integrity sha512-3CQHud4As0kPRvlW1w/wSWS2F3yXlAo5kSEJyRWLRPqXG+aSCVWM8cVM8ch5yoeyNIfOHhEINdsYMuJG1+yIJQ== +"@walletconnect/core@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/core/-/core-2.10.6.tgz#786b0d2e2045c210c917e29bfa0498bbc210be20" + integrity sha512-Z4vh4ZdfcoQjgPEOxeuF9HUZCVLtV3MgRbS/awLIj/omDrFnOwlBhxi5Syr4Y8muVGC0ocRetQYHae0/gX5crQ== dependencies: "@walletconnect/heartbeat" "1.2.1" "@walletconnect/jsonrpc-provider" "1.0.13" "@walletconnect/jsonrpc-types" "1.0.3" "@walletconnect/jsonrpc-utils" "1.0.8" - "@walletconnect/jsonrpc-ws-connection" "^1.0.11" - "@walletconnect/keyvaluestorage" "^1.0.2" + "@walletconnect/jsonrpc-ws-connection" "1.0.14" + "@walletconnect/keyvaluestorage" "^1.1.1" "@walletconnect/logger" "^2.0.1" "@walletconnect/relay-api" "^1.0.9" "@walletconnect/relay-auth" "^1.0.4" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.8.4" - "@walletconnect/utils" "2.8.4" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" lodash.isequal "4.5.0" uint8arrays "^3.1.0" @@ -6835,19 +5795,20 @@ dependencies: tslib "1.14.1" -"@walletconnect/ethereum-provider@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.8.4.tgz#c627c237b479194efc542b8475596bae12fde52d" - integrity sha512-z7Yz4w8t3eEFv8vQ8DLCgDWPah2aIIyC0iQdwhXgJenQTVuz7JJZRrJUUntzudipHK/owA394c1qTPF0rsMSeQ== +"@walletconnect/ethereum-provider@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/ethereum-provider/-/ethereum-provider-2.10.6.tgz#53720771cc2d6accd452916a853ac927f26acbaa" + integrity sha512-bBQ+yUfxLv8VxNttgNKY7nED35gSVayO/BnLHbNKvyV1gpvSCla5mWB9MsXuQs70MK0g+/qtgRVSrOtdSubaNQ== dependencies: "@walletconnect/jsonrpc-http-connection" "^1.0.7" "@walletconnect/jsonrpc-provider" "^1.0.13" "@walletconnect/jsonrpc-types" "^1.0.3" "@walletconnect/jsonrpc-utils" "^1.0.8" - "@walletconnect/sign-client" "2.8.4" - "@walletconnect/types" "2.8.4" - "@walletconnect/universal-provider" "2.8.4" - "@walletconnect/utils" "2.8.4" + "@walletconnect/modal" "^2.4.3" + "@walletconnect/sign-client" "2.10.6" + "@walletconnect/types" "2.10.6" + "@walletconnect/universal-provider" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" "@walletconnect/events@^1.0.1": @@ -6939,15 +5900,14 @@ "@walletconnect/jsonrpc-types" "^1.0.2" tslib "1.14.1" -"@walletconnect/jsonrpc-ws-connection@^1.0.11": - version "1.0.11" - resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.11.tgz#1ce59d86f273d576ca73385961303ebd44dd923f" - integrity sha512-TiFJ6saasKXD+PwGkm5ZGSw0837nc6EeFmurSPgIT/NofnOV4Tv7CVJqGQN0rQYoJUSYu21cwHNYaFkzNpUN+w== +"@walletconnect/jsonrpc-ws-connection@1.0.14": + version "1.0.14" + resolved "https://registry.npmjs.org/@walletconnect/jsonrpc-ws-connection/-/jsonrpc-ws-connection-1.0.14.tgz#eec700e74766c7887de2bd76c91a0206628732aa" + integrity sha512-Jsl6fC55AYcbkNVkwNM6Jo+ufsuCQRqViOQ8ZBPH9pRREHH9welbBiszuTLqEJiQcO/6XfFDl6bzCJIkrEi8XA== dependencies: "@walletconnect/jsonrpc-utils" "^1.0.6" "@walletconnect/safe-json" "^1.0.2" events "^3.3.0" - tslib "1.14.1" ws "^7.5.1" "@walletconnect/keyvaluestorage@^1.0.2": @@ -6958,6 +5918,15 @@ safe-json-utils "^1.1.1" tslib "1.14.1" +"@walletconnect/keyvaluestorage@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@walletconnect/keyvaluestorage/-/keyvaluestorage-1.1.1.tgz#dd2caddabfbaf80f6b8993a0704d8b83115a1842" + integrity sha512-V7ZQq2+mSxAq7MrRqDxanTzu2RcElfK1PfNYiaVnJgJ7Q7G7hTVwF8voIBx92qsRyGHZihrwNPHuZd1aKkd0rA== + dependencies: + "@walletconnect/safe-json" "^1.0.1" + idb-keyval "^6.2.1" + unstorage "^1.9.0" + "@walletconnect/legacy-client@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@walletconnect/legacy-client/-/legacy-client-2.0.0.tgz#9f2c09694789fd4b6c5d68d6423b44bac55aed30" @@ -7026,31 +5995,30 @@ pino "7.11.0" tslib "1.14.1" -"@walletconnect/modal-core@2.5.4": - version "2.5.4" - resolved "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.5.4.tgz#7d739a90a9cf103067eea46507ea649e8dada436" - integrity sha512-ISe4LqmEDFU7b6rLgonqaEtMXzG6ko13HA7S8Ty3d7GgfAEe29LM1dq3zo8ehEOghhofhj1PiiNfvaogZKzT1g== +"@walletconnect/modal-core@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal-core/-/modal-core-2.6.2.tgz#d73e45d96668764e0c8668ea07a45bb8b81119e9" + integrity sha512-cv8ibvdOJQv2B+nyxP9IIFdxvQznMz8OOr/oR/AaUZym4hjXNL/l1a2UlSQBXrVjo3xxbouMxLb3kBsHoYP2CA== dependencies: - buffer "6.0.3" - valtio "1.10.6" + valtio "1.11.2" -"@walletconnect/modal-ui@2.5.4": - version "2.5.4" - resolved "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.5.4.tgz#0433fb0226dd47e17fede620c5a5ff332baed155" - integrity sha512-5qLLjwbE3YC4AsCVhf8J87otklkApcQ5DCMykOcS0APPv8lKQ46JxpQhfWwRYaUkuIiHonI9h1YxFARDkoaI9g== +"@walletconnect/modal-ui@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal-ui/-/modal-ui-2.6.2.tgz#fa57c087c57b7f76aaae93deab0f84bb68b59cf9" + integrity sha512-rbdstM1HPGvr7jprQkyPggX7rP4XiCG85ZA+zWBEX0dVQg8PpAgRUqpeub4xQKDgY7pY/xLRXSiCVdWGqvG2HA== dependencies: - "@walletconnect/modal-core" "2.5.4" - lit "2.7.5" + "@walletconnect/modal-core" "2.6.2" + lit "2.8.0" motion "10.16.2" qrcode "1.5.3" -"@walletconnect/modal@2.5.4": - version "2.5.4" - resolved "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.5.4.tgz#66659051f9c0f35c151d3a8d940f8c64d42fab74" - integrity sha512-JAKMcCd4JQvSEr7pNitg3OBke4DN1JyaQ7bdi3x4T7oLgOr9Y88qdkeOXko/0aJonDHJsM88hZ10POQWmKfEMA== +"@walletconnect/modal@2.6.2", "@walletconnect/modal@^2.4.3": + version "2.6.2" + resolved "https://registry.npmjs.org/@walletconnect/modal/-/modal-2.6.2.tgz#4b534a836f5039eeb3268b80be7217a94dd12651" + integrity sha512-eFopgKi8AjKf/0U4SemvcYw9zlLpx9njVN8sf6DAkowC2Md0gPU/UNEbH1Wwj407pEKnEds98pKWib1NN1ACoA== dependencies: - "@walletconnect/modal-core" "2.5.4" - "@walletconnect/modal-ui" "2.5.4" + "@walletconnect/modal-core" "2.6.2" + "@walletconnect/modal-ui" "2.6.2" "@walletconnect/randombytes@^1.0.3": version "1.0.3" @@ -7089,19 +6057,19 @@ dependencies: tslib "1.14.1" -"@walletconnect/sign-client@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.8.4.tgz#35e7cfe9442c65d7f667a7c20f1a5ee7e2a6e576" - integrity sha512-eRvWtKBAgzo/rbIkw+rkKco2ulSW8Wor/58UsOBsl9DKr1rIazZd4ZcUdaTjg9q8AT1476IQakCAIuv+1FvJwQ== +"@walletconnect/sign-client@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/sign-client/-/sign-client-2.10.6.tgz#722d2c2844565e2826dce6a6d3a36c9b3ca1ea91" + integrity sha512-EvUWjaZBQu2yKnH5/5F2qzbuiIuUN9ZgrNKgvXkw5z1Dq5RJCks0S9/MFlKH/ZSGqXnLl7uAzBXtoX4sMgbCMA== dependencies: - "@walletconnect/core" "2.8.4" + "@walletconnect/core" "2.10.6" "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" "@walletconnect/jsonrpc-utils" "1.0.8" "@walletconnect/logger" "^2.0.1" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.8.4" - "@walletconnect/utils" "2.8.4" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" "@walletconnect/time@^1.0.2": @@ -7111,10 +6079,10 @@ dependencies: tslib "1.14.1" -"@walletconnect/types@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.8.4.tgz#23fad8593b094c7564d72f179e33b1cac9324a88" - integrity sha512-Fgqe87R7rjMOGSvx28YPLTtXM6jj+oUOorx8cE+jEw2PfpWp5myF21aCdaMBR39h0QHij5H1Z0/W9e7gm4oC1Q== +"@walletconnect/types@2.10.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.10.2.tgz#68e433a29ec2cf42d79d8b50c77bd5c1d91db721" + integrity sha512-luNV+07Wdla4STi9AejseCQY31tzWKQ5a7C3zZZaRK/di+rFaAAb7YW04OP4klE7tw/mJRGPTlekZElmHxO8kQ== dependencies: "@walletconnect/events" "^1.0.1" "@walletconnect/heartbeat" "1.2.1" @@ -7123,25 +6091,57 @@ "@walletconnect/logger" "^2.0.1" events "^3.3.0" -"@walletconnect/universal-provider@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.8.4.tgz#7b62a76a7d99ea41c67374da54aaa4f1b4bc1d03" - integrity sha512-JRpOXKIciRMzd03zZxM1WDsYHo/ZS86zZrZ1aCHW1d45ZLP7SbGPRHzZgBY3xrST26yTvWIlRfTUEYn50fzB1g== +"@walletconnect/types@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/types/-/types-2.10.6.tgz#d9920ed4fd0113e0addbda8e7e73a5176a3163fd" + integrity sha512-WgHfiTG1yakmxheaBRiXhUdEmgxwrvsAdOIWaMf/spvrzVKYh6sHI3oyEEky5qj5jjiMiyQBeB57QamzCotbcQ== + dependencies: + "@walletconnect/events" "^1.0.1" + "@walletconnect/heartbeat" "1.2.1" + "@walletconnect/jsonrpc-types" "1.0.3" + "@walletconnect/keyvaluestorage" "^1.1.1" + "@walletconnect/logger" "^2.0.1" + events "^3.3.0" + +"@walletconnect/universal-provider@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/universal-provider/-/universal-provider-2.10.6.tgz#1a6c42517581f11ce275474bc70d0eb4f1044525" + integrity sha512-CEivusqqoD31BhCTKp08DnrccfGjwD9MFjZs5BNRorDteRFE8zVm9LmP6DSiNJCw82ZajGlZThggLQ/BAATfwA== dependencies: "@walletconnect/jsonrpc-http-connection" "^1.0.7" "@walletconnect/jsonrpc-provider" "1.0.13" "@walletconnect/jsonrpc-types" "^1.0.2" "@walletconnect/jsonrpc-utils" "^1.0.7" "@walletconnect/logger" "^2.0.1" - "@walletconnect/sign-client" "2.8.4" - "@walletconnect/types" "2.8.4" - "@walletconnect/utils" "2.8.4" + "@walletconnect/sign-client" "2.10.6" + "@walletconnect/types" "2.10.6" + "@walletconnect/utils" "2.10.6" events "^3.3.0" -"@walletconnect/utils@2.8.4": - version "2.8.4" - resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.8.4.tgz#8dbd3beaef39388be2398145a5f9a061a0317518" - integrity sha512-NGw6BINYNeT9JrQrnxldAPheO2ymRrwGrgfExZMyrkb1MShnIX4nzo4KirKInM4LtrY6AA/v0Lu3ooUdfO+xIg== +"@walletconnect/utils@2.10.2": + version "2.10.2" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.10.2.tgz#1f2c6a2f1bb95bcc4517b1e94aa7164c9286eb46" + integrity sha512-syxXRpc2yhSknMu3IfiBGobxOY7fLfLTJuw+ppKaeO6WUdZpIit3wfuGOcc0Ms3ZPFCrGfyGOoZsCvgdXtptRg== + dependencies: + "@stablelib/chacha20poly1305" "1.0.1" + "@stablelib/hkdf" "1.0.1" + "@stablelib/random" "^1.0.2" + "@stablelib/sha256" "1.0.1" + "@stablelib/x25519" "^1.0.3" + "@walletconnect/relay-api" "^1.0.9" + "@walletconnect/safe-json" "^1.0.2" + "@walletconnect/time" "^1.0.2" + "@walletconnect/types" "2.10.2" + "@walletconnect/window-getters" "^1.0.1" + "@walletconnect/window-metadata" "^1.0.1" + detect-browser "5.3.0" + query-string "7.1.3" + uint8arrays "^3.1.0" + +"@walletconnect/utils@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@walletconnect/utils/-/utils-2.10.6.tgz#749b37d14e291e346862e7027ec7548463350226" + integrity sha512-oRsWWhN2+hi3aiDXrQEOfysz6FHQJGXLsNQPVt+WIBJplO6Szmdau9dbleD88u1iiT4GKPqE0R9FOYvvPm1H/w== dependencies: "@stablelib/chacha20poly1305" "1.0.1" "@stablelib/hkdf" "1.0.1" @@ -7151,7 +6151,7 @@ "@walletconnect/relay-api" "^1.0.9" "@walletconnect/safe-json" "^1.0.2" "@walletconnect/time" "^1.0.2" - "@walletconnect/types" "2.8.4" + "@walletconnect/types" "2.10.6" "@walletconnect/window-getters" "^1.0.1" "@walletconnect/window-metadata" "^1.0.1" detect-browser "5.3.0" @@ -7359,6 +6359,11 @@ abitype@0.8.7: resolved "https://registry.npmjs.org/abitype/-/abitype-0.8.7.tgz#e4b3f051febd08111f486c0cc6a98fa72d033622" integrity sha512-wQ7hV8Yg/yKmGyFpqrNZufCxbszDe5es4AZGYPBitocfSqXtjrTG9JMWFcc4N30ukl2ve48aBTwt7NJxVQdU3w== +abitype@0.9.8: + version "0.9.8" + resolved "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz#1f120b6b717459deafd213dfbf3a3dd1bf10ae8c" + integrity sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -7421,6 +6426,11 @@ acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8 resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.10.0: + version "8.11.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + address@^1.0.1, address@^1.1.2: version "1.2.2" resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" @@ -7555,7 +6565,7 @@ ansicolors@~0.3.2: resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== -anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -7568,6 +6578,11 @@ apg-js@^4.1.3: resolved "https://registry.npmjs.org/apg-js/-/apg-js-4.1.3.tgz#0cb9dc99f8830740d7a8f9fc0048fa618ae4d199" integrity sha512-XYyDcoBho8OpnWPRnedMwyL+76ovCtsESerHZEfY39dO4IrEqN97mdEYkOyHa0XTX5+3+U5FmpqPLttK0f7n6g== +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + arg@^4.1.0: version "4.1.3" resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -7768,10 +6783,10 @@ axe-core@^4.6.2: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz#fc0db6fdb65cc7a80ccf85286d91d64ababa3ece" integrity sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg== -axios@^1.2.6: - version "1.3.4" - resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" - integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== +axios@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" + integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -8000,6 +7015,11 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== +bignumber.js@*: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -8329,15 +7349,6 @@ canonicalize@^2.0.0: resolved "https://registry.npmmirror.com/canonicalize/-/canonicalize-2.0.0.tgz#32be2cef4446d67fd5348027a384cae28f17226a" integrity sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w== -capital-case@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" - integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - cardinal@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" @@ -8401,23 +7412,10 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -change-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" - integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== - dependencies: - camel-case "^4.1.2" - capital-case "^1.0.4" - constant-case "^3.0.4" - dot-case "^3.0.4" - header-case "^2.0.4" - no-case "^3.0.4" - param-case "^3.0.4" - pascal-case "^3.1.2" - path-case "^3.0.4" - sentence-case "^3.0.4" - snake-case "^3.0.4" - tslib "^2.0.3" +change-case@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/change-case/-/change-case-5.3.0.tgz#b2fc5a8bea0cf8b4856a5a9aaf79abd8ea5309f6" + integrity sha512-Eykca0fGS/xYlx2fG5NqnGSnsWauhSGiSXYhB1kO6E909GUfo8S54u4UZNS7lMJmgZumZ2SUpWaoLgAcfQRICg== char-regex@^1.0.2: version "1.0.2" @@ -8467,6 +7465,13 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +citty@^0.1.4, citty@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" + integrity sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ== + dependencies: + consola "^3.2.3" + cjs-module-lexer@^1.0.0: version "1.2.2" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" @@ -8498,6 +7503,15 @@ cli-progress@^3.12.0: dependencies: string-width "^4.2.3" +clipboardy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== + dependencies: + arch "^2.2.0" + execa "^5.1.1" + is-wsl "^2.2.0" + cliui@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -8535,6 +7549,16 @@ clsx@^1.1.0, clsx@^1.1.1, clsx@^1.2.1: resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +cluster-key-slot@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -8687,20 +7711,16 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + console-browserify@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -constant-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" - integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case "^2.0.2" - constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -8723,6 +7743,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +cookie-es@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cookie-es/-/cookie-es-1.0.0.tgz#4759684af168dfc54365b2c2dda0a8d7ee1e4865" + integrity sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -8845,6 +7870,13 @@ cross-fetch@^3.1.4, cross-fetch@^3.1.5: dependencies: node-fetch "2.6.7" +cross-inspect@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.0.tgz#5fda1af759a148594d2d58394a9e21364f6849af" + integrity sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ== + dependencies: + tslib "^2.4.0" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -8968,7 +8000,7 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" -css-to-react-native@^3.0.0: +css-to-react-native@^3.0.0, css-to-react-native@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== @@ -9106,6 +8138,11 @@ csstype@^3.0.2, csstype@^3.0.7: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +csstype@^3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: version "3.2.3" resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" @@ -9326,6 +8363,11 @@ defined@^1.0.0: resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== +defu@^6.1.2, defu@^6.1.3: + version "6.1.3" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" + integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== + delay@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" @@ -9336,6 +8378,11 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +denque@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" + integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== + depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -9354,6 +8401,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destr@^2.0.1, destr@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/destr/-/destr-2.0.2.tgz#8d3c0ee4ec0a76df54bc8b819bca215592a8c218" + integrity sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -9364,6 +8416,11 @@ detect-browser@5.3.0, detect-browser@^5.3.0: resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== +detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -9433,17 +8490,18 @@ did-resolver@^4.0.0, did-resolver@^4.0.1, did-resolver@^4.1.0: resolved "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz#740852083c4fd5bf9729d528eca5d105aff45eb6" integrity sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA== -did-session@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/did-session/-/did-session-2.0.0.tgz#b2f712e61302494c52bd8a1e05cb84a5b9b0ffdf" - integrity sha512-MxCCg+g0NyJOL7086VUgxDhcRv5vYOXiWaTCbuClCVbTz5H8LS+JzhGvURDLTGQhZGC6FyGb5kCenwWq7YNKQQ== +did-session@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/did-session/-/did-session-2.1.2.tgz#563576b581fe31b6d01234b8b7603afd2926003e" + integrity sha512-6tMGZ6Q4gRJYjH5bocwL4Te55UF0MIA+fNOaEAhK0Xbq4PAYxCnL1e0zhe4jwSbTqU8ilaoUoE2r6McAFZTDMQ== dependencies: - "@ceramicnetwork/stream-tile" "^2.16.0" + "@didtools/key-webcrypto" "^0.1.2" "@stablelib/random" "^1.0.1" - dids "^4.0.0" - key-did-provider-ed25519 "^3.0.0" + caip "^1.1.0" + dids "^4.0.3" + key-did-provider-ed25519 "^3.0.1" key-did-resolver "^3.0.0" - uint8arrays "^4.0.3" + uint8arrays "^4.0.9" dids@^4.0.0: version "4.0.0" @@ -9460,7 +8518,7 @@ dids@^4.0.0: rpc-utils "^0.6.1" uint8arrays "^4.0.3" -dids@^4.0.4: +dids@^4.0.3, dids@^4.0.4: version "4.0.4" resolved "https://registry.npmmirror.com/dids/-/dids-4.0.4.tgz#b84e10f0d41554c91cfe9f06f731bfc1f70cfe60" integrity sha512-PKxQP0QFqgeMe0dbL7LCRdPJVhZU2ejj8RWCfJ6vro3a+o5o32cWNM1X6YXpdIWq6G5fTJw9KO2dHj2ZzYDc7w== @@ -10295,7 +9353,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -10760,6 +9818,11 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port-please@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.1.tgz#2556623cddb4801d823c0a6a15eec038abb483be" + integrity sha512-3UBAyM3u4ZBVYDsxOQfJDxEa6XTbpBDrOjp4mf7ExFRt5BKs/QywQQiJsh2B+hxcZLSapWqCRvElUe8DnKcFHA== + get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -10997,17 +10060,10 @@ graphql-relay@^0.10.0: resolved "https://registry.npmjs.org/graphql-relay/-/graphql-relay-0.10.0.tgz#3b661432edf1cb414cd4a132cf595350e524db2b" integrity sha512-44yBuw2/DLNEiMypbNZBt1yMDbBmyVPVesPywnteGGALiBmdyy1JP8jSg8ClLePg8ZZxk0O4BLhd1a6U/1jDOQ== -graphql-scalars@^1.20.1: - version "1.21.3" - resolved "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.21.3.tgz#21eb0b9349cc94ae62b40f40ebe87220d3a5f1b1" - integrity sha512-QLWw3BHmqHZMp9JeYmPpjq7JT9aw/H8TpwmWKJEuMSE3+O7Xe7TduQbOLFzbs1q9UxX6CVkc0O1JO/YfkP/pAw== - dependencies: - tslib "^2.5.0" - -graphql-scalars@^1.22.2: - version "1.22.2" - resolved "https://registry.npmmirror.com/graphql-scalars/-/graphql-scalars-1.22.2.tgz#6326e6fe2d0ad4228a9fea72a977e2bf26b86362" - integrity sha512-my9FB4GtghqXqi/lWSVAOPiTzTnnEzdOXCsAC2bb5V7EFNQjVjwy3cSSbUvgYOtDuDibd+ZsCDhz+4eykYOlhQ== +graphql-scalars@^1.22.4: + version "1.22.4" + resolved "https://registry.npmjs.org/graphql-scalars/-/graphql-scalars-1.22.4.tgz#af092b142bcfd5c1f8c53cb70ee1955ecd4ddb03" + integrity sha512-ILnv7jq5VKHLUyoaTFX7lgYrjCd6vTee9i8/B+D4zJKJT5TguOl0KkpPEbXHjmeor8AZYrVsrYUHdqRBMX1pjA== dependencies: tslib "^2.5.0" @@ -11021,14 +10077,9 @@ graphql@15.4.0: resolved "https://registry.npmjs.org/graphql/-/graphql-15.4.0.tgz#e459dea1150da5a106486ba7276518b5295a4347" integrity sha512-EB3zgGchcabbsU9cFe1j+yxdzKQKAbGUWRb13DsrsMN1yyfmmIq+2+L5MqVWcDCE4V89R5AyUOi7sMOGxdsYtA== -graphql@^16.5.0: - version "16.6.0" - resolved "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" - integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== - -graphql@^16.8.0: +graphql@^16.8.1: version "16.8.1" - resolved "https://registry.npmmirror.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" + resolved "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== gzip-size@^6.0.0: @@ -11038,6 +10089,20 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +h3@^1.8.1, h3@^1.8.2: + version "1.9.0" + resolved "https://registry.npmjs.org/h3/-/h3-1.9.0.tgz#c5f512a93026df9837db6f30c9ef51135dd46752" + integrity sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA== + dependencies: + cookie-es "^1.0.0" + defu "^6.1.3" + destr "^2.0.2" + iron-webcrypto "^1.0.0" + radix3 "^1.1.0" + ufo "^1.3.2" + uncrypto "^0.1.3" + unenv "^1.7.4" + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -11116,14 +10181,6 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -header-case@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" - integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== - dependencies: - capital-case "^1.0.4" - tslib "^2.0.3" - hey-listen@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" @@ -11276,6 +10333,11 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-shutdown@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz#41bc78fc767637c4c95179bc492f312c0ae64c5f" + integrity sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw== + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -11306,6 +10368,15 @@ hyperlinker@^1.0.0: resolved "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== +i18n-js@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/i18n-js/-/i18n-js-4.3.2.tgz#ec5391f23c76f5374b53645c83d272914eb81291" + integrity sha512-n8gbEbQEueym2/q2yrZk5/xKWjFcKtg3/Escw4JHSVWa8qtKqP8j7se3UjkRbHlO/REqFA0V/MG1q8tEfyHeOA== + dependencies: + bignumber.js "*" + lodash "*" + make-plural "*" + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -11325,6 +10396,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +idb-keyval@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33" + integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg== + idb@^7.0.1: version "7.1.1" resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz#d910ded866d32c7ced9befc5bfdf36f572ced72b" @@ -11432,6 +10508,21 @@ invariant@^2.2.4: dependencies: loose-envify "^1.0.0" +ioredis@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz#9139f596f62fc9c72d873353ac5395bcf05709f7" + integrity sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA== + dependencies: + "@ioredis/commands" "^1.1.1" + cluster-key-slot "^1.1.0" + debug "^4.3.4" + denque "^2.1.0" + lodash.defaults "^4.2.0" + lodash.isarguments "^3.1.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.1.0" + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -11442,6 +10533,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== +iron-webcrypto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.0.0.tgz#e3b689c0c61b434a0a4cb82d0aeabbc8b672a867" + integrity sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg== + is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -11728,6 +10824,11 @@ isomorphic-ws@^4.0.1: resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +isows@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz#93c1cf0575daf56e7120bab5c8c448b0809d0d74" + integrity sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -12350,6 +11451,11 @@ jiti@1.17.1: resolved "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz#264daa43ee89a03e8be28c3d712ccc4eb9f1e8ed" integrity sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw== +jiti@^1.20.0: + version "1.21.0" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" @@ -12493,6 +11599,11 @@ json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -12538,14 +11649,14 @@ keccak@^3.0.1: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -key-did-provider-ed25519@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/key-did-provider-ed25519/-/key-did-provider-ed25519-3.0.0.tgz#7ab97249280baba699f92273a9768d533bfea3c4" - integrity sha512-cY2vjJZ16VZ7IZUDj15ldhxPFJlP2UjniUUv1NO8FptUOWSJUnOyzK68ipSIaHxsGvETjHKlfIJ0dGb0ernkSA== +key-did-provider-ed25519@^3.0.1, key-did-provider-ed25519@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/key-did-provider-ed25519/-/key-did-provider-ed25519-3.0.2.tgz#5c336954680db2ae03e9d4a25cdbde30b72062b5" + integrity sha512-4Yw0CeO1hKRaUsh9NIz4tn4Ysr09CdoJItyT0vHjd5iedJ+FvVt7pTbNr7IY0/+8mWvYslutAK5LFrwu5agpsA== dependencies: - "@stablelib/ed25519" "^1.0.2" - did-jwt "^6.11.1" - dids "^4.0.0" + "@noble/curves" "^1.1.0" + did-jwt "^7.2.0" + dids "^4.0.4" fast-json-stable-stringify "^2.1.0" rpc-utils "^0.6.2" uint8arrays "^4.0.3" @@ -12640,6 +11751,29 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" +listhen@^1.5.5: + version "1.5.5" + resolved "https://registry.npmjs.org/listhen/-/listhen-1.5.5.tgz#58915512af70f770aa3e9fb19367adf479bb58c4" + integrity sha512-LXe8Xlyh3gnxdv4tSjTjscD1vpr/2PRpzq8YIaMJgyKzRG8wdISlWVWnGThJfHnlJ6hmLt2wq1yeeix0TEbuoA== + dependencies: + "@parcel/watcher" "^2.3.0" + "@parcel/watcher-wasm" "2.3.0" + citty "^0.1.4" + clipboardy "^3.0.0" + consola "^3.2.3" + defu "^6.1.2" + get-port-please "^3.1.1" + h3 "^1.8.1" + http-shutdown "^1.2.2" + jiti "^1.20.0" + mlly "^1.4.2" + node-forge "^1.3.1" + pathe "^1.1.1" + std-env "^3.4.3" + ufo "^1.3.0" + untun "^0.1.2" + uqr "^0.1.2" + lit-element@^3.3.0: version "3.3.1" resolved "https://registry.npmjs.org/lit-element/-/lit-element-3.3.1.tgz#9dcb950b1fadf156dacf3ded8d7d51a8cf16a966" @@ -12656,14 +11790,21 @@ lit-html@^2.7.0: dependencies: "@types/trusted-types" "^2.0.2" -lit@2.7.5: - version "2.7.5" - resolved "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz#60bc82990cfad169d42cd786999356dcf79b035f" - integrity sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ== +lit-html@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz#96456a4bb4ee717b9a7d2f94562a16509d39bffa" + integrity sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q== + dependencies: + "@types/trusted-types" "^2.0.2" + +lit@2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz#4d838ae03059bf9cafa06e5c61d8acc0081e974e" + integrity sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA== dependencies: "@lit/reactive-element" "^1.6.0" lit-element "^3.3.0" - lit-html "^2.7.0" + lit-html "^2.8.0" loader-runner@^4.2.0: version "4.3.0" @@ -12721,6 +11862,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.isarguments@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg== + lodash.isequal@4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -12751,7 +11902,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== -lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@*, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -12778,6 +11929,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.0.2: + version "10.1.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -12816,6 +11972,11 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-plural@*: + version "7.3.0" + resolved "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz#2889dbafca2fb097037c47967d3e3afa7e48a52c" + integrity sha512-/K3BC0KIsO+WK2i94LkMPv3wslMrazrQhfi5We9fMbLlLjzoOSJWr7TAdupLlDWaJcWxwoNosBkhFDejiu5VDw== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -12940,6 +12101,11 @@ mime@1.6.0: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -13000,6 +12166,16 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" +mlly@^1.2.0, mlly@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e" + integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg== + dependencies: + acorn "^8.10.0" + pathe "^1.1.1" + pkg-types "^1.0.3" + ufo "^1.3.0" + monaco-editor@^0.36.1: version "0.36.1" resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.36.1.tgz#aad528c815605307473a1634612946921d8079b5" @@ -13017,6 +12193,11 @@ motion@10.16.2: "@motionone/utils" "^10.15.1" "@motionone/vue" "^10.16.2" +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" @@ -13037,13 +12218,6 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multibase@^4.0.1: - version "4.0.6" - resolved "https://registry.npmjs.org/multibase/-/multibase-4.0.6.tgz#6e624341483d6123ca1ede956208cb821b440559" - integrity sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ== - dependencies: - "@multiformats/base-x" "^4.0.1" - multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -13057,11 +12231,16 @@ multiformats@^11.0.0, multiformats@^11.0.1, multiformats@^11.0.2: resolved "https://registry.npmjs.org/multiformats/-/multiformats-11.0.2.tgz#b14735efc42cd8581e73895e66bebb9752151b60" integrity sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg== -multiformats@^12.0.0, multiformats@^12.0.1, multiformats@^12.1.0: +multiformats@^12.0.0, multiformats@^12.0.1: version "12.1.1" resolved "https://registry.npmmirror.com/multiformats/-/multiformats-12.1.1.tgz#bebd4e121ccdb7e9b2f2db407f839fc9e963a3b7" integrity sha512-GBSToTmri2vJYs8wqcZQ8kB21dCaeTOzHTIAlr8J06C1eL6UbzqURXFZ5Fl0EYm9GAFz1IlYY8SxGOs9G9NJRg== +multiformats@^12.1.3: + version "12.1.3" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-12.1.3.tgz#cbf7a9861e11e74f8228b21376088cb43ba8754e" + integrity sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw== + multiformats@^9.4.2, multiformats@^9.5.4, multiformats@^9.6.5: version "9.9.0" resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" @@ -13075,20 +12254,21 @@ multihashes-sync@^1.1.1: "@noble/hashes" "^1.3.0" multiformats "^11.0.0" -multihashes@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/multihashes/-/multihashes-4.0.3.tgz#426610539cd2551edbf533adeac4c06b3b90fb05" - integrity sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA== - dependencies: - multibase "^4.0.1" - uint8arrays "^3.0.0" - varint "^5.0.2" - nanoid@^3.3.1, nanoid@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-wasm@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/napi-wasm/-/napi-wasm-1.1.0.tgz#bbe617823765ae9c1bc12ff5942370eae7b2ba4e" + integrity sha512-lHwIAJbmLSjF9VDRm9GoVOy9AGp3aIvkjv+Kvz9h16QR3uSVYH78PNQUnT2U4X53mhlnV2M7wrhibQ3GHicDmg== + natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -13140,6 +12320,16 @@ node-addon-api@^2.0.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz#8136add2f510997b3b94814f4af1cce0b0e3962e" + integrity sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA== + +node-fetch-native@^1.4.0, node-fetch-native@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.1.tgz#5a336e55b4e1b1e72b9927da09fecd2b374c9be5" + integrity sha512-NsXBU0UgBxo2rQLOeWNZqS3fvflWePMECr8CoSWoSTqCqGbVVsvl9vZu1HfQicYN0g5piV9Gh8RTEvo/uP752w== + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -13154,7 +12344,7 @@ node-fetch@^2.6.1, node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -node-forge@^1: +node-forge@^1, node-forge@^1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== @@ -13358,6 +12548,15 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +ofetch@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz#588cb806a28e5c66c2c47dd8994f9059a036d8c0" + integrity sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg== + dependencies: + destr "^2.0.1" + node-fetch-native "^1.4.0" + ufo "^1.3.0" + on-exit-leak-free@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz#b39c9e3bf7690d890f4861558b0d7b90a442d209" @@ -13557,14 +12756,6 @@ path-browserify@^1.0.1: resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" - integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -13605,6 +12796,11 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.0, pathe@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" + integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -13693,6 +12889,15 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +pkg-types@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.2.0" + pathe "^1.1.0" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -14262,6 +13467,15 @@ postcss@^8.0.9, postcss@^8.3.5, postcss@^8.4.19, postcss@^8.4.4: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.31: + version "8.4.32" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact@^10.12.0, preact@^10.5.9: version "10.13.2" resolved "https://registry.npmjs.org/preact/-/preact-10.13.2.tgz#2c40c73d57248b57234c4ae6cd9ab9d8186ebc0a" @@ -14523,6 +13737,11 @@ quick-lru@^5.1.1: resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +radix3@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/radix3/-/radix3-1.1.0.tgz#9745df67a49c522e94a33d0a93cf743f104b6e0d" + integrity sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A== + raf@^3.4.1: version "3.4.1" resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -14577,124 +13796,69 @@ react-app-polyfill@^3.0.0: regenerator-runtime "^0.13.9" whatwg-fetch "^3.6.2" -react-aria-components@^1.0.0-alpha.3: - version "1.0.0-alpha.3" - resolved "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.0.0-alpha.3.tgz#c891ecb04c22ae60dcd719833c41364e5b62c09b" - integrity sha512-rhakTyOPsTwk/ylCCcK38/y3yN2SXPWN2wPknNwDQ9wE+P/PQWIrc3WxOlhTFGltLC1/KXAAIvJrkPgPBFTE1g== - dependencies: - "@internationalized/date" "^3.2.0" - "@react-aria/focus" "^3.12.0" - "@react-aria/utils" "^3.16.0" - "@react-stately/table" "^3.9.0" - "@react-types/grid" "^3.1.7" - "@react-types/shared" "^3.18.0" - "@react-types/table" "^3.6.0" - "@swc/helpers" "^0.4.14" - react-aria "^3.24.0" - react-stately "^3.22.0" - use-sync-external-store "^1.2.0" - -react-aria-components@^1.0.0-alpha.5: - version "1.0.0-beta.0" - resolved "https://registry.npmmirror.com/react-aria-components/-/react-aria-components-1.0.0-beta.0.tgz#4e558c128aeb095e1570a2320b1ce6f85f9f0c5d" - integrity sha512-G5GaWM0igl8nF1lyYBNAMVT9Gl8UzSPktZgdP0R/4f8bOcX+cZQqJPAISlucKIx6nTXuEc1u0YTpvaqkGNluIw== - dependencies: - "@internationalized/date" "^3.5.0" - "@react-aria/focus" "^3.14.1" - "@react-aria/interactions" "^3.18.0" - "@react-aria/utils" "^3.20.0" - "@react-stately/table" "^3.11.1" - "@react-types/calendar" "^3.4.0" - "@react-types/grid" "^3.2.1" - "@react-types/shared" "^3.20.0" - "@react-types/table" "^3.8.1" +react-aria-components@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.0.0.tgz#3e88a805263156e7fd551ec3f0336d75c59b2824" + integrity sha512-Oyud2UcOXNPcvYn71he0FLIzpaJcLA+hu7i4wR/EKv+9Q/jOUGb++meKPB9vDBCFwGgWaoK7WpHJ2wB9xjLfGw== + dependencies: + "@internationalized/date" "^3.5.1" + "@internationalized/string" "^3.2.0" + "@react-aria/focus" "^3.16.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/toolbar" "3.0.0-beta.1" + "@react-aria/utils" "^3.23.0" + "@react-stately/table" "^3.11.4" + "@react-types/form" "^3.7.0" + "@react-types/grid" "^3.2.3" + "@react-types/shared" "^3.22.0" + "@react-types/table" "^3.9.2" "@swc/helpers" "^0.5.0" - react-aria "^3.28.0" - react-stately "^3.26.0" + react-aria "^3.31.0" + react-stately "^3.29.0" use-sync-external-store "^1.2.0" -react-aria@^3.24.0: - version "3.24.0" - resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.24.0.tgz#3d7f89c6c4809b20007137dca4242ac8f24d2097" - integrity sha512-uqqUOTlRVbOTsbCMr2+SVgRg4345LYBnpBXpLZnYwhlDwDK+w7qXf+AO0cUty6fD3jYw0FmCp0PhyF1bfk1MGg== - dependencies: - "@react-aria/breadcrumbs" "^3.5.1" - "@react-aria/button" "^3.7.1" - "@react-aria/calendar" "^3.2.0" - "@react-aria/checkbox" "^3.9.0" - "@react-aria/combobox" "^3.6.0" - "@react-aria/datepicker" "^3.4.0" - "@react-aria/dialog" "^3.5.1" - "@react-aria/dnd" "^3.2.0" - "@react-aria/focus" "^3.12.0" - "@react-aria/gridlist" "^3.3.0" - "@react-aria/i18n" "^3.7.1" - "@react-aria/interactions" "^3.15.0" - "@react-aria/label" "^3.5.1" - "@react-aria/link" "^3.5.0" - "@react-aria/listbox" "^3.9.0" - "@react-aria/menu" "^3.9.0" - "@react-aria/meter" "^3.4.1" - "@react-aria/numberfield" "^3.5.0" - "@react-aria/overlays" "^3.14.0" - "@react-aria/progress" "^3.4.1" - "@react-aria/radio" "^3.6.0" - "@react-aria/searchfield" "^3.5.1" - "@react-aria/select" "^3.10.0" - "@react-aria/selection" "^3.14.0" - "@react-aria/separator" "^3.3.1" - "@react-aria/slider" "^3.4.0" - "@react-aria/ssr" "^3.6.0" - "@react-aria/switch" "^3.5.0" - "@react-aria/table" "^3.9.0" - "@react-aria/tabs" "^3.5.0" - "@react-aria/textfield" "^3.9.1" - "@react-aria/tooltip" "^3.5.0" - "@react-aria/utils" "^3.16.0" - "@react-aria/visually-hidden" "^3.8.0" - "@react-types/shared" "^3.18.0" - -react-aria@^3.28.0: - version "3.28.0" - resolved "https://registry.npmmirror.com/react-aria/-/react-aria-3.28.0.tgz#e1d1a2fd0b48cad785fdcd469ffd18576f13dc91" - integrity sha512-M0R12U5X83zktim4V/4le7KEV4REu25yDr6zOwRFOTXwILLxYsmWnaajX7ye5da84tl4kDjYoJIKJWVNvhjNoA== - dependencies: - "@react-aria/breadcrumbs" "^3.5.5" - "@react-aria/button" "^3.8.2" - "@react-aria/calendar" "^3.5.0" - "@react-aria/checkbox" "^3.11.0" - "@react-aria/combobox" "^3.6.4" - "@react-aria/datepicker" "^3.7.0" - "@react-aria/dialog" "^3.5.5" - "@react-aria/dnd" "^3.4.1" - "@react-aria/focus" "^3.14.1" - "@react-aria/gridlist" "^3.6.0" - "@react-aria/i18n" "^3.8.2" - "@react-aria/interactions" "^3.18.0" - "@react-aria/label" "^3.7.0" - "@react-aria/link" "^3.5.4" - "@react-aria/listbox" "^3.10.2" - "@react-aria/menu" "^3.10.2" - "@react-aria/meter" "^3.4.5" - "@react-aria/numberfield" "^3.8.0" - "@react-aria/overlays" "^3.17.0" - "@react-aria/progress" "^3.4.5" - "@react-aria/radio" "^3.8.0" - "@react-aria/searchfield" "^3.5.5" - "@react-aria/select" "^3.12.1" - "@react-aria/selection" "^3.16.2" - "@react-aria/separator" "^3.3.5" - "@react-aria/slider" "^3.7.0" - "@react-aria/ssr" "^3.8.0" - "@react-aria/switch" "^3.5.4" - "@react-aria/table" "^3.12.0" - "@react-aria/tabs" "^3.7.0" - "@react-aria/tag" "^3.1.2" - "@react-aria/textfield" "^3.12.0" - "@react-aria/tooltip" "^3.6.2" - "@react-aria/utils" "^3.20.0" - "@react-aria/visually-hidden" "^3.8.4" - "@react-types/shared" "^3.20.0" +react-aria@^3.31.0: + version "3.31.0" + resolved "https://registry.npmjs.org/react-aria/-/react-aria-3.31.0.tgz#5021f93e6f03b80b269a5c6d0f2949dd33aa9260" + integrity sha512-fdmiEhopCq4TIP0BMMsDh92RMfGzVyNaSPdYLs5qqhDlVmaVL3NqWcK8RVstgI13ST/DIM+h9jgtp8+X1EDHMw== + dependencies: + "@internationalized/string" "^3.2.0" + "@react-aria/breadcrumbs" "^3.5.9" + "@react-aria/button" "^3.9.1" + "@react-aria/calendar" "^3.5.4" + "@react-aria/checkbox" "^3.13.0" + "@react-aria/combobox" "^3.8.1" + "@react-aria/datepicker" "^3.9.1" + "@react-aria/dialog" "^3.5.9" + "@react-aria/dnd" "^3.5.1" + "@react-aria/focus" "^3.16.0" + "@react-aria/gridlist" "^3.7.3" + "@react-aria/i18n" "^3.10.0" + "@react-aria/interactions" "^3.20.1" + "@react-aria/label" "^3.7.4" + "@react-aria/link" "^3.6.3" + "@react-aria/listbox" "^3.11.3" + "@react-aria/menu" "^3.12.0" + "@react-aria/meter" "^3.4.9" + "@react-aria/numberfield" "^3.10.1" + "@react-aria/overlays" "^3.20.0" + "@react-aria/progress" "^3.4.9" + "@react-aria/radio" "^3.10.0" + "@react-aria/searchfield" "^3.7.0" + "@react-aria/select" "^3.14.1" + "@react-aria/selection" "^3.17.3" + "@react-aria/separator" "^3.3.9" + "@react-aria/slider" "^3.7.4" + "@react-aria/ssr" "^3.9.1" + "@react-aria/switch" "^3.6.0" + "@react-aria/table" "^3.13.3" + "@react-aria/tabs" "^3.8.3" + "@react-aria/tag" "^3.3.1" + "@react-aria/textfield" "^3.14.0" + "@react-aria/tooltip" "^3.7.0" + "@react-aria/utils" "^3.23.0" + "@react-aria/visually-hidden" "^3.8.8" + "@react-types/shared" "^3.22.0" react-clientside-effect@^1.2.6: version "1.2.6" @@ -14931,61 +14095,34 @@ react-smooth@^2.0.2: fast-equals "^4.0.3" react-transition-group "2.9.0" -react-stately@^3.22.0: - version "3.22.0" - resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.22.0.tgz#c72c82401b7db5815f9906a742a0883839a65363" - integrity sha512-w5itlPtjfUpxy+195LxRbaCNaGN1NVfPHelhYXuoPoKNgUvmy54uKXvP1Ek1ETZ9e55BaXuMs83yXv94wIMdpQ== - dependencies: - "@react-stately/calendar" "^3.2.0" - "@react-stately/checkbox" "^3.4.1" - "@react-stately/collections" "^3.7.0" - "@react-stately/combobox" "^3.5.0" - "@react-stately/data" "^3.9.1" - "@react-stately/datepicker" "^3.4.0" - "@react-stately/dnd" "^3.2.0" - "@react-stately/list" "^3.8.0" - "@react-stately/menu" "^3.5.1" - "@react-stately/numberfield" "^3.4.1" - "@react-stately/overlays" "^3.5.1" - "@react-stately/radio" "^3.8.0" - "@react-stately/searchfield" "^3.4.1" - "@react-stately/select" "^3.5.0" - "@react-stately/selection" "^3.13.0" - "@react-stately/slider" "^3.3.1" - "@react-stately/table" "^3.9.0" - "@react-stately/tabs" "^3.4.0" - "@react-stately/toggle" "^3.5.1" - "@react-stately/tooltip" "^3.4.0" - "@react-stately/tree" "^3.6.0" - "@react-types/shared" "^3.18.0" - -react-stately@^3.26.0: - version "3.26.0" - resolved "https://registry.npmmirror.com/react-stately/-/react-stately-3.26.0.tgz#4e36c239c216d9bdb3135da7663daf444ca21806" - integrity sha512-+1wWsdBc88rRFNXhzbD7RoT13IWzb2Q5j0HM//sS22gDHrUpwh9QpxX9aYf4qepZ1uuvCf6UeMFODCORiu8lcQ== - dependencies: - "@react-stately/calendar" "^3.4.0" - "@react-stately/checkbox" "^3.5.0" - "@react-stately/collections" "^3.10.1" - "@react-stately/combobox" "^3.7.0" - "@react-stately/data" "^3.10.2" - "@react-stately/datepicker" "^3.7.0" - "@react-stately/dnd" "^3.2.4" - "@react-stately/list" "^3.9.2" - "@react-stately/menu" "^3.5.5" - "@react-stately/numberfield" "^3.6.1" - "@react-stately/overlays" "^3.6.2" - "@react-stately/radio" "^3.9.0" - "@react-stately/searchfield" "^3.4.5" - "@react-stately/select" "^3.5.4" - "@react-stately/selection" "^3.13.4" - "@react-stately/slider" "^3.4.2" - "@react-stately/table" "^3.11.1" - "@react-stately/tabs" "^3.6.0" - "@react-stately/toggle" "^3.6.2" - "@react-stately/tooltip" "^3.4.4" - "@react-stately/tree" "^3.7.2" - "@react-types/shared" "^3.20.0" +react-stately@^3.29.0: + version "3.29.0" + resolved "https://registry.npmjs.org/react-stately/-/react-stately-3.29.0.tgz#c082dce029cb8702f543c6a64343b1fd2956ee46" + integrity sha512-JWPgEg2RxDtSmMkypsBLuhsuiaMDfJcnFw96oDRg8lAGqkslZmbmYH/O1Wz08k2W6P3Bds4rZz6iK91XMNXomA== + dependencies: + "@react-stately/calendar" "^3.4.3" + "@react-stately/checkbox" "^3.6.1" + "@react-stately/collections" "^3.10.4" + "@react-stately/combobox" "^3.8.1" + "@react-stately/data" "^3.11.0" + "@react-stately/datepicker" "^3.9.1" + "@react-stately/dnd" "^3.2.7" + "@react-stately/form" "^3.0.0" + "@react-stately/list" "^3.10.2" + "@react-stately/menu" "^3.6.0" + "@react-stately/numberfield" "^3.8.0" + "@react-stately/overlays" "^3.6.4" + "@react-stately/radio" "^3.10.1" + "@react-stately/searchfield" "^3.5.0" + "@react-stately/select" "^3.6.1" + "@react-stately/selection" "^3.14.2" + "@react-stately/slider" "^3.5.0" + "@react-stately/table" "^3.11.4" + "@react-stately/tabs" "^3.6.3" + "@react-stately/toggle" "^3.7.0" + "@react-stately/tooltip" "^3.4.6" + "@react-stately/tree" "^3.7.5" + "@react-types/shared" "^3.22.0" react-style-singleton@^2.2.1: version "2.2.1" @@ -15130,6 +14267,18 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w== + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A== + dependencies: + redis-errors "^1.0.0" + reduce-css-calc@^2.1.8: version "2.1.8" resolved "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" @@ -15539,15 +14688,6 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -sentence-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" - integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - upper-case-first "^2.0.2" - serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -15700,14 +14840,6 @@ slash@^4.0.0: resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - sockjs@^0.3.24: version "0.3.24" resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -15840,6 +14972,11 @@ stackframe@^1.3.4: resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== +standard-as-callback@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" + integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== + state-local@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" @@ -15855,6 +14992,11 @@ statuses@2.0.1: resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +std-env@^3.4.3: + version "3.6.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz#94807562bddc68fa90f2e02c5fd5b6865bb4e98e" + integrity sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg== + stop-iteration-iterator@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" @@ -16045,22 +15187,6 @@ style-loader@^3.3.1: resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899" integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw== -styled-components@^5.3.10: - version "5.3.10" - resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz#42f7245f58fe960362a63f543dda23c0ac107c0f" - integrity sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - styled-components@^5.3.6: version "5.3.9" resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.9.tgz#641af2a8bb89904de708c71b439caa9633e8f0ba" @@ -16077,6 +15203,21 @@ styled-components@^5.3.6: shallowequal "^1.1.0" supports-color "^5.5.0" +styled-components@^6.1.1: + version "6.1.2" + resolved "https://registry.npmjs.org/styled-components/-/styled-components-6.1.2.tgz#88bd9d446bea254619fc265c93efd73cc5776595" + integrity sha512-LJjirciivbOKNuKKjheXMeNOlFspur4s2/AYW2hPyrL4RhwEFiowF9axgjeMVxX7siEoLJAitKrzpuNApJ5R/Q== + dependencies: + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/unitless" "^0.8.0" + "@types/stylis" "^4.0.2" + css-to-react-native "^3.2.0" + csstype "^3.1.2" + postcss "^8.4.31" + shallowequal "^1.1.0" + stylis "^4.3.0" + tslib "^2.5.0" + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -16090,6 +15231,11 @@ stylis@4.1.3: resolved "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" + integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== + superstruct@^0.14.2: version "0.14.2" resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" @@ -16496,15 +15642,10 @@ type-fest@^2.14.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@^3.6.1: - version "3.6.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.6.1.tgz#cf8025edeebfd6cf48de73573a5e1423350b9993" - integrity sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA== - -type-fest@^4.3.1: - version "4.3.2" - resolved "https://registry.npmmirror.com/type-fest/-/type-fest-4.3.2.tgz#bb7948127bb644364994dc1b44b8a797da8aadcd" - integrity sha512-VpwuOgnTsQUUWi0id8Hl4/xiQ+OoaeJGe8dnFjzubJYe/lOc2/d1Qx/d3FqWR0FlpOG/cvukAXfB12A49Y4iiA== +type-fest@^4.8.3: + version "4.8.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" + integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== type-is@~1.6.18: version "1.6.18" @@ -16530,21 +15671,31 @@ typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.4.2: - version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.3.3: + version "5.3.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ua-parser-js@^1.0.33: version "1.0.35" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== +ua-parser-js@^1.0.35: + version "1.0.37" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz#b5dc7b163a5c1f0c510b08446aed4da92c46373f" + integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +ufo@^1.3.0, ufo@^1.3.1, ufo@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== + uint8arrays@^2.1.4: version "2.1.10" resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-2.1.10.tgz#34d023c843a327c676e48576295ca373c56e286a" @@ -16566,10 +15717,10 @@ uint8arrays@^4.0.3: dependencies: multiformats "^11.0.0" -uint8arrays@^4.0.6: - version "4.0.6" - resolved "https://registry.npmmirror.com/uint8arrays/-/uint8arrays-4.0.6.tgz#bae68b536c2e87147045b95d73d29e503e45ecab" - integrity sha512-4ZesjQhqOU2Ip6GPReIwN60wRxIupavL8T0Iy36BBHr2qyMrNxsPJvr7vpS4eFt8F8kSguWUPad6ZM9izs/vyw== +uint8arrays@^4.0.9: + version "4.0.10" + resolved "https://registry.npmjs.org/uint8arrays/-/uint8arrays-4.0.10.tgz#3ec5cde3348903c140e87532fc53f46b8f2e921f" + integrity sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA== dependencies: multiformats "^12.0.1" @@ -16583,6 +15734,22 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +uncrypto@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" + integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== + +unenv@^1.7.4: + version "1.8.0" + resolved "https://registry.npmjs.org/unenv/-/unenv-1.8.0.tgz#0f860d5278405700bd95d47b23bc01f3a735d68c" + integrity sha512-uIGbdCWZfhRRmyKj1UioCepQ0jpq638j/Cf0xFTn4zD1nGJ2lSdzYHLzfdXN791oo/0juUiSWW1fBklXMTsuqg== + dependencies: + consola "^3.2.3" + defu "^6.1.3" + mime "^3.0.0" + node-fetch-native "^1.4.1" + pathe "^1.1.1" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -16645,6 +15812,32 @@ unstated-next@^1.1.0: resolved "https://registry.npmjs.org/unstated-next/-/unstated-next-1.1.0.tgz#7bb4911a12fdf3cc8ad3eb11a0b315e4a8685ea8" integrity sha512-AAn47ZncPvgBGOvMcn8tSRxsrqwf2VdAPxLASTuLJvZt4rhKfDvUkmYZLGfclImSfTVMv7tF4ynaVxin0JjDCA== +unstorage@^1.9.0: + version "1.10.1" + resolved "https://registry.npmjs.org/unstorage/-/unstorage-1.10.1.tgz#bf8cc00a406e40a6293e893da9807057d95875b0" + integrity sha512-rWQvLRfZNBpF+x8D3/gda5nUCQL2PgXy2jNG4U7/Rc9BGEv9+CAJd0YyGCROUBKs9v49Hg8huw3aih5Bf5TAVw== + dependencies: + anymatch "^3.1.3" + chokidar "^3.5.3" + destr "^2.0.2" + h3 "^1.8.2" + ioredis "^5.3.2" + listhen "^1.5.5" + lru-cache "^10.0.2" + mri "^1.2.0" + node-fetch-native "^1.4.1" + ofetch "^1.3.3" + ufo "^1.3.1" + +untun@^0.1.2: + version "0.1.3" + resolved "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz#5d10dee37a3a5737ff03d158be877dae0a0e58a6" + integrity sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ== + dependencies: + citty "^0.1.5" + consola "^3.2.3" + pathe "^1.1.1" + upath@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -16658,19 +15851,10 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" -upper-case-first@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" - integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== - dependencies: - tslib "^2.0.3" - -upper-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" - integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== - dependencies: - tslib "^2.0.3" +uqr@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz#5c6cd5dcff9581f9bb35b982cb89e2c483a41d7d" + integrity sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA== uri-js@^4.2.2: version "4.4.1" @@ -16789,10 +15973,10 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" -valtio@1.10.6: - version "1.10.6" - resolved "https://registry.npmjs.org/valtio/-/valtio-1.10.6.tgz#80ed00198b949939863a0fa56ae687abb417fc4f" - integrity sha512-SxN1bHUmdhW6V8qsQTpCgJEwp7uHbntuH0S9cdLQtiohuevwBksbpXjwj5uDMA7bLwg1WKyq9sEpZrx3TIMrkA== +valtio@1.11.2: + version "1.11.2" + resolved "https://registry.npmjs.org/valtio/-/valtio-1.11.2.tgz#b8049c02dfe65620635d23ebae9121a741bb6530" + integrity sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw== dependencies: proxy-compare "2.5.1" use-sync-external-store "1.2.0" @@ -16802,11 +15986,6 @@ value-or-promise@1.0.12, value-or-promise@^1.0.11, value-or-promise@^1.0.12: resolved "https://registry.npmjs.org/value-or-promise/-/value-or-promise-1.0.12.tgz#0e5abfeec70148c78460a849f6b003ea7986f15c" integrity sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q== -varint@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - varint@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" @@ -16849,21 +16028,6 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" -viem@^0.3.37: - version "0.3.50" - resolved "https://registry.npmjs.org/viem/-/viem-0.3.50.tgz#999a7682eda7eabc48c923f4b9923c3f098fc1ab" - integrity sha512-s+LxCYZTR9F/qPk1/n1YDVAX9vSeVz7GraqBZWGrDuenCJxo9ArCoIceJ6ksI0WwSeNzcZ0VVbD/kWRzTxkipw== - dependencies: - "@adraffy/ens-normalize" "1.9.0" - "@noble/curves" "1.0.0" - "@noble/hashes" "1.3.0" - "@scure/bip32" "1.3.0" - "@scure/bip39" "1.2.0" - "@wagmi/chains" "1.0.0" - abitype "0.8.7" - isomorphic-ws "5.0.0" - ws "8.12.0" - viem@^1.0.0: version "1.2.5" resolved "https://registry.npmjs.org/viem/-/viem-1.2.5.tgz#e9f80a57b80d8749624b4b31a98041549a25c5ad" @@ -16879,6 +16043,20 @@ viem@^1.0.0: isomorphic-ws "5.0.0" ws "8.12.0" +viem@^1.19.13: + version "1.20.3" + resolved "https://registry.npmjs.org/viem/-/viem-1.20.3.tgz#8b8360daee622295f5385949c02c86d943d14e0f" + integrity sha512-7CrmeCb2KYkeCgUmUyb1hsf+IX/PLwi+Np+Vm4YUTPeG82y3HRSgGHSaCOp3d0YtR2kXD3nv9y5kE7LBFE+wWw== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "0.9.8" + isows "1.0.3" + ws "8.13.0" + vm-browserify@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" @@ -16903,15 +16081,15 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wagmi@^1.0.7: - version "1.3.2" - resolved "https://registry.npmjs.org/wagmi/-/wagmi-1.3.2.tgz#a13c9da337a9c3212be28484f2e1491b11f87b4e" - integrity sha512-9kM1feOuxFnllxDuKxNwkxREv29EmCtb/dXl8Ym1QY/YKfZh3Zo3FWWizeT2UjJymto8cAvu34a0rRqOkTii5A== +wagmi@^1.4.10: + version "1.4.12" + resolved "https://registry.npmjs.org/wagmi/-/wagmi-1.4.12.tgz#e5d31c6d7621ecd9e32eded6c7b1041201223127" + integrity sha512-QRxpjhdMlZmbYTfn9VQkQMKq+l3kwA1O7tF10vaykPrjbGX+IIlyn72ib9oqW9BfQO7n/Sf/mnVz1zbxRhGPWA== dependencies: "@tanstack/query-sync-storage-persister" "^4.27.1" "@tanstack/react-query" "^4.28.0" "@tanstack/react-query-persist-client" "^4.28.0" - "@wagmi/core" "1.3.2" + "@wagmi/core" "1.4.12" abitype "0.8.7" use-sync-external-store "^1.2.0" @@ -17461,16 +16639,16 @@ ws@8.12.1: resolved "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz#c51e583d79140b5e42e39be48c934131942d4a8f" integrity sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew== +ws@8.13.0, ws@^8.12.0, ws@^8.13.0, ws@^8.5.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + ws@^7.3.1, ws@^7.4.5, ws@^7.4.6, ws@^7.5.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.12.0, ws@^8.13.0, ws@^8.5.0: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" From 91e7508dee2790c0d2e0babae4a52728a45302df Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 14:38:44 +0800 Subject: [PATCH 050/127] fix ListBoxItem style --- packages/client/scan/src/styles/select.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/scan/src/styles/select.css b/packages/client/scan/src/styles/select.css index 07ccd9ca..5423805a 100644 --- a/packages/client/scan/src/styles/select.css +++ b/packages/client/scan/src/styles/select.css @@ -94,7 +94,7 @@ font-weight: bold; } - .react-aria-Item { + .react-aria-ListBoxItem { margin: 2px; border-radius: 6px; padding: 10px 15px; From 514f2161b9fff364d4e860669cd4045ca667d36b Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 14:52:53 +0800 Subject: [PATCH 051/127] fix MenuItem style --- packages/client/dashboard/src/styles/menu.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/styles/menu.css b/packages/client/dashboard/src/styles/menu.css index bd5e77bd..27a2e61b 100644 --- a/packages/client/dashboard/src/styles/menu.css +++ b/packages/client/dashboard/src/styles/menu.css @@ -55,7 +55,7 @@ margin: 2px 4px; } - .react-aria-Item { + .react-aria-MenuItem { margin: 2px; padding: 10px; border-radius: 6px; From 1215be22027343a10a36b743448dbf81d02904dd Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 14:55:35 +0800 Subject: [PATCH 052/127] delete some comment --- packages/client/dashboard/src/components/ModelTabs.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/ModelTabs.tsx b/packages/client/dashboard/src/components/ModelTabs.tsx index 8004c9f3..bd605d73 100644 --- a/packages/client/dashboard/src/components/ModelTabs.tsx +++ b/packages/client/dashboard/src/components/ModelTabs.tsx @@ -2,9 +2,9 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-15 10:06:03 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-21 12:46:51 + * @LastEditTime: 2023-12-21 14:55:14 * @FilePath: /s3/packages/client/dashboard/src/components/ModelTabs.tsx - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + * @Description: */ import { Tabs, TabList, Tab, TabPanel } from 'react-aria-components' import Definition from './Definition' From 97326214cb6038b3418cfeaf689c3d5a4801059e Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 15:03:32 +0800 Subject: [PATCH 053/127] remove extra code as comments --- packages/client/scan/src/components/Header.tsx | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/client/scan/src/components/Header.tsx b/packages/client/scan/src/components/Header.tsx index 00b0e934..90287f01 100644 --- a/packages/client/scan/src/components/Header.tsx +++ b/packages/client/scan/src/components/Header.tsx @@ -29,17 +29,6 @@ export default function Header() { return !show }, [location]) - // const params = useParams() - // const session = useSession() - // const showLogoutButton = useMemo(() => { - // return ( - // location.pathname.startsWith('/streams/profile') && - // session && - // session.id && - // session.id === params?.did - // ) - // }, [location, session, params?.did]) - if (isMobile) { return null } @@ -60,7 +49,6 @@ export default function Header() { /> )) ||
} - {/* {showLogoutButton && } */} ) From d52698397d33ecbd987358081606f89ab94f917d Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 16:56:08 +0800 Subject: [PATCH 054/127] optimize node service ui styles --- .../dashboard/src/components/Terminal.tsx | 7 +++-- .../dashboard/src/container/CeramicNodes.tsx | 28 +++++++++++++------ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/packages/client/dashboard/src/components/Terminal.tsx b/packages/client/dashboard/src/components/Terminal.tsx index 1dd80150..1b17a3af 100644 --- a/packages/client/dashboard/src/components/Terminal.tsx +++ b/packages/client/dashboard/src/components/Terminal.tsx @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-18 13:28:56 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-19 17:23:53 + * @LastEditTime: 2023-12-21 16:24:13 * @FilePath: /s3/packages/client/dashboard/src/components/Terminal.tsx * @Description: */ @@ -126,12 +126,15 @@ export default function NodeTerminal ({ // terminal.write( // `${ANSI_COLOR.red}${data.message}${ANSI_COLOR.reset}\r\n` // ) + terminal.write( + `...` + ) setTimeout(() => { socket.emit('events', { ceramicId: ceramicId, didSession: didSession }) - }, 3000) + }, 1000) } }) } diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 511033bf..f6702834 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -2,9 +2,9 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-15 10:50:39 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-19 17:40:39 + * @LastEditTime: 2023-12-21 16:51:47 * @FilePath: /s3/packages/client/dashboard/src/container/DappNode.tsx - * @Description: + * @Description: */ import styled from 'styled-components' @@ -176,29 +176,29 @@ function CeramicNodeInfo ({ node }: { node: CeramicDto }) { {node.status === CeramicStatus.PREPARING ? (
- Preparing your deployment... + Preparing your deployment... (It may take a few minutes)
) : node.status === CeramicStatus.RUNNING ? (
Node URL:
- {node.serviceUrl} +
{node.serviceUrl}
Private Key:
- {node.privateKey} +
{node.privateKey}
API Key:
- {node.apiKey} +
{node.apiKey}
) : null} - {node?.id && node.status===CeramicStatus.RUNNING && session?.did && ( + {node?.id && node.status === CeramicStatus.RUNNING && session?.did && ( @@ -370,14 +370,26 @@ const NodeInfoBox = styled.div` .node-infos { display: flex; flex-direction: column; - gap: 10px; + gap: 12px; .node-info { + width: 100%; display: flex; flex-direction: row; gap: 10px; .node-info-key { + flex-shrink: 0; + text-align: right; + width: 90px; color: #718094; } + .node-info-value { + flex-shrink: 1; + max-width: 840px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } } } ` From 452a32bb1c9bbcd88cd7278bd526085cff642af7 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 17:02:39 +0800 Subject: [PATCH 055/127] update node version in cicd --- .github/workflows/dashboard-firebase-hosting-merge.yml | 2 +- .github/workflows/dashboard-firebase-hosting-pull-request.yml | 2 +- .github/workflows/scan-firebase-hosting-merge.yml | 2 +- .github/workflows/scan-firebase-hosting-pull-request.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dashboard-firebase-hosting-merge.yml b/.github/workflows/dashboard-firebase-hosting-merge.yml index 1293e33b..1b759b07 100644 --- a/.github/workflows/dashboard-firebase-hosting-merge.yml +++ b/.github/workflows/dashboard-firebase-hosting-merge.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: "18" + node-version: "20" - run: | cd packages/client/dashboard yarn diff --git a/.github/workflows/dashboard-firebase-hosting-pull-request.yml b/.github/workflows/dashboard-firebase-hosting-pull-request.yml index 9d4f9dd5..7b71d141 100644 --- a/.github/workflows/dashboard-firebase-hosting-pull-request.yml +++ b/.github/workflows/dashboard-firebase-hosting-pull-request.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: "18" + node-version: "20" - run: | cd packages/client/dashboard yarn diff --git a/.github/workflows/scan-firebase-hosting-merge.yml b/.github/workflows/scan-firebase-hosting-merge.yml index 6d2f285b..daae099c 100644 --- a/.github/workflows/scan-firebase-hosting-merge.yml +++ b/.github/workflows/scan-firebase-hosting-merge.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' - run: | cd packages/client/scan yarn diff --git a/.github/workflows/scan-firebase-hosting-pull-request.yml b/.github/workflows/scan-firebase-hosting-pull-request.yml index 01d826cd..df124c3c 100644 --- a/.github/workflows/scan-firebase-hosting-pull-request.yml +++ b/.github/workflows/scan-firebase-hosting-pull-request.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' - run: | cd packages/client/scan yarn From b0571109b51b072bb7d7c725eb47d4eefc0f3389 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 21 Dec 2023 17:04:44 +0800 Subject: [PATCH 056/127] update node version in cicd --- .github/workflows/dashboard-firebase-hosting-merge.yml | 2 +- .github/workflows/dashboard-firebase-hosting-pull-request.yml | 2 +- .github/workflows/scan-firebase-hosting-merge.yml | 2 +- .github/workflows/scan-firebase-hosting-pull-request.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dashboard-firebase-hosting-merge.yml b/.github/workflows/dashboard-firebase-hosting-merge.yml index 1b759b07..9fbe124b 100644 --- a/.github/workflows/dashboard-firebase-hosting-merge.yml +++ b/.github/workflows/dashboard-firebase-hosting-merge.yml @@ -52,7 +52,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: "18" + node-version: "20" - run: | cd packages/client/dashboard yarn diff --git a/.github/workflows/dashboard-firebase-hosting-pull-request.yml b/.github/workflows/dashboard-firebase-hosting-pull-request.yml index 7b71d141..9e75bf1d 100644 --- a/.github/workflows/dashboard-firebase-hosting-pull-request.yml +++ b/.github/workflows/dashboard-firebase-hosting-pull-request.yml @@ -51,7 +51,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: "18" + node-version: "20" - run: | cd packages/client/dashboard yarn diff --git a/.github/workflows/scan-firebase-hosting-merge.yml b/.github/workflows/scan-firebase-hosting-merge.yml index daae099c..a27d787f 100644 --- a/.github/workflows/scan-firebase-hosting-merge.yml +++ b/.github/workflows/scan-firebase-hosting-merge.yml @@ -49,7 +49,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' - run: | cd packages/client/scan yarn diff --git a/.github/workflows/scan-firebase-hosting-pull-request.yml b/.github/workflows/scan-firebase-hosting-pull-request.yml index df124c3c..1357ae6d 100644 --- a/.github/workflows/scan-firebase-hosting-pull-request.yml +++ b/.github/workflows/scan-firebase-hosting-pull-request.yml @@ -48,7 +48,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' - run: | cd packages/client/scan yarn From 4962314bbf82b100cbf4d9fe44e9cd5045a23530 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 25 Dec 2023 16:47:55 +0800 Subject: [PATCH 057/127] fix disable icon warning --- .../dashboard/src/components/Icons/DisabledIcon.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx b/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx index 3c2f584f..947bc950 100644 --- a/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx +++ b/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx @@ -1,3 +1,11 @@ +/* + * @Author: bufan bufan@hotmail.com + * @Date: 2023-12-15 10:06:03 + * @LastEditors: bufan bufan@hotmail.com + * @LastEditTime: 2023-12-25 16:45:33 + * @FilePath: /s3/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ export default function DisabledIcon() { return ( - + ) } From e5ff28ecc4430db61ffd1af1d09b7d1872357b4f Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 25 Dec 2023 16:51:55 +0800 Subject: [PATCH 058/127] add error color to terminal of node --- packages/client/dashboard/src/components/Terminal.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/Terminal.tsx b/packages/client/dashboard/src/components/Terminal.tsx index 1b17a3af..07f72320 100644 --- a/packages/client/dashboard/src/components/Terminal.tsx +++ b/packages/client/dashboard/src/components/Terminal.tsx @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-18 13:28:56 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-21 16:24:13 + * @LastEditTime: 2023-12-25 16:50:57 * @FilePath: /s3/packages/client/dashboard/src/components/Terminal.tsx * @Description: */ @@ -32,7 +32,8 @@ const WELCOME_TEXT = [ ] const REGS = { time: '((?:2|1)\\d{3}(?:-|/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9])[.][0-9]{3,9}[Z])', - importants: 'IMPORTANT:' + importants: 'IMPORTANT:', + error: 'ERROR:' } export default function NodeTerminal ({ ceramicId, @@ -115,6 +116,11 @@ export default function NodeTerminal ({ new RegExp(REGS.importants, 'g'), `${ANSI_COLOR.magenta}${REGS.importants}${ANSI_COLOR.reset}` ) + // importants + log = log.replace( + new RegExp(REGS.error, 'g'), + `${ANSI_COLOR.red}${REGS.importants}${ANSI_COLOR.reset}` + ) terminal.write(log + '\r\n') }) }) From 0032dd2cc193d05ef9d69013509f143930d8b11f Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 25 Dec 2023 16:56:50 +0800 Subject: [PATCH 059/127] add error color to terminal of node --- .../client/dashboard/src/components/Terminal.tsx | 12 ++++++------ .../client/dashboard/src/container/CeramicNodes.tsx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/client/dashboard/src/components/Terminal.tsx b/packages/client/dashboard/src/components/Terminal.tsx index 07f72320..3a692c76 100644 --- a/packages/client/dashboard/src/components/Terminal.tsx +++ b/packages/client/dashboard/src/components/Terminal.tsx @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-18 13:28:56 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-25 16:50:57 + * @LastEditTime: 2023-12-25 16:52:23 * @FilePath: /s3/packages/client/dashboard/src/components/Terminal.tsx * @Description: */ @@ -81,9 +81,9 @@ export default function NodeTerminal ({ // console.log('init socket', ceramicId, didSession) if (!ceramicId || !didSession) return if (!socket.hasListeners('connect')) { - console.log('init socket listeners...') + // console.log('init socket listeners...') socket.on('connect', function () { - console.log('connected', socket.id) + // console.log('connected', socket.id) // input // terminal.onData(data => { // console.log('terminal onData', data) @@ -102,7 +102,7 @@ export default function NodeTerminal ({ } if (!socket.hasListeners('events')) { socket.on('events', function (data) { - console.log('events', socket.id) + // console.log('events', socket.id) const logs = data.log.split('\n') logs.forEach((log: string) => { if (log === '') return @@ -119,7 +119,7 @@ export default function NodeTerminal ({ // importants log = log.replace( new RegExp(REGS.error, 'g'), - `${ANSI_COLOR.red}${REGS.importants}${ANSI_COLOR.reset}` + `${ANSI_COLOR.red}${REGS.error}${ANSI_COLOR.reset}` ) terminal.write(log + '\r\n') }) @@ -127,7 +127,7 @@ export default function NodeTerminal ({ } if (!socket.hasListeners('exception')) { socket.on('exception', function (data) { - console.log('exception', socket.id, data) + // console.log('exception', socket.id, data) if (data.code === 1) { // terminal.write( // `${ANSI_COLOR.red}${data.message}${ANSI_COLOR.reset}\r\n` diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index f6702834..39a1be8d 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-15 10:50:39 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-21 16:51:47 + * @LastEditTime: 2023-12-25 16:54:15 * @FilePath: /s3/packages/client/dashboard/src/container/DappNode.tsx * @Description: */ @@ -35,7 +35,7 @@ export default function CeramicNodes () { undefined ) useEffect(() => { - console.log('ceramicNodes changes: ', ceramicNodes) + // console.log('ceramicNodes changes: ', ceramicNodes) if (ceramicNodes.length > 0) { if (ceramicNodes[0].status === CeramicStatus.PREPARING) { setTimeout(() => { From f61a8df9d51f66fadec9f1d127029a88e2857a6a Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 26 Dec 2023 14:25:45 +0800 Subject: [PATCH 060/127] create model from browser with did:key and did:pkh --- packages/client/dashboard/package.json | 2 +- packages/client/dashboard/src/App.tsx | 1 + .../src/components/CreateNewModel.tsx | 41 +++++-- .../client/dashboard/src/constants/index.ts | 7 +- .../src/utils/creamic-composedb/index.ts | 111 ++++++++++++++++++ packages/client/dashboard/yarn.lock | 18 +-- 6 files changed, 154 insertions(+), 26 deletions(-) create mode 100644 packages/client/dashboard/src/utils/creamic-composedb/index.ts diff --git a/packages/client/dashboard/package.json b/packages/client/dashboard/package.json index 76bcab39..1b6f568c 100644 --- a/packages/client/dashboard/package.json +++ b/packages/client/dashboard/package.json @@ -24,7 +24,7 @@ "@types/react": "^18.0.0", "@types/react-dom": "^18.0.0", "@types/styled-components": "^5.1.26", - "@us3r-network/auth-with-rainbowkit": "^0.2.1", + "@us3r-network/auth-with-rainbowkit": "^0.2.4-alpha.0", "@us3r-network/data-model": "^0.7.0", "@us3r-network/profile": "^0.7.0", "axios": "^1.6.2", diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index a2fde1f0..26d18c76 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -65,6 +65,7 @@ export default function App () { diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/CreateNewModel.tsx index 21408698..f0be55a9 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/CreateNewModel.tsx @@ -7,10 +7,12 @@ import CloseIcon from './Icons/CloseIcon' import { schemas } from '../utils/composedb-types/schemas' import useSelectedDapp from '../hooks/useSelectedDapp' -import { createModel, updateDapp } from '../api' -import { Network } from './Selector/EnumSelect' +import { updateDapp } from '../api' +// import { Network } from './Selector/EnumSelect' import { useAppCtx } from '../context/AppCtx' import { useSession } from '@us3r-network/auth-with-rainbowkit' +import { createCompositeFromBrowser } from '../utils/creamic-composedb' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' export default function CreateNewModel({ closeModal, @@ -26,23 +28,42 @@ export default function CreateNewModel({ code: schemas.code, libraries: schemas.library, }) - + + const { + ceramicNodes, + } = useCeramicNodeCtx() const submit = useCallback(async () => { if (submitting) return if (!selectedDapp) return if (!session?.id) return if (!gqlSchema.code) return + if (!ceramicNodes || !ceramicNodes.length) return try { setSubmitting(true) - const resp = await createModel( + + // create model through api + // const resp = await createModel( + // gqlSchema.code, + // (selectedDapp.network as Network) || Network.TESTNET + // ) + // const { composite, runtimeDefinition } = resp.data.data + // const newModelIDs = Object.key(composite.models) + + // create model directly through the ceramic node + const result = await createCompositeFromBrowser( gqlSchema.code, - (selectedDapp.network as Network) || Network.TESTNET + ceramicNodes[0].serviceUrl+'/', + // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, + // ceramicNodes[0].privateKey, + '', + session ) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { composite, runtimeDefinition } = resp.data.data - const modelsId = Object.keys(composite.models) + if (!result) return + const { composite } = result; + const newModelIDs = Object.values(composite.modelIDs) const models = selectedDapp.models || [] - models.push(...modelsId) + models.push(...newModelIDs) + console.log("models: ", newModelIDs, models) await updateDapp({ ...selectedDapp, models }, session.serialize()) await loadDapps() closeModal() @@ -52,7 +73,7 @@ export default function CreateNewModel({ } finally { setSubmitting(false) } - }, [closeModal, gqlSchema.code, loadDapps, selectedDapp, session, submitting]) + }, [ceramicNodes, closeModal, gqlSchema.code, loadDapps, selectedDapp, session, submitting]) return ( diff --git a/packages/client/dashboard/src/constants/index.ts b/packages/client/dashboard/src/constants/index.ts index 5345779e..eb502244 100644 --- a/packages/client/dashboard/src/constants/index.ts +++ b/packages/client/dashboard/src/constants/index.ts @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-15 10:06:03 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-19 17:07:22 + * @LastEditTime: 2023-12-22 10:59:18 * @FilePath: /s3/packages/client/dashboard/src/constants/index.ts * @Description: */ @@ -10,11 +10,6 @@ export const APP_API_URL = process.env.REACT_APP_API_BASE_URL export const UPLOAD_API_URL = process.env.REACT_APP_UPLOAD_API_URL -export const CERAMIC_NODE = - process.env.REACT_APP_CERAMIC_NODE || 'https://ceramic.s3.xyz/' -export const CERAMIC_NODE_ADMIN_PRIVATE_KEY = - process.env.REACT_APP_CERAMIC_NODE_ADMIN_PRIVATE_KEY - export const CERAMIC_MAINNET_HOST = process.env .REACT_APP_CERAMIC_MAINNET_HOST as string export const CERAMIC_TESTNET_HOST = process.env diff --git a/packages/client/dashboard/src/utils/creamic-composedb/index.ts b/packages/client/dashboard/src/utils/creamic-composedb/index.ts new file mode 100644 index 00000000..0bc5174f --- /dev/null +++ b/packages/client/dashboard/src/utils/creamic-composedb/index.ts @@ -0,0 +1,111 @@ +import { CeramicApi } from '@ceramicnetwork/common' +import { CeramicClient } from '@ceramicnetwork/http-client' +import { Composite } from '@composedb/devtools' +import { DID } from 'dids' +import { Ed25519Provider } from 'key-did-provider-ed25519' +import { getResolver } from 'key-did-resolver' +import { fromString } from 'uint8arrays/from-string' + +import { DIDSession } from 'did-session' +import { EthereumWebAuth, getAccountId } from '@didtools/pkh-ethereum' + +export async function createCompositeFromBrowser( + graphql: string, + myCeramicNode: string = '', + myCeramicNodeAdminPrivateKey: string = '', + pkhSession: DIDSession | null = null, + index: boolean = false, +) { + console.log('graphql string: ', graphql) + if (!graphql) { + console.error("Please specify model's graphql string") + return + } + if (!myCeramicNode) { + console.error('Please specify a Ceramic node') + return + } + // 0 Login + console.log('Connecting to the ceramic node: ', myCeramicNode) + const ceramic = new CeramicClient(myCeramicNode) + try { + // Hexadecimal-encoded private key for a DID having admin access to the target Ceramic node + // Replace the example key here by your admin private key + if (myCeramicNodeAdminPrivateKey && myCeramicNode) { + const privateKey = fromString(myCeramicNodeAdminPrivateKey, 'base16') + const did = new DID({ + resolver: getResolver(), + provider: new Ed25519Provider(privateKey), + }) + await did.authenticate() + // An authenticated DID with admin access must be set on the Ceramic instance + ceramic.did = did + } else if (pkhSession) { + ceramic.did = pkhSession.did + } + else { + const ethProvider = (window as any).ethereum + const addresses = await ethProvider.enable() + const accountId = await getAccountId(ethProvider, addresses[0]) + const authMethod = await EthereumWebAuth.getAuthMethod( + ethProvider, + accountId + ) + const session = await DIDSession.authorize(authMethod, { + resources: ['ceramic://*'], + }) + ceramic.did = session.did + } + + console.log('Connected to the ceramic node!') + } catch (e) { + console.error((e as Error).message) + return + } + + //1 Create My Composite + let myComposite + try { + console.log('Creating the composite...') + myComposite = await Composite.create({ + ceramic: ceramic as unknown as CeramicApi, + schema: graphql, + index: false, + }) + console.log(`Creating the composite... Done! The encoded representation:`) + console.log(myComposite) + } catch (e) { + console.error((e as Error).message) + return + } + + //2 Deploy My Composite + if (myCeramicNodeAdminPrivateKey && index) + try { + console.log('Deploying the composite...') + // Notify the Ceramic node to index the models present in the composite + await myComposite.startIndexingOn(ceramic as unknown as CeramicApi) + // Logging the model stream IDs to stdout, so that they can be piped using standard I/O or redirected to a file + console.log( + JSON.stringify(Object.keys(myComposite.toParams().definition.models)) + ) + console.log(`Deploying the composite... Done!`) + } catch (e) { + console.error((e as Error).message) + return + } + + //3 Compile My Composite + let myRuntimeDefinition + try { + console.log('Compiling the composite...') + myRuntimeDefinition = myComposite.toRuntime() + console.log(JSON.stringify(myRuntimeDefinition)) + console.log(`Compiling the composite... Done!`) + } catch (e) { + console.error((e as Error).message) + return + } + + return { composite: myComposite, runtimeDefinition: myRuntimeDefinition } +} \ No newline at end of file diff --git a/packages/client/dashboard/yarn.lock b/packages/client/dashboard/yarn.lock index ebebdadc..8af015e2 100644 --- a/packages/client/dashboard/yarn.lock +++ b/packages/client/dashboard/yarn.lock @@ -5484,18 +5484,18 @@ "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" -"@us3r-network/auth-with-rainbowkit@^0.2.1": - version "0.2.1" - resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.2.1.tgz#bce3345a54eca8499ce6a52fff2de814b27fb03b" - integrity sha512-7Futy5KEinrmbO5YPRAteLKaJyzU/3KkRkqsznrobcODVaa0ZVNcuQhdHvsivfPPkHKoxuvkD5LTCq4x8iySMQ== +"@us3r-network/auth-with-rainbowkit@^0.2.4-alpha.0": + version "0.2.4-alpha.0" + resolved "https://registry.npmjs.org/@us3r-network/auth-with-rainbowkit/-/auth-with-rainbowkit-0.2.4-alpha.0.tgz#f557b57b327ee5b7d79b6897021517b741556302" + integrity sha512-0QFg7b0LpfWqCWGwY4vyDC99V4bJ008AeO116490RwoYIcDZbBtmBvqV/gXW9YUE4zB6JsBJdwRGFmySbaVOeQ== dependencies: - "@us3r-network/auth" "^0.2.3" + "@us3r-network/auth" "^0.2.4-alpha.0" buffer "^6.0.3" -"@us3r-network/auth@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.3.tgz#cc2e5488be6811599409fad1a3102e0dab8944f8" - integrity sha512-gBMu9eEcb6r9dkdA2jZNjUSskELmEPeWqYYKwYPD2nYdJh83p4mo8DT1/09IHuvkDIEhz0dbwZEHc5jIvORo0A== +"@us3r-network/auth@^0.2.4-alpha.0": + version "0.2.4-alpha.0" + resolved "https://registry.npmjs.org/@us3r-network/auth/-/auth-0.2.4-alpha.0.tgz#ec44ff2647a17655ffd8c7887c528aea25e7632e" + integrity sha512-2CU3QchrxY0GhB/hAT7Ic9f/wy9E9FseEVJIfnFG26+mHdaG6TQNTQRE+2VbZ00SUfyYdDS/pwkvhfnQtd5IQA== dependencies: "@didtools/pkh-ethereum" "^0.4.1" "@didtools/pkh-solana" "^0.1.1" From 0bc12fcdc9e0a1f0d743ec9d5fc1f6cf0ddd00a8 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 27 Dec 2023 16:06:29 +0800 Subject: [PATCH 061/127] add model to private ceramic node --- packages/client/dashboard/src/api/index.ts | 5 +- .../src/components/CreateNewModel.tsx | 46 +++--- .../dashboard/src/components/ModelList.tsx | 140 ++++++++++-------- .../src/components/NoCeramicNodeModal.tsx | 66 +++++++++ .../dashboard/src/container/ExploreModel.tsx | 111 +++++++++----- packages/client/dashboard/src/index.css | 3 + 6 files changed, 254 insertions(+), 117 deletions(-) create mode 100644 packages/client/dashboard/src/components/NoCeramicNodeModal.tsx diff --git a/packages/client/dashboard/src/api/index.ts b/packages/client/dashboard/src/api/index.ts index 98cfaa6d..ef6e970e 100644 --- a/packages/client/dashboard/src/api/index.ts +++ b/packages/client/dashboard/src/api/index.ts @@ -62,7 +62,8 @@ export function createDapp( export function updateDapp( dapp: ClientDApp, - didSession: string + didSession: string, + ceramiceId?:number, ): AxiosPromise> { if (!dapp.id) throw new Error('dapp id is required') @@ -74,7 +75,7 @@ export function updateDapp( headers: { 'did-session': didSession, }, - data: { ...dapp, id: Number(dapp.id) }, + data: { ...dapp, ceramiceId, id: Number(dapp.id) }, }) } diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/CreateNewModel.tsx index f0be55a9..06a0d326 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/CreateNewModel.tsx @@ -14,24 +14,22 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { createCompositeFromBrowser } from '../utils/creamic-composedb' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -export default function CreateNewModel({ - closeModal, +export default function CreateNewModel ({ + closeModal }: { closeModal: () => void }) { const { selectedDapp } = useSelectedDapp() + const { ceramicNodes } = useCeramicNodeCtx() const { loadDapps } = useAppCtx() const session = useSession() const [submitting, setSubmitting] = useState(false) const [gqlSchema, setGqlSchema] = useState({ code: schemas.code, - libraries: schemas.library, + libraries: schemas.library }) - const { - ceramicNodes, - } = useCeramicNodeCtx() const submit = useCallback(async () => { if (submitting) return if (!selectedDapp) return @@ -52,19 +50,23 @@ export default function CreateNewModel({ // create model directly through the ceramic node const result = await createCompositeFromBrowser( gqlSchema.code, - ceramicNodes[0].serviceUrl+'/', + ceramicNodes[0].serviceUrl + '/', // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, // ceramicNodes[0].privateKey, '', session ) if (!result) return - const { composite } = result; + const { composite } = result const newModelIDs = Object.values(composite.modelIDs) const models = selectedDapp.models || [] models.push(...newModelIDs) - console.log("models: ", newModelIDs, models) - await updateDapp({ ...selectedDapp, models }, session.serialize()) + // console.log("models: ", newModelIDs, models) + await updateDapp( + { ...selectedDapp, models }, + session.serialize(), + ceramicNodes[0].id + ) await loadDapps() closeModal() } catch (error) { @@ -73,11 +75,19 @@ export default function CreateNewModel({ } finally { setSubmitting(false) } - }, [ceramicNodes, closeModal, gqlSchema.code, loadDapps, selectedDapp, session, submitting]) + }, [ + ceramicNodes, + closeModal, + gqlSchema.code, + loadDapps, + selectedDapp, + session, + submitting + ]) return ( -
+

Create Model

{ + setSchema={props => { setGqlSchema(props) }} schema={gqlSchema} sidebarExpanded={false} routeState={{ - code: 'on', + code: 'on' }} /> -
+
{(submitting && ( - )) || ( - )} diff --git a/packages/client/dashboard/src/components/ModelList.tsx b/packages/client/dashboard/src/components/ModelList.tsx index 72712853..a5a65784 100644 --- a/packages/client/dashboard/src/components/ModelList.tsx +++ b/packages/client/dashboard/src/components/ModelList.tsx @@ -23,13 +23,15 @@ import MergeIcon from './Icons/MergeIcon' import { shortPubKey } from '../utils/shortPubKey' import CopyTint from './CopyTint' import useIsOwner from '../hooks/useIsOwner' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import NoCeramicNodeModal from './NoCeramicNodeModal' -export default function ModelList({ +export default function ModelList ({ editable, selectComposite, setSelectComposite, selectModel, - setSelectModel, + setSelectModel }: { selectModel: ModelStream | undefined setSelectModel: (m: ModelStream | undefined) => void @@ -41,6 +43,7 @@ export default function ModelList({ const session = useSession() const { loadDapps, currDapp } = useAppCtx() const { appId, selectedDapp } = useSelectedDapp() + const { ceramicNodes } = useCeramicNodeCtx() const navigate = useNavigate() const [loading, setLoading] = useState(false) const [dappModels, setDappModels] = useState() @@ -62,7 +65,7 @@ export default function ModelList({ try { const resp = await getStarModels({ network: dapp.network as Network, - ids: dapp.models || [], + ids: dapp.models || [] }) const list = resp.data.data @@ -80,7 +83,7 @@ export default function ModelList({ if (!dapp) return try { const resp = await getDappComposites({ - dapp, + dapp }) if (resp.data.code !== 0) throw new Error(resp.data.msg) setComposites(resp.data.data) @@ -96,7 +99,7 @@ export default function ModelList({ try { const newModels = - selectedDapp?.models?.filter((id) => id !== modelId) || [] + selectedDapp?.models?.filter(id => id !== modelId) || [] await updateDapp( { ...selectedDapp, models: newModels }, @@ -118,7 +121,7 @@ export default function ModelList({ await deleteDappComposites({ compositeId: id, didSession: session.serialize(), - dapp: selectedDapp, + dapp: selectedDapp }) await loadDappComposites() } catch (error) { @@ -160,8 +163,8 @@ export default function ModelList({ if (loading) { return ( -
- +
+
) @@ -169,39 +172,54 @@ export default function ModelList({ return ( -
+

Models

- {editable && isOwner && ( - - - - { - if (id === 'explore') { - navigate(`/dapp/${appId}/explore`) - return - } - if (id === 'favorite') { - document.getElementById('add-from-favorite')?.click() - return - } - if (id === 'create') { - document.getElementById('create-new')?.click() - return - } - }} - > - Explore Models - Add From Favorite - Create New Model - - - - )} + {editable && + isOwner && + (!ceramicNodes || ceramicNodes.length === 0 ? ( + + + + + + {({ close }) => } + + + + + ) : ( + + + + { + if (id === 'explore') { + navigate(`/dapp/${appId}/explore`) + return + } + if (id === 'favorite') { + document.getElementById('add-from-favorite')?.click() + return + } + if (id === 'create') { + document.getElementById('create-new')?.click() + return + } + }} + > + Explore Models + Add From Favorite + Create New Model + + + + ))}
-
+

Composites

{editable && isOwner && ( - {composites?.map((item) => { + {composites?.map(item => { const active = selectComposite?.id === item.id return (
{ setSelectedComposite(item) }} @@ -319,13 +337,13 @@ function DappCompositeList({ ) } -function DappModelList({ +function DappModelList ({ selected, setSelected, dappModels, selectAction, removeModelAction, - editable, + editable }: { selected?: ModelStream setSelected: (ms: ModelStream) => void @@ -343,12 +361,12 @@ function DappModelList({ } return ( - {dappModels?.map((item) => { + {dappModels?.map(item => { const active = selected?.stream_id === item.stream_id return (
{ selectAction(item) setSelected(item) @@ -365,7 +383,7 @@ function DappModelList({ {active && ( <>
-
+

ID: {shortPubKey(selected.stream_id, { len: 7 })}

@@ -384,9 +402,9 @@ function DappModelList({ ) } -function ModelListItemTrash({ +function ModelListItemTrash ({ streamId, - removeModelAction, + removeModelAction }: { streamId: string removeModelAction: (modelId: string) => Promise @@ -394,14 +412,14 @@ function ModelListItemTrash({ const [removing, setRemoving] = useState(false) if (removing) { return ( -
- {' '} +
+ {' '}
) } return ( @@ -433,7 +451,7 @@ function Favorite() { ) } -function CreateNew() { +function CreateNew () { const [searchParams] = useSearchParams() useEffect(() => { if (searchParams.get('create-new') === 'true') { @@ -444,9 +462,9 @@ function CreateNew() { @@ -461,9 +479,9 @@ function CreateNew() { ) } -function CreateComposite({ +function CreateComposite ({ loadDappComposites, - dappModels, + dappModels }: { loadDappComposites: () => Promise dappModels: ModelStream[] diff --git a/packages/client/dashboard/src/components/NoCeramicNodeModal.tsx b/packages/client/dashboard/src/components/NoCeramicNodeModal.tsx new file mode 100644 index 00000000..eb9cf4a8 --- /dev/null +++ b/packages/client/dashboard/src/components/NoCeramicNodeModal.tsx @@ -0,0 +1,66 @@ +import styled from 'styled-components' +import CloseIcon from './Icons/CloseIcon' +import { Link } from 'react-router-dom' +import useSelectedDapp from '../hooks/useSelectedDapp' + +export default function NoCeramicNodeModal ({ + closeModal +}: { + closeModal: () => void +}) { + const { selectedDapp } = useSelectedDapp() + return ( + +
+

Node Serivce

+ +
+
There is no available node now.
+ {selectedDapp && ( + + + + )} +
+ ) +} +const Box = styled.div` + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 30px; + gap: 20px; + position: relative; + width: 600px; + min-height: 200px; + margin: 0 auto; + + background: #1b1e23; + border-radius: 20px; + font-size: 16px; + + > div.title { + display: flex; + align-items: center; + justify-content: space-between; + + color: #ffffff; + > h1 { + margin: 0; + font-style: italic; + font-weight: 700; + font-size: 24px; + line-height: 28px; + } + } + .ok-button { + font-size: 12px; + font-weight: 700; + background-color: #ffffff; + width: 220px; + height: 40px; + border-radius: 10px; + } +` diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 63e5ade5..e22808da 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -9,7 +9,7 @@ import { getModelStreamList, getStarModels, startIndexModel, - updateDapp, + updateDapp } from '../api' import { TableBox, TableContainer } from '../components/TableBox' import dayjs from 'dayjs' @@ -24,28 +24,40 @@ import StarGoldIcon from '../components/Icons/StarGoldIcon' import { S3_SCAN_URL } from '../constants' import CheckCircleIcon from '../components/Icons/CheckCircleIcon' import PlusCircleIcon from '../components/Icons/PlusCircleIcon' - -export default function ExploreModel() { +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' +import NoCeramicNodeModal from '../components/NoCeramicNodeModal' + +export default function ExploreModel () { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [searchParams, setSearchParams] = useSearchParams() const { s3ModelCollection, selectedDapp } = useSelectedDapp() + const { ceramicNodes } = useCeramicNodeCtx() const session = useSession() const [models, setModels] = useState>([]) const [starModels, setStarModels] = useState>([]) const [hasMore, setHasMore] = useState(true) const searchText = useRef('') const pageNum = useRef(1) - const [personalCollections, setPersonalCollections] = useState< PersonalCollection[] >([]) - + const ceramicNodeId = useMemo(() => { + if (!ceramicNodes || !ceramicNodes.length) return NaN + return ceramicNodes[0].id + }, [ceramicNodes]) const fetchPersonalCollections = useCallback(async () => { if (!session) return s3ModelCollection.authComposeClient(session) try { const personal = await s3ModelCollection.queryPersonalCollections({ - first: 500, + first: 500 }) if (personal.errors) throw new Error(personal.errors[0].message) const collected = personal.data?.viewer.modelCollectionList @@ -53,12 +65,12 @@ export default function ExploreModel() { if (collected) { setPersonalCollections( collected?.edges - .filter((item) => item.node && item.node.revoke === false) - .map((item) => { + .filter(item => item.node && item.node.revoke === false) + .map(item => { return { modelId: item.node.modelID, id: item.node.id!, - revoke: !!item.node.revoke, + revoke: !!item.node.revoke } }) ) @@ -70,8 +82,8 @@ export default function ExploreModel() { const fetchStarModels = useCallback(async () => { const ids = personalCollections - .filter((item) => item.revoke === false) - .map((item) => { + .filter(item => item.revoke === false) + .map(item => { return item.modelId }) if (ids.length === 0) { @@ -82,7 +94,7 @@ export default function ExploreModel() { try { const resp = await getStarModels({ network: (selectedDapp?.network as Network) || Network.TESTNET, - ids, + ids }) if (resp.data.code !== 0) { throw new Error(resp.data.msg) @@ -100,7 +112,7 @@ export default function ExploreModel() { setHasMore(true) const resp = await getModelStreamList({ name: searchText.current, - network: (selectedDapp?.network as Network) || Network.TESTNET, + network: (selectedDapp?.network as Network) || Network.TESTNET }) const list = resp.data.data setModels(list) @@ -111,7 +123,7 @@ export default function ExploreModel() { const fetchMoreModel = useCallback( async (pageNumber: number) => { const resp = await getModelStreamList({ - pageNumber, + pageNumber }) const list = resp.data.data setHasMore(list.length >= PageSize) @@ -126,7 +138,7 @@ export default function ExploreModel() { }, [fetchModel, fetchPersonalCollections]) useEffect(() => { - fetchStarModels().catch((err) => { + fetchStarModels().catch(err => { setStarModels([]) console.error(err) }) @@ -144,12 +156,12 @@ export default function ExploreModel() { return (
-
ComposeDB Models
+
ComposeDB Models
-
+
{ + searchAction={text => { searchText.current = text setModels([]) fetchModel() @@ -185,7 +197,7 @@ export default function ExploreModel() { {lists.map((item, idx) => { const hasStarItem = personalCollections.find( - (starItem) => starItem.modelId === item.stream_id + starItem => starItem.modelId === item.stream_id ) return ( @@ -195,14 +207,14 @@ export default function ExploreModel() { href={`${S3_SCAN_URL}/models/modelview/${ item.stream_id }?network=${selectedDapp?.network.toUpperCase()}`} - target="_blank" - rel="noreferrer" + target='_blank' + rel='noreferrer' > {item.stream_content.name}
- +
{item.stream_content.description}
@@ -211,8 +223,8 @@ export default function ExploreModel() { href={`${S3_SCAN_URL}/streams/stream/${ item.stream_id }?network=${selectedDapp?.network.toUpperCase()}`} - target="_blank" - rel="noreferrer" + target='_blank' + rel='noreferrer' > {shortPubKey(item.stream_id, { len: 8, split: '-' })} @@ -236,8 +248,8 @@ export default function ExploreModel() { href={`${S3_SCAN_URL}/models/model/${ item.stream_id }/mids?network=${selectedDapp?.network.toUpperCase()}`} - target="_blank" - rel="noreferrer" + target='_blank' + rel='noreferrer' > {item.useCount} @@ -260,6 +272,7 @@ export default function ExploreModel() { hasIndexed={!!item.isIndexed} hasStarItem={hasStarItem} fetchPersonal={fetchPersonalCollections} + ceramicNodeId={ceramicNodeId} /> @@ -274,11 +287,12 @@ export default function ExploreModel() { ) } -function ModelStarItem({ +function ModelStarItem ({ hasStarItem, fetchPersonal, stream_id, hasIndexed, + ceramicNodeId }: { hasIndexed: boolean stream_id: string @@ -290,6 +304,7 @@ function ModelStarItem({ } | undefined fetchPersonal: () => void + ceramicNodeId?: number }) { const session = useSession() const { s3ModelCollection } = useSelectedDapp() @@ -301,18 +316,23 @@ function ModelStarItem({ const addToModelList = useCallback( async (modelId: string) => { if (!session || !selectedDapp) return + if (!ceramicNodeId) return if (!hasIndexed) { startIndexModel({ modelId, network: selectedDapp.network as Network, - didSession: session.serialize(), + didSession: session.serialize() }).catch(console.error) } try { setAdding(true) const models = selectedDapp.models || [] models.push(modelId) - await updateDapp({ ...selectedDapp, models }, session.serialize()) + await updateDapp( + { ...selectedDapp, models }, + session.serialize(), + ceramicNodeId + ) await loadDapps() } catch (err) { console.error(err) @@ -320,7 +340,7 @@ function ModelStarItem({ setAdding(false) } }, - [loadDapps, selectedDapp, session, setAdding, hasIndexed] + [loadDapps, selectedDapp, session, setAdding, hasIndexed, ceramicNodeId] ) const starModelAction = useCallback( @@ -332,7 +352,7 @@ function ModelStarItem({ setStaring(true) if (id) { const resp = await s3ModelCollection.updateCollection(id, { - revoke: !revoke, + revoke: !revoke }) if (resp.errors) { throw new Error(resp.errors[0].message) @@ -340,7 +360,7 @@ function ModelStarItem({ } else { const resp = await s3ModelCollection.createCollection({ modelID: modelId, - revoke: false, + revoke: false }) if (resp.errors) { throw new Error(resp.errors[0].message) @@ -362,7 +382,7 @@ function ModelStarItem({ {(staring && ( )) || ( ) : ( <> {selectedDapp?.models?.includes(modelId) ? ( - - ) : ( + ) : ceramicNodeId ? ( + ) : ( + + + + + + {({ close }) => } + + + + )} )} diff --git a/packages/client/dashboard/src/index.css b/packages/client/dashboard/src/index.css index ee0c721f..c8ae0f5a 100644 --- a/packages/client/dashboard/src/index.css +++ b/packages/client/dashboard/src/index.css @@ -34,6 +34,9 @@ button { border: none; outline: none; cursor: pointer; + &:disabled { + cursor: default; + } } .react-aria-ModalOverlay { From e5db544b6df5e542d563d7820299cc7e10c68c73 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 27 Dec 2023 16:45:00 +0800 Subject: [PATCH 062/127] add dapps field to explore models --- .../dashboard/src/components/ImgOrName.tsx | 30 +++++++ .../dashboard/src/container/ExploreModel.tsx | 80 ++++++++++++++++++- packages/client/dashboard/src/types.d.ts | 3 +- 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 packages/client/dashboard/src/components/ImgOrName.tsx diff --git a/packages/client/dashboard/src/components/ImgOrName.tsx b/packages/client/dashboard/src/components/ImgOrName.tsx new file mode 100644 index 00000000..ff8a94c2 --- /dev/null +++ b/packages/client/dashboard/src/components/ImgOrName.tsx @@ -0,0 +1,30 @@ +import { useState } from 'react' + +export function ImgOrName({ imgUrl, name }: { imgUrl: string | undefined; name: string }) { + const [showName, setShowName] = useState(true) + if (showName) { + return ( + <> + + {name.slice(0, 1).toUpperCase()} + + { + setShowName(false) + }} + onError={() => { + setShowName(true) + }} + /> + + ) + } + return ( + + + + ) +} diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index e22808da..7a8bab3d 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -3,7 +3,7 @@ import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' -import { ModelStream } from '../types' +import { ClientDApp, ModelStream } from '../types' import { PageSize, getModelStreamList, @@ -33,6 +33,7 @@ import { ModalOverlay } from 'react-aria-components' import NoCeramicNodeModal from '../components/NoCeramicNodeModal' +import { ImgOrName } from '../components/ImgOrName' export default function ExploreModel () { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -190,6 +191,7 @@ export default function ExploreModel () { Usage Count 7 Days Usage Release Date + Dapps @@ -265,6 +267,9 @@ export default function ExploreModel () { '-'}
+ + + {/* */} { + const data = [...dapps] + if (data.length > 3) + return { data: data.slice(0, 3), left: data.length - 3 } + return { data, left: 0 } + }, [dapps]) + + return ( + + {apps.data.length > 0 + ? apps.data.map((item, idx) => { + return ( + + + + ) + }) + : 'None'} + {apps.left > 0 && {apps.left}+} + + ) +} + +const DappBox = styled.div` + display: flex; + gap: 5px; + overflow: hidden; + color: #fff; + font-family: Rubik; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: normal; + a { + > span { + color: #fff; + width: 36px; + height: 36px; + border-radius: 10px; + border: 1px solid #718096; + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + &.name { + font-size: 20px; + font-weight: 500; + } + &.left { + border: none; + color: #fff; + justify-content: start; + font-family: Rubik; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: normal; + } + > img { + width: 100%; + height: 100%; + object-fit: cover; + flex-shrink: 0; + } + } + } +` + function ModelStarItem ({ hasStarItem, fetchPersonal, diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 44296e7f..05c1248a 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -2,7 +2,7 @@ * @Author: bufan bufan@hotmail.com * @Date: 2023-12-15 10:06:03 * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-15 14:48:02 + * @LastEditTime: 2023-12-27 16:19:42 * @FilePath: /s3/packages/client/dashboard/src/types.d.ts * @Description: */ @@ -59,6 +59,7 @@ export type ModelStream = { recentlyUseCount?: number firstRecordTime?: string isIndexed?: boolean + dapps?: ClientDApp[] } export type ModeCreateResult = { From b6d57e542ca1875ddf1bd3dd2ee1211180e13fb1 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 27 Dec 2023 17:11:31 +0800 Subject: [PATCH 063/127] create model using privatekey of admin on personal ceramic node --- packages/client/dashboard/src/components/CreateNewModel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/CreateNewModel.tsx index 06a0d326..1fb5d7b0 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/CreateNewModel.tsx @@ -52,8 +52,8 @@ export default function CreateNewModel ({ gqlSchema.code, ceramicNodes[0].serviceUrl + '/', // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, - // ceramicNodes[0].privateKey, - '', + ceramicNodes[0].privateKey, + // '', session ) if (!result) return From 292e6c56f1040627565544a8310fd7a4ebc65f70 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 27 Dec 2023 17:45:52 +0800 Subject: [PATCH 064/127] optimize CeramicNodeCtx --- .../src/components/CreateNewModel.tsx | 12 +++---- .../dashboard/src/container/ExploreModel.tsx | 8 ++--- .../dashboard/src/context/CeramicNodeCtx.tsx | 35 +++---------------- 3 files changed, 12 insertions(+), 43 deletions(-) diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/CreateNewModel.tsx index 1fb5d7b0..63642a0f 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/CreateNewModel.tsx @@ -20,7 +20,7 @@ export default function CreateNewModel ({ closeModal: () => void }) { const { selectedDapp } = useSelectedDapp() - const { ceramicNodes } = useCeramicNodeCtx() + const { currCeramicNode } = useCeramicNodeCtx() const { loadDapps } = useAppCtx() const session = useSession() const [submitting, setSubmitting] = useState(false) @@ -35,7 +35,7 @@ export default function CreateNewModel ({ if (!selectedDapp) return if (!session?.id) return if (!gqlSchema.code) return - if (!ceramicNodes || !ceramicNodes.length) return + if (!currCeramicNode) return try { setSubmitting(true) @@ -50,9 +50,9 @@ export default function CreateNewModel ({ // create model directly through the ceramic node const result = await createCompositeFromBrowser( gqlSchema.code, - ceramicNodes[0].serviceUrl + '/', + currCeramicNode.serviceUrl + '/', // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, - ceramicNodes[0].privateKey, + currCeramicNode.privateKey, // '', session ) @@ -65,7 +65,7 @@ export default function CreateNewModel ({ await updateDapp( { ...selectedDapp, models }, session.serialize(), - ceramicNodes[0].id + currCeramicNode.id ) await loadDapps() closeModal() @@ -76,7 +76,7 @@ export default function CreateNewModel ({ setSubmitting(false) } }, [ - ceramicNodes, + currCeramicNode, closeModal, gqlSchema.code, loadDapps, diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 7a8bab3d..2833600b 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -39,7 +39,7 @@ export default function ExploreModel () { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [searchParams, setSearchParams] = useSearchParams() const { s3ModelCollection, selectedDapp } = useSelectedDapp() - const { ceramicNodes } = useCeramicNodeCtx() + const { currCeramicNode } = useCeramicNodeCtx() const session = useSession() const [models, setModels] = useState>([]) const [starModels, setStarModels] = useState>([]) @@ -49,10 +49,6 @@ export default function ExploreModel () { const [personalCollections, setPersonalCollections] = useState< PersonalCollection[] >([]) - const ceramicNodeId = useMemo(() => { - if (!ceramicNodes || !ceramicNodes.length) return NaN - return ceramicNodes[0].id - }, [ceramicNodes]) const fetchPersonalCollections = useCallback(async () => { if (!session) return s3ModelCollection.authComposeClient(session) @@ -277,7 +273,7 @@ export default function ExploreModel () { hasIndexed={!!item.isIndexed} hasStarItem={hasStarItem} fetchPersonal={fetchPersonalCollections} - ceramicNodeId={ceramicNodeId} + ceramicNodeId={currCeramicNode?.id} /> diff --git a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx index a8021e9c..6ea96992 100644 --- a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx +++ b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx @@ -3,6 +3,7 @@ import React, { useCallback, useContext, useEffect, + useMemo, useState, } from 'react' @@ -13,11 +14,8 @@ import { getCeramicNode, getCeramicNodes } from '../api/ceramicNode' export interface CeramicNodeContextData { loadingCeramicNodes: boolean ceramicNodes: CeramicDto[] - // currCeramicNode: CeramicDto | undefined - // currCeramicNodeId: number | undefined - // setCurrCeramicNodeId: React.Dispatch> + currCeramicNode: CeramicDto | undefined loadCeramicNodes: () => Promise - // loadCeramicNode: (id:number) => Promise } const CeramicNodeContext = createContext(null) @@ -27,8 +25,6 @@ export default function CeramicNodeProvider({ }: { children: React.ReactNode }) { - // const [currCeramicNodeId, setCurrCeramicNodeId] = useState() - // const [currCeramicNode, setCurrCeramicNode] = useState() const [ceramicNodes, setCeramicNodes] = useState([]) const [loadingCeramicNodes, setLoadingCeramicNodes] = useState(false) @@ -46,27 +42,7 @@ export default function CeramicNodeProvider({ setCeramicNodes(resp.data.data) }, [session]) - // const loadCurrNode = useCallback(async () => { - // setCurrCeramicNode(undefined) - // if (!currCeramicNodeId) return - // const resp = await getCeramicNode(currCeramicNodeId) - // setCurrCeramicNode(resp.data.data) - // }, [currCeramicNodeId]) - - // useEffect(() => { - // setLoadingCeramicNode(true) - // loadCurrNode() - // .catch(console.error) - // .finally(() => { - // setLoadingCeramicNode(false) - // }) - // }, [loadCurrNode]) - - // const loadCeramicNode = useCallback(async (id:number) => { - // if (!id) return - // const resp = await getCeramicNode(id) - // return resp.data.data - // }, []) + const currCeramicNode = useMemo(()=>ceramicNodes[0], [ceramicNodes]) useEffect(() => { setLoadingCeramicNodes(true) @@ -88,11 +64,8 @@ export default function CeramicNodeProvider({ From 6d5787abc2df707c51f54cbe967e5bf98d3338c8 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 27 Dec 2023 17:47:18 +0800 Subject: [PATCH 065/127] set playground to private ceramic node --- .../src/components/CompositePlaygroundGraphiQL.tsx | 7 ++++--- .../dashboard/src/components/ExploreModelTabs.tsx | 5 ++++- .../client/dashboard/src/components/Playground.tsx | 8 +++++--- .../src/container/DappModelPlayground.tsx | 14 ++++++++++---- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx index 58f2e39d..4857f65d 100644 --- a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx @@ -41,6 +41,7 @@ export type YogaGraphiQLProps = Omit< title?: string additionalHeaders?: LoadFromUrlOptions['headers'] definition: string + ceramicNodeURL: string | undefined } const initialQuery = /* GraphQL */ ` @@ -71,7 +72,7 @@ const initialQuery = /* GraphQL */ ` export default function CompositePlaygroundGraphiQL( props: YogaGraphiQLProps ): React.ReactElement { - const { definition } = props + const { definition, ceramicNodeURL } = props const { selectedDapp } = useSelectedDapp() const updateQuery = useCallback(async () => { @@ -88,13 +89,13 @@ export default function CompositePlaygroundGraphiQL( const composeClient = useMemo( () => new ComposeClient({ - ceramic: + ceramic: ceramicNodeURL ? ceramicNodeURL : selectedDapp?.network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, definition: JSON.parse(definition) as RuntimeCompositeDefinition, }), - [definition, selectedDapp?.network] + [ceramicNodeURL, definition, selectedDapp?.network] ) const [composeClientAuthenticated, setComposeClientAuthenticated] = useState(false) diff --git a/packages/client/dashboard/src/components/ExploreModelTabs.tsx b/packages/client/dashboard/src/components/ExploreModelTabs.tsx index b9971f63..00f95d7b 100644 --- a/packages/client/dashboard/src/components/ExploreModelTabs.tsx +++ b/packages/client/dashboard/src/components/ExploreModelTabs.tsx @@ -4,6 +4,7 @@ import PlaygroundGraphiQL from './Playground' import { Network } from './Selector/EnumSelect' import styled from 'styled-components' import ExploreInstance from './ExploreInstance' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' export default function ExploreModelTabs({ name, @@ -12,6 +13,7 @@ export default function ExploreModelTabs({ name: string modelId: string }) { + const { currCeramicNode } = useCeramicNodeCtx() return ( @@ -32,7 +34,8 @@ export default function ExploreModelTabs({ - + ) diff --git a/packages/client/dashboard/src/components/Playground.tsx b/packages/client/dashboard/src/components/Playground.tsx index 2478863d..21375180 100644 --- a/packages/client/dashboard/src/components/Playground.tsx +++ b/packages/client/dashboard/src/components/Playground.tsx @@ -43,6 +43,7 @@ export type YogaGraphiQLProps = Omit< title?: string additionalHeaders?: LoadFromUrlOptions['headers'] streamId: string + ceramicNodeURL: string | undefined } const initialQuery = /* GraphQL */ ` @@ -73,7 +74,7 @@ const initialQuery = /* GraphQL */ ` export default function PlaygroundGraphiQL( props: YogaGraphiQLProps ): React.ReactElement { - const { streamId } = props + const { streamId, ceramicNodeURL } = props // const { network } = useCeramicCtx() // const [modelData, setModelData] = useState(); const { selectedDapp } = useSelectedDapp() @@ -155,14 +156,15 @@ export default function PlaygroundGraphiQL( const composeClient = useMemo( () => new ComposeClient({ - ceramic: + ceramic: ceramicNodeURL ? ceramicNodeURL : selectedDapp?.network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, definition: definition as unknown as RuntimeCompositeDefinition, }), - [definition, selectedDapp?.network] + [ceramicNodeURL, definition, selectedDapp?.network] ) + console.log(composeClient) const [composeClientAuthenticated, setComposeClientAuthenticated] = useState(false) diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index d58cf42a..dd4d2d96 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -2,24 +2,30 @@ import PlaygroundGraphiQL from '../components/Playground' import { useOutletContext } from 'react-router-dom' import { DappComposite, ModelStream } from '../types' import CompositePlaygroundGraphiQL from '../components/CompositePlaygroundGraphiQL' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -export default function DappModelPlayground() { +export default function DappModelPlayground () { const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream selectComposite: DappComposite }>() + const { currCeramicNode } = useCeramicNodeCtx() if (selectModel) { return ( -
- +
+
) } if (selectComposite) { return ( -
+
) From 4eb6e4193142c753b99f4ee26cd95709e2de413d Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 3 Jan 2024 19:17:20 +0800 Subject: [PATCH 066/127] add models to dapp and index it in favor models --- .../client/dashboard/src/components/FavoriteModal.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/components/FavoriteModal.tsx b/packages/client/dashboard/src/components/FavoriteModal.tsx index 37db9ff1..7065dbe4 100644 --- a/packages/client/dashboard/src/components/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/FavoriteModal.tsx @@ -14,6 +14,7 @@ import { ModelStream } from '../types' import { shortPubKey } from '../utils/shortPubKey' import dayjs from 'dayjs' import { S3_SCAN_URL } from '../constants' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' export default function FavoriteModal({ closeModal, @@ -38,6 +39,7 @@ export default function FavoriteModal({ function ModelList() { const { s3ModelCollection, selectedDapp } = useSelectedDapp() const session = useSession() + const { currCeramicNode } = useCeramicNodeCtx() const [starModels, setStarModels] = useState>([]) const [personalCollections, setPersonalCollections] = useState< PersonalCollection[] @@ -179,6 +181,7 @@ function ModelList() { @@ -194,9 +197,11 @@ function ModelList() { export function OpsBtns({ modelId, hasIndexed, + ceramicNodeId, }: { modelId: string hasIndexed: boolean + ceramicNodeId?: number }) { const { loadDapps } = useAppCtx() const session = useSession() @@ -212,11 +217,12 @@ export function OpsBtns({ didSession: session.serialize(), }).catch(console.error) } + if (!ceramicNodeId) return try { setAdding(true) const models = selectedDapp.models || [] models.push(modelId) - await updateDapp({ ...selectedDapp, models }, session.serialize()) + await updateDapp({ ...selectedDapp, models }, session.serialize(),ceramicNodeId) await loadDapps() } catch (err) { console.error(err) From 806d03867fca101cbe326a448908a9807a216a1f Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 3 Jan 2024 19:17:33 +0800 Subject: [PATCH 067/127] add models to dapp and index it in favor models --- packages/client/dashboard/src/api/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/api/index.ts b/packages/client/dashboard/src/api/index.ts index ef6e970e..4f629b66 100644 --- a/packages/client/dashboard/src/api/index.ts +++ b/packages/client/dashboard/src/api/index.ts @@ -63,7 +63,7 @@ export function createDapp( export function updateDapp( dapp: ClientDApp, didSession: string, - ceramiceId?:number, + ceramicId?:number, ): AxiosPromise> { if (!dapp.id) throw new Error('dapp id is required') @@ -75,7 +75,7 @@ export function updateDapp( headers: { 'did-session': didSession, }, - data: { ...dapp, ceramiceId, id: Number(dapp.id) }, + data: { ...dapp, ceramicId, id: Number(dapp.id) }, }) } From 970b985f36fdf48df62ef98bbdbfe16cf26bc476 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 3 Jan 2024 19:19:28 +0800 Subject: [PATCH 068/127] playground from private node --- .../CompositePlaygroundGraphiQL.tsx | 53 ++--------- .../dashboard/src/components/Playground.tsx | 95 ++----------------- .../dashboard/src/context/CeramicNodeCtx.tsx | 19 ++-- .../dashboard/src/hooks/useComposeClient.ts | 8 +- 4 files changed, 28 insertions(+), 147 deletions(-) diff --git a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx index 4857f65d..98b74014 100644 --- a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx @@ -9,18 +9,12 @@ import { GraphiQLProps, GraphiQLProvider, } from 'graphiql' -import { useUrlSearchParams } from 'use-url-search-params' - -import { ComposeClient } from '@composedb/client' import { RuntimeCompositeDefinition } from '@composedb/types' import styled from 'styled-components' -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { DID } from 'dids' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { Network } from './Selector/EnumSelect' -import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { createGraphqlDefaultQuery } from '../utils/createDefaultQuery' +import { useComposeClient } from '../hooks/useComposeClient' +import { useUrlSearchParams } from 'use-url-search-params' const type = { query: String, @@ -73,7 +67,6 @@ export default function CompositePlaygroundGraphiQL( props: YogaGraphiQLProps ): React.ReactElement { const { definition, ceramicNodeURL } = props - const { selectedDapp } = useSelectedDapp() const updateQuery = useCallback(async () => { const data = JSON.parse(definition) @@ -84,36 +77,8 @@ export default function CompositePlaygroundGraphiQL( setQuery(initialQuery + defaultQuery) }, [definition]) - const session = useSession() - - const composeClient = useMemo( - () => - new ComposeClient({ - ceramic: ceramicNodeURL ? ceramicNodeURL : - selectedDapp?.network === Network.MAINNET - ? CERAMIC_MAINNET_HOST - : CERAMIC_TESTNET_HOST, - definition: JSON.parse(definition) as RuntimeCompositeDefinition, - }), - [ceramicNodeURL, definition, selectedDapp?.network] - ) - const [composeClientAuthenticated, setComposeClientAuthenticated] = - useState(false) - - const authComposeClients = useCallback(() => { - if (session) { - composeClient.setDID(session.did) - setComposeClientAuthenticated(true) - } else { - const did = new DID() - composeClient.setDID(did) - setComposeClientAuthenticated(false) - } - }, [session, composeClient, setComposeClientAuthenticated]) - - useEffect(() => { - authComposeClients() - }, [authComposeClients]) + const { composeClient, composeClientAuthenticated } = + useComposeClient(definition as unknown as RuntimeCompositeDefinition, ceramicNodeURL) useEffect(() => { localStorage.setItem('graphiql:theme', 'dark') @@ -122,10 +87,12 @@ export default function CompositePlaygroundGraphiQL( const fetcher: Fetcher = useMemo(() => { return function fetcher(graphQLParams: FetcherParams, opts?: FetcherOpts) { - return composeClient.executeQuery( + return composeClient ? composeClient.executeQuery( graphQLParams.query, graphQLParams.variables ) + : + Promise.reject('composeClient is NOT ready yet!') } }, [composeClient]) @@ -144,12 +111,6 @@ export default function CompositePlaygroundGraphiQL( showAttribution: true, }) - // eslint-disable-next-line react-hooks/rules-of-hooks - // const isAuthenticated = useMemo(() => { - // return composeClientAuthenticated && composeClient.context.isAuthenticated() - // }, [composeClient, composeClientAuthenticated]) - // console.log({ isAuthenticated }) - return ( (); const { selectedDapp } = useSelectedDapp() - const [definition, setDefinition] = useState({ - models: { - Profile: { - id: 'kjzl6hvfrbw6cah5z1j58emxetv28ky4hpmmmdbspnb7a2yycpi1o03e2webxrn', - accountRelation: { type: 'single' }, - }, - }, - objects: { - Wallet: { - chain: { - type: 'reference', - refType: 'enum', - refName: 'ChainType', - required: false, - }, - address: { type: 'string', required: true }, - primary: { type: 'boolean', required: true }, - }, - Profile: { - bio: { type: 'string', required: false }, - name: { type: 'string', required: true }, - tags: { - type: 'list', - required: false, - item: { type: 'string', required: false }, - }, - avatar: { type: 'string', required: false }, - wallets: { - type: 'list', - required: false, - item: { - type: 'reference', - refType: 'object', - refName: 'Wallet', - required: false, - }, - }, - version: { type: 'view', viewType: 'documentVersion' }, - }, - }, - enums: { ChainType: ['EVM', 'SOLANA'] }, - accountData: { profile: { type: 'node', name: 'Profile' } }, - }) + const [definition, setDefinition] = useState() const [errMsg, setErrMsg] = useState('') @@ -137,7 +91,7 @@ export default function PlaygroundGraphiQL( const { data } = resp.data setDefinition(data.runtimeDefinition) - const definition = data.runtimeDefinition + const definition = data.runtimeDefinition as unknown as RuntimeCompositeDefinition const modelName = Object.keys(definition.models)[0] const objValues: any[] = Object.values(definition.objects) const modelProperties = Object.entries(objValues[0]) @@ -151,37 +105,8 @@ export default function PlaygroundGraphiQL( } }, [streamId, selectedDapp]) - const session = useSession() - - const composeClient = useMemo( - () => - new ComposeClient({ - ceramic: ceramicNodeURL ? ceramicNodeURL : - selectedDapp?.network === Network.MAINNET - ? CERAMIC_MAINNET_HOST - : CERAMIC_TESTNET_HOST, - definition: definition as unknown as RuntimeCompositeDefinition, - }), - [ceramicNodeURL, definition, selectedDapp?.network] - ) - console.log(composeClient) - const [composeClientAuthenticated, setComposeClientAuthenticated] = - useState(false) - - const authComposeClients = useCallback(() => { - if (session) { - composeClient.setDID(session.did) - setComposeClientAuthenticated(true) - } else { - const did = new DID() - composeClient.setDID(did) - setComposeClientAuthenticated(false) - } - }, [session, composeClient, setComposeClientAuthenticated]) - - useEffect(() => { - authComposeClients() - }, [authComposeClients]) + const { composeClient, composeClientAuthenticated } = + useComposeClient(definition, ceramicNodeURL) useEffect(() => { localStorage.setItem('graphiql:theme', 'dark') @@ -190,10 +115,12 @@ export default function PlaygroundGraphiQL( const fetcher: Fetcher = useMemo(() => { return function fetcher(graphQLParams: FetcherParams, opts?: FetcherOpts) { - return composeClient.executeQuery( + return composeClient ? composeClient.executeQuery( graphQLParams.query, graphQLParams.variables ) + : + Promise.reject('composeClient is NOT ready yet!') } }, [composeClient]) @@ -212,12 +139,6 @@ export default function PlaygroundGraphiQL( showAttribution: true, }) - // eslint-disable-next-line react-hooks/rules-of-hooks - // const isAuthenticated = useMemo(() => { - // return composeClientAuthenticated && composeClient.context.isAuthenticated() - // }, [composeClient, composeClientAuthenticated]) - // console.log({ isAuthenticated }) - if (loading) { return Loading } diff --git a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx index 6ea96992..aec8d196 100644 --- a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx +++ b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx @@ -4,12 +4,12 @@ import React, { useContext, useEffect, useMemo, - useState, + useState } from 'react' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { CeramicDto } from '../types' -import { getCeramicNode, getCeramicNodes } from '../api/ceramicNode' +import { getCeramicNodes } from '../api/ceramicNode' export interface CeramicNodeContextData { loadingCeramicNodes: boolean @@ -20,8 +20,8 @@ export interface CeramicNodeContextData { const CeramicNodeContext = createContext(null) -export default function CeramicNodeProvider({ - children, +export default function CeramicNodeProvider ({ + children }: { children: React.ReactNode }) { @@ -42,8 +42,8 @@ export default function CeramicNodeProvider({ setCeramicNodes(resp.data.data) }, [session]) - const currCeramicNode = useMemo(()=>ceramicNodes[0], [ceramicNodes]) - + const currCeramicNode = useMemo(() => ceramicNodes[0], [ceramicNodes]) + useEffect(() => { setLoadingCeramicNodes(true) loadCeramicNodes() @@ -53,7 +53,6 @@ export default function CeramicNodeProvider({ }) }, [loadCeramicNodes]) - useEffect(() => { if (!session) { setCeramicNodes([]) @@ -66,7 +65,7 @@ export default function CeramicNodeProvider({ ceramicNodes, currCeramicNode, loadCeramicNodes, - loadingCeramicNodes, + loadingCeramicNodes }} > {children} @@ -74,12 +73,12 @@ export default function CeramicNodeProvider({ ) } -export function useCeramicNodeCtx() { +export function useCeramicNodeCtx () { const context = useContext(CeramicNodeContext) if (!context) { throw new Error('Missing connection context') } return { - ...context, + ...context } } diff --git a/packages/client/dashboard/src/hooks/useComposeClient.ts b/packages/client/dashboard/src/hooks/useComposeClient.ts index 8e059697..a0bd561f 100644 --- a/packages/client/dashboard/src/hooks/useComposeClient.ts +++ b/packages/client/dashboard/src/hooks/useComposeClient.ts @@ -7,22 +7,22 @@ import useSelectedDapp from './useSelectedDapp' import { Network } from '../components/Selector/EnumSelect' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' -export function useComposeClient(definition: RuntimeCompositeDefinition) { +export function useComposeClient(definition: RuntimeCompositeDefinition | undefined, ceramicNodeURL: string|undefined = undefined) { const { selectedDapp } = useSelectedDapp() const session = useSession() - + const composeClient = useMemo( () => definition ? new ComposeClient({ - ceramic: + ceramic: ceramicNodeURL ? ceramicNodeURL : selectedDapp?.network === Network.MAINNET ? CERAMIC_MAINNET_HOST : CERAMIC_TESTNET_HOST, definition, }) : null, - [definition, selectedDapp?.network] + [ceramicNodeURL, definition, selectedDapp?.network] ) const [composeClientAuthenticated, setComposeClientAuthenticated] = useState(false) From 39f4448a8f81e546d9fe2c77475f27ec817cb042 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 4 Jan 2024 18:28:14 +0800 Subject: [PATCH 069/127] remove unused components --- .../src/components/ExploreInstance.tsx | 134 ------------------ .../src/components/ExploreModelTabs.tsx | 122 ---------------- .../dashboard/src/components/Instance.tsx | 131 ----------------- 3 files changed, 387 deletions(-) delete mode 100644 packages/client/dashboard/src/components/ExploreInstance.tsx delete mode 100644 packages/client/dashboard/src/components/ExploreModelTabs.tsx delete mode 100644 packages/client/dashboard/src/components/Instance.tsx diff --git a/packages/client/dashboard/src/components/ExploreInstance.tsx b/packages/client/dashboard/src/components/ExploreInstance.tsx deleted file mode 100644 index 884ca756..00000000 --- a/packages/client/dashboard/src/components/ExploreInstance.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from 'react' -import { ModelMid } from '../types' -import { PageSize, getModelMid } from '../api' -import styled from 'styled-components' -import InfiniteScroll from 'react-infinite-scroll-component' -import ModelStreamList from './ModelStreamList' - -import { AxiosError } from 'axios' -import { Network } from './Selector/EnumSelect' -import useSelectedDapp from '../hooks/useSelectedDapp' - -export default function ExploreInstance({ streamId }: { streamId: string }) { - const pageNum = useRef(1) - const { selectedDapp } = useSelectedDapp() - const [hasMore, setHasMore] = useState(true) - const [streams, setStreams] = useState>([]) - const [loading, setLoading] = useState(false) - const [errMsg, setErrMsg] = useState('') - - const fetchMoreStreams = useCallback( - async (pageNumber: number) => { - if (!streamId) return - const resp = await getModelMid({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - modelId: streamId, - pageNumber, - }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams([...streams, ...list]) - }, - [streams, streamId, selectedDapp] - ) - const fetchModelMid = useCallback(async () => { - if (!streamId) return - try { - setLoading(true) - setErrMsg('') - const resp = await getModelMid({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - modelId: streamId, - }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams(list) - } catch (error) { - const err = error as AxiosError - setErrMsg((err.response?.data as any).message || err.message) - } finally { - setLoading(false) - } - }, [streamId, selectedDapp]) - - useEffect(() => { - fetchModelMid() - }, [fetchModelMid]) - - if (loading) { - return ( - - Loading... - - ) - } - - if (errMsg) { - return ( - -
- {errMsg} - - ) - } - - return ( - - { - console.log('next') - pageNum.current += 1 - fetchMoreStreams(pageNum.current) - }} - hasMore={hasMore} - loader={Loading...} - scrollableTarget="explore-modal" - > - {streamId && } - - {!hasMore && no more data} - - ) -} - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` - -const PageBox = styled.div` - height: calc(100vh - 200px); - overflow: auto; - .title-box { - display: flex; - align-items: center; - justify-content: space-between; - gap: 20px; - padding: 20px 0; - box-sizing: border-box; - - .title { - width: 100%; - display: flex; - align-items: center; - justify-content: space-between; - margin: 0; - font-weight: 700; - font-size: 24px; - line-height: 28px; - font-style: italic; - color: #ffffff; - - button { - background: #ffffff; - } - - h3 { - margin: 0; - padding: 0; - } - } - } -` diff --git a/packages/client/dashboard/src/components/ExploreModelTabs.tsx b/packages/client/dashboard/src/components/ExploreModelTabs.tsx deleted file mode 100644 index 00f95d7b..00000000 --- a/packages/client/dashboard/src/components/ExploreModelTabs.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { Tabs, TabList, Tab, TabPanel } from 'react-aria-components' -import Definition from './Definition' -import PlaygroundGraphiQL from './Playground' -import { Network } from './Selector/EnumSelect' -import styled from 'styled-components' -import ExploreInstance from './ExploreInstance' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' - -export default function ExploreModelTabs({ - name, - modelId, -}: { - name: string - modelId: string -}) { - const { currCeramicNode } = useCeramicNodeCtx() - return ( - - - - Model Definition - Model Instance Documents - Model Playground - -
- - -
-
- - - - - - - - - -
- ) -} - -const ModelModalBox = styled.div` - display: flex; - align-items: center; - justify-content: space-between; - - .react-aria-TabList { - border: 1px solid #39424c; - border-radius: 100px; - padding: 2px; - - &[aria-orientation='horizontal'] { - .react-aria-Tab { - border-bottom: none; - } - } - } - .react-aria-Tab { - padding: 10px; - cursor: default; - outline: none; - position: relative; - font-weight: 700; - font-size: 18px; - line-height: 21px; - color: #718096; - cursor: pointer; - transition: color 200ms; - padding: 20px 15px; - - &[data-hovered], - &:focus { - color: var(--text-color-hover); - } - - &[aria-selected='true'] { - --border-color: var(--highlight-color); - color: var(--text-color-selected); - } - - &[aria-disabled] { - color: var(--text-color-disabled); - &[aria-selected='true'] { - --border-color: var(--text-color-disabled); - } - } - - &[data-focus-visible]:after { - content: ''; - position: absolute; - inset: 4px; - border-radius: 4px; - border: 2px solid var(--highlight-color); - } - } - - .react-aria-Tab { - padding: 6px 20px; - font-weight: 400; - font-size: 16px; - line-height: 24px; - &[aria-selected='true'] { - color: #14171a; - background-color: #ffffff; - border-radius: 100px; - } - } - - .react-aria-TabPanel { - margin-top: 4px; - padding: 20px 0 0 0; - border-radius: 4px; - outline: none; - flex-grow: 1; - - &[data-focus-visible] { - box-shadow: inset 0 0 0 2px var(--highlight-color); - } - } -` diff --git a/packages/client/dashboard/src/components/Instance.tsx b/packages/client/dashboard/src/components/Instance.tsx deleted file mode 100644 index 338e9171..00000000 --- a/packages/client/dashboard/src/components/Instance.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from 'react' -import { ModelMid } from '../types' -import { PageSize, getModelMid } from '../api' -import styled from 'styled-components' -import InfiniteScroll from 'react-infinite-scroll-component' -import ModelStreamList from './ModelStreamList' - -import { AxiosError } from 'axios' -import { Network } from './Selector/EnumSelect' -import useSelectedDapp from '../hooks/useSelectedDapp' - -export default function Instance({ streamId }: { streamId: string }) { - const pageNum = useRef(1) - const { selectedDapp } = useSelectedDapp() - const [hasMore, setHasMore] = useState(true) - const [streams, setStreams] = useState>([]) - const [loading, setLoading] = useState(false) - const [errMsg, setErrMsg] = useState('') - - const fetchMoreStreams = useCallback( - async (pageNumber: number) => { - if (!streamId) return - const resp = await getModelMid({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - modelId: streamId, - pageNumber, - }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams([...streams, ...list]) - }, - [streams, streamId, selectedDapp] - ) - const fetchModelMid = useCallback(async () => { - if (!streamId) return - try { - setLoading(true) - setErrMsg('') - const resp = await getModelMid({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - modelId: streamId, - }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams(list) - } catch (error) { - const err = error as AxiosError - setErrMsg((err.response?.data as any).message || err.message) - } finally { - setLoading(false) - } - }, [streamId, selectedDapp]) - - useEffect(() => { - fetchModelMid() - }, [fetchModelMid]) - - if (loading) { - return ( - - Loading... - - ) - } - - if (errMsg) { - return ( - -
- {errMsg} - - ) - } - - return ( - - { - console.log('next') - pageNum.current += 1 - fetchMoreStreams(pageNum.current) - }} - hasMore={hasMore} - loader={Loading...} - > - {streamId && } - - {!hasMore && no more data} - - ) -} - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` - -const PageBox = styled.div` - .title-box { - display: flex; - align-items: center; - justify-content: space-between; - gap: 20px; - padding: 20px 0; - box-sizing: border-box; - - .title { - width: 100%; - display: flex; - align-items: center; - justify-content: space-between; - margin: 0; - font-weight: 700; - font-size: 24px; - line-height: 28px; - font-style: italic; - color: #ffffff; - - button { - background: #ffffff; - } - - h3 { - margin: 0; - padding: 0; - } - } - } -` From 9c4475606ad4239d6a22d1e361a4c3902764fd7c Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 4 Jan 2024 18:45:12 +0800 Subject: [PATCH 070/127] load mids from private node --- .../src/components/ModelInstance.tsx | 378 ++++++++++-------- .../src/components/ModelStreamList.tsx | 85 ++-- .../dashboard/src/hooks/useComposeClient.ts | 19 +- 3 files changed, 284 insertions(+), 198 deletions(-) diff --git a/packages/client/dashboard/src/components/ModelInstance.tsx b/packages/client/dashboard/src/components/ModelInstance.tsx index b5be399c..e09c19b4 100644 --- a/packages/client/dashboard/src/components/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/ModelInstance.tsx @@ -1,12 +1,12 @@ -import { useCallback, useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' // import ModelStreamList from '../../components/ModelStreamList' import { AxiosError } from 'axios' import { Network } from './Selector/EnumSelect' -import { ModelMid, ModelStream } from '../types' -import { getModelMid, PageSize, queryModelGraphql } from '../api' +import { ModelStream } from '../types' +import { queryModelGraphql } from '../api' import ModelStreamList from './ModelStreamList' import { Button } from 'react-aria-components' import PlusIcon from './Icons/PlusIcon' @@ -14,68 +14,23 @@ import ModelInstanceFormModal from './ModelInstanceFormModal' import useSelectedDapp from '../hooks/useSelectedDapp' import { useComposeClient } from '../hooks/useComposeClient' import { toast } from 'react-toastify' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { lowerFirst } from 'lodash' +import { Stream } from '@ceramicnetwork/common' -export default function Instance({ +export default function Instance ({ streamId, network, schema, - name, + name }: { streamId: string network: Network schema: ModelStream['stream_content']['schema'] name: string }) { - const pageNum = useRef(1) - // const { network } = useCeramicCtx() - const [hasMore, setHasMore] = useState(true) - const [streams, setStreams] = useState>([]) - const [loading, setLoading] = useState(false) - const [errMsg, setErrMsg] = useState('') - - const fetchMoreStreams = useCallback( - async (pageNumber: number) => { - if (!streamId) return - const resp = await getModelMid({ - network, - modelId: streamId, - pageNumber, - }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams([...streams, ...list]) - }, - [streams, streamId, network] - ) - const fetchModelMid = useCallback(async () => { - if (!streamId) return - try { - setLoading(true) - setErrMsg('') - const resp = await getModelMid({ network, modelId: streamId }) - const list = resp.data.data - setHasMore(list.length >= PageSize) - setStreams(list) - } catch (error) { - const err = error as AxiosError - setErrMsg((err.response?.data as any).message || err.message) - } finally { - setLoading(false) - } - }, [streamId, network]) - - useEffect(() => { - fetchModelMid() - }, [fetchModelMid]) - - // stream form - const [isOpenStreamForm, setIsOpenStreamForm] = useState(false) - const [formType, setFormType] = useState<'create' | 'update'>('create') - const [formData, setFormData] = useState({}) - const [formDisabled, setFormDisabled] = useState(false) - const [updateStreamId, setUpdateStreamId] = useState('') - const [definition, setDefinition] = useState() const { selectedDapp } = useSelectedDapp() + const [definition, setDefinition] = useState() useEffect(() => { ;(async () => { if (!streamId || !selectedDapp) { @@ -95,106 +50,197 @@ export default function Instance({ })() }, [streamId, selectedDapp]) - const { composeClient, composeClientAuthenticated } = - useComposeClient(definition) + const { currCeramicNode } = useCeramicNodeCtx() + const { + ceramicClient, + loadMultiStreams, + composeClient, + composeClientAuthenticated + } = useComposeClient(definition, currCeramicNode?.serviceUrl) - const createStream = useCallback(async () => { - if (!composeClientAuthenticated || !composeClient) { - toast.error('composeClient not authenticated') - return - } - if (!name) { - toast.error('model name not found') - return - } - const mutation = ` - mutation create${name}($input: Create${name}Input!) { - create${name}(input: $input) { - document { - id + const PAGE_SIZE = 10 + const [hasMore, setHasMore] = useState(false) + const [endCursor, setEndCursor] = useState('') + const [streams, setStreams] = useState>() + const [loading, setLoading] = useState(false) + const [errMsg, setErrMsg] = useState('') + + const queryStream = useCallback( + async ({ + first = PAGE_SIZE, + after = '' + }: { + first?: number + after?: string + }) => { + if (!composeClientAuthenticated || !composeClient) { + // toast.error('composeClient not authenticated') + return + } + if (!name) { + toast.error('model name not found') + return + } + const listQueryName = `${lowerFirst(name)}Index` + const query = ` + query { + ${listQueryName}(first: ${first}, after: "${after}") { + edges { + node { + id + } + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } } } + ` + const res = await composeClient.executeQuery(query) + if (res?.errors && res?.errors.length > 0) { + toast.error(res?.errors[0]?.message) + } else { + const data: { edges: any; pageInfo: any } = res?.data?.[ + listQueryName + ] as { edges: any; pageInfo: any } + if (!data) return + if (data.edges) + return { + mids: data.edges?.map((edge: any) => edge.node) || [], + pageInfo: data.pageInfo || {} + } } - ` - setFormDisabled(true) - const res = await composeClient.executeQuery(mutation, { - input: { - content: { ...formData }, - }, - }) - if (res?.errors && res?.errors.length > 0) { - toast.error(res?.errors[0]?.message) - } else { - toast.success('Submitted successfully!') - setIsOpenStreamForm(false) - fetchModelMid() - } - setFormDisabled(false) - }, [formData, composeClientAuthenticated, composeClient, name, fetchModelMid]) + }, + [composeClientAuthenticated, composeClient] + ) - const updateStream = useCallback(async () => { - if (!composeClientAuthenticated || !composeClient) { - toast.error('composeClient not authenticated') - return + const fetchMoreMids = useCallback(async () => { + if (!endCursor) return + const data = await queryStream({ after: endCursor }) + if (data) { + setHasMore(data.pageInfo.hasNextPage || false) + setEndCursor(data.pageInfo.endCursor || '') + const ids = data.mids.map((item: { id: any }) => item.id) + const newStreams = await loadMultiStreams(ids) + setStreams({ ...streams, ...newStreams }) } - if (!name) { - toast.error('model name not found') - return + }, [queryStream, endCursor, streams]) + + const fetchMids = useCallback(async () => { + try { + setLoading(true) + setErrMsg('') + const data = await queryStream({}) + if (data) { + setHasMore(data.pageInfo.hasNextPage || false) + setEndCursor(data.pageInfo.endCursor || '') + const ids = data.mids.map((item: { id: any }) => item.id) + const newStreams = await loadMultiStreams(ids) + setStreams(newStreams) + } + } catch (error) { + const err = error as AxiosError + setErrMsg((err.response?.data as any).message || err.message) + } finally { + setLoading(false) } - const mutation = ` - mutation update${name}($input: Update${name}Input!) { - update${name}(input: $input) { - document { - id + }, [queryStream]) + + useEffect(() => { + fetchMids() + }, [fetchMids]) + + const createStream = useCallback( + async (formData = {}) => { + if (!composeClientAuthenticated || !composeClient) { + toast.error('composeClient not authenticated') + return + } + if (!name) { + toast.error('model name not found') + return + } + const mutation = ` + mutation create${name}($input: Create${name}Input!) { + create${name}(input: $input) { + document { + id + } } } + ` + setFormDisabled(true) + const res = await composeClient.executeQuery(mutation, { + input: { + content: { ...formData } + } + }) + if (res?.errors && res?.errors.length > 0) { + toast.error(res?.errors[0]?.message) + } else { + toast.success('Submitted successfully!') + setIsOpenStreamForm(false) + fetchMids() } - ` - setFormDisabled(true) - const res = await composeClient.executeQuery(mutation, { - input: { - id: updateStreamId, - content: { ...formData }, - }, - }) - if (res?.errors && res?.errors.length > 0) { - toast.error(res?.errors[0]?.message) - } else { - toast.success('Submitted successfully!') - setStreams( - (streams) => - streams?.map((stream: any) => { - if (stream.streamId === updateStreamId) { - return { - ...stream, - streamContent: { - ...(stream?.streamContent || {}), - ...formData, - }, - } + setFormDisabled(false) + }, + [composeClientAuthenticated, composeClient, name, fetchMids] + ) + + const updateStream = useCallback( + async (updateStreamId: string, formData = {}) => { + if (!composeClientAuthenticated || !composeClient) { + toast.error('composeClient not authenticated') + return + } + if (!name) { + toast.error('model name not found') + return + } + const mutation = ` + mutation update${name}($input: Update${name}Input!) { + update${name}(input: $input) { + document { + id } - return stream - }) || [] - ) - setIsOpenStreamForm(false) - } - setFormDisabled(false) - }, [ - updateStreamId, - formData, - composeClientAuthenticated, - composeClient, - name, - ]) + } + } + ` + setFormDisabled(true) + const res = await composeClient.executeQuery(mutation, { + input: { + id: updateStreamId, + content: { ...formData } + } + }) + if (res?.errors && res?.errors.length > 0) { + toast.error(res?.errors[0]?.message) + } else { + toast.success('Submitted successfully!') + setIsOpenStreamForm(false) + } + setFormDisabled(false) + }, + [composeClientAuthenticated, composeClient, name] + ) + + const [isOpenStreamForm, setIsOpenStreamForm] = useState(false) + const [formType, setFormType] = useState<'create' | 'update'>('create') + const [formData, setFormData] = useState({}) + const [formDisabled, setFormDisabled] = useState(false) + const [updateStreamId, setUpdateStreamId] = useState('') const submitStream = useCallback(async () => { if (formType === 'create') { - await createStream() + await createStream(formData) } if (formType === 'update') { - await updateStream() + await updateStream(updateStreamId, formData) } - }, [formType, createStream, updateStream]) + }, [formType, createStream, formData, updateStream, updateStreamId]) if (loading) { return ( @@ -207,7 +253,7 @@ export default function Instance({ if (errMsg) { return ( -
+
{errMsg} ) @@ -222,7 +268,7 @@ export default function Instance({ onOpenChange={setIsOpenStreamForm} schema={schema} formData={formData} - onChange={(e) => setFormData(e.formData)} + onChange={e => setFormData(e.formData)} onSubmit={() => submitStream()} /> @@ -239,29 +285,37 @@ export default function Instance({ )} - { - pageNum.current += 1 - fetchMoreStreams(pageNum.current) - }} - hasMore={hasMore} - loader={Loading...} - > - {streamId && ( - { - setFormType('update') - setUpdateStreamId(stream?.streamId) - setFormData(stream?.streamContent) - setIsOpenStreamForm(true) - }} - /> - )} - + {streams && Object.keys(streams).length > 0 && ( + { + fetchMoreMids() + }} + hasMore={hasMore} + loader={Loading...} + > + {streamId && ( + { + setFormType('update') + setUpdateStreamId(stream?.id.toString()) + setFormData(stream?.content) + setIsOpenStreamForm(true) + }} + // pinAction={(stream: Stream, pin:boolean =true) => { + // if (!stream?.id || !ceramicClient) return + // if (pin) + // ceramicClient?.pin.add(stream.id) + // else + // ceramicClient?.pin.rm(stream.id) + // }} + /> + )} + + )} {!hasMore && no more data} ) diff --git a/packages/client/dashboard/src/components/ModelStreamList.tsx b/packages/client/dashboard/src/components/ModelStreamList.tsx index 1ed77fce..fbd9a140 100644 --- a/packages/client/dashboard/src/components/ModelStreamList.tsx +++ b/packages/client/dashboard/src/components/ModelStreamList.tsx @@ -1,6 +1,5 @@ import styled from 'styled-components' import { TableBox } from './TableBox' -import { ModelMid } from '../types' import dayjs from 'dayjs' import { shortPubKey } from '../utils/shortPubKey' import UserAvatarStyled from './UserAvatarStyled' @@ -11,17 +10,21 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { useMemo } from 'react' import { S3_SCAN_URL } from '../constants' import useSelectedDapp from '../hooks/useSelectedDapp' +import { Stream } from '@ceramicnetwork/common' +import PlusIcon from './Icons/PlusIcon' -export default function ModelStreamList({ +export default function ModelStreamList ({ modelId, data, editable, editAction, + pinAction }: { modelId: string - data: ModelMid[] + data: Record editable?: boolean - editAction?: (stream: ModelMid) => void + editAction?: (stream: Stream) => void + pinAction?: (stream: Stream) => void }) { const session = useSession() const showAction = useMemo( @@ -35,58 +38,72 @@ export default function ModelStreamList({ Stream ID - DID + Controller Create Time Update Time {showAction && Action} - {data.map((item) => { + {Object.keys(data).map(streamId => { + const stream = data[streamId] + const controller = stream.metadata.controller + const logs = stream.state.log return ( - + -
- {shortPubKey(item.streamId, { +
+ {shortPubKey(streamId, { len: 8, - split: '-', + split: '-' })}
- - - + + + - -
- -
+ + {logs && logs.length > 0 && logs[0]?.timestamp &&( +
+ +
+ )} - -
- -
+ + {logs && logs.length > 0 && logs[logs.length-1]?.timestamp && ( +
+ +
+ )} {showAction && ( - - {session?.id === item.controllerDid ? ( - + {editAction && session?.id === controller && ( + { - if (editAction) editAction(item) + if (editAction) editAction(stream) }} > - - ) : ( - '-' + + )} + {pinAction && ( + { + if (pinAction) pinAction(stream) + }} + > + + )} )} @@ -183,7 +200,7 @@ const TableContainer = styled.table` color: #718096; } ` -const EditBtn = styled(Button)` +const ActionBtn = styled(Button)` margin: 0; padding: 0; ` diff --git a/packages/client/dashboard/src/hooks/useComposeClient.ts b/packages/client/dashboard/src/hooks/useComposeClient.ts index a0bd561f..2bafc705 100644 --- a/packages/client/dashboard/src/hooks/useComposeClient.ts +++ b/packages/client/dashboard/src/hooks/useComposeClient.ts @@ -6,11 +6,21 @@ import { DID } from 'dids' import useSelectedDapp from './useSelectedDapp' import { Network } from '../components/Selector/EnumSelect' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' +import { CeramicClient } from '@ceramicnetwork/http-client' export function useComposeClient(definition: RuntimeCompositeDefinition | undefined, ceramicNodeURL: string|undefined = undefined) { const { selectedDapp } = useSelectedDapp() const session = useSession() - + const ceramicClient = useMemo( + () => + new CeramicClient( + ceramicNodeURL ? ceramicNodeURL : + selectedDapp?.network === Network.MAINNET + ? CERAMIC_MAINNET_HOST + : CERAMIC_TESTNET_HOST + ), + [ceramicNodeURL, selectedDapp?.network] + ) const composeClient = useMemo( () => definition @@ -43,5 +53,10 @@ export function useComposeClient(definition: RuntimeCompositeDefinition | undefi authComposeClients() }, [authComposeClients]) - return { composeClient, composeClientAuthenticated } + async function loadMultiStreams(ids = []) { + const queries = ids.map((streamId) => ({ streamId })) + // This will return an Object of stream ID keys to stream values + return await ceramicClient.multiQuery(queries) + } + return { ceramicClient, loadMultiStreams, composeClient, composeClientAuthenticated } } From 6ec5cf425807a1def802609a6c429aa7b942d161 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 5 Jan 2024 11:54:24 +0800 Subject: [PATCH 071/127] add admin setting to ceramic nodes --- .../src/components/CreateCeramicNodeModal.tsx | 27 +++++++++++++++++-- .../src/components/Selector/EnumSelect.tsx | 4 +-- .../dashboard/src/container/CeramicNodes.tsx | 12 +++++++-- packages/client/dashboard/src/types.d.ts | 9 +++++++ 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx index fdfba324..3e9d3374 100644 --- a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx @@ -8,7 +8,8 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { createCeramicNode } from '../api/ceramicNode' -import { CeramicNetwork } from '../types.d' +import { CeramicDBType, CeramicNetwork } from '../types.d' +import { Checkbox } from 'react-aria-components' export default function CreateCeramicNodeModal ({ fixedNetwork, @@ -23,6 +24,10 @@ export default function CreateCeramicNodeModal ({ const [network, setNetwork] = useState( fixedNetwork || CeramicNetwork.TESTNET ) + const [dbType, setDbType] = useState(CeramicDBType.SQLITE) + const [historicalSync, setHistoricalSync] = useState( + true + ) const { signIn } = useAuthentication() const session = useSession() @@ -38,7 +43,12 @@ export default function CreateCeramicNodeModal ({ try { setSubmitting(true) const resp = await createCeramicNode( - { name: nodeName, network }, + { + name: nodeName, + network, + ceramicEnableHistoricalSync: true, + ceramicDbType: dbType + }, session.serialize() ) if (resp.data.code !== 0) { @@ -77,6 +87,19 @@ export default function CreateCeramicNodeModal ({ values={[CeramicNetwork.TESTNET, CeramicNetwork.MAINNET]} /> )} + + + + Enable Historic Sync +
diff --git a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx b/packages/client/dashboard/src/components/Selector/EnumSelect.tsx index ee45677b..b3652a68 100644 --- a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx +++ b/packages/client/dashboard/src/components/Selector/EnumSelect.tsx @@ -10,7 +10,7 @@ import { import styled from 'styled-components' import SelectorIcon from './SelectorIcon' import { useMemo, useState } from 'react' -import { CeramicNetwork } from '../../types' +import { CeramicDBType, CeramicNetwork } from '../../types' export enum Stage { DEVELOPMENT = 'Under development', @@ -45,7 +45,7 @@ export enum GraphqlGenTypeServer { } export default function EnumSelector< - T extends Stage | Network | CeramicNetwork | AppType | GraphqlGenType + T extends Stage | Network | CeramicNetwork | CeramicDBType | AppType | GraphqlGenType >({ value, setValue, diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 39a1be8d..752deec6 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -190,10 +190,18 @@ function CeramicNodeInfo ({ node }: { node: CeramicDto }) {
{node.privateKey}
-
+ {/*
API Key:
{node.apiKey}
+
*/} +
+
DB Type:
+
{node.serviceK8sMetadata.ceramicDbType}
+
+
+
Historical Sync:
+
{node.serviceK8sMetadata.ceramicEnableHistoricalSync.toString()}
) : null} @@ -379,7 +387,7 @@ const NodeInfoBox = styled.div` .node-info-key { flex-shrink: 0; text-align: right; - width: 90px; + width: 120px; color: #718094; } .node-info-value { diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 05c1248a..f08c1922 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -111,6 +111,13 @@ export type CeramicDto = { export type CeramicRequestDto = { name: string; network: CeramicNetwork; + ceramicDbType?: CeramicDBType; + ceramicEnableHistoricalSync?: boolean; +} + +export enum CeramicDBType { + SQLITE ='sqlite', + PGSQL = 'postgres', } export enum CeramicNetwork { @@ -134,4 +141,6 @@ export type CeramicServiceK8sMetadata = { keramikObjectName: string; ceramicLoadbalanceHost: string; ceramicLoadbalancePort: number; + ceramicDbType: CeramicDBType; + ceramicEnableHistoricalSync: boolean; } From 726b4403443ee44cf4c09c5e351fddf229872120 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 5 Jan 2024 13:04:10 +0800 Subject: [PATCH 072/127] remove sqlite from node db type --- .../dashboard/src/components/CreateCeramicNodeModal.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx index 3e9d3374..cf18cda9 100644 --- a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx @@ -24,7 +24,7 @@ export default function CreateCeramicNodeModal ({ const [network, setNetwork] = useState( fixedNetwork || CeramicNetwork.TESTNET ) - const [dbType, setDbType] = useState(CeramicDBType.SQLITE) + const [dbType, setDbType] = useState(CeramicDBType.PGSQL) const [historicalSync, setHistoricalSync] = useState( true ) @@ -90,7 +90,8 @@ export default function CreateCeramicNodeModal ({ */}
DB Type:
-
{node.serviceK8sMetadata.ceramicDbType}
+
+ {node.serviceK8sMetadata.ceramicDbType} +
Historical Sync:
-
{node.serviceK8sMetadata.ceramicEnableHistoricalSync.toString()}
+
+ {node.serviceK8sMetadata.ceramicEnableHistoricalSync.toString()} +
) : null} - {node?.id && node.status === CeramicStatus.RUNNING && session?.did && ( - - - - )} + {node?.id && + (node.status === CeramicStatus.STARTING || + node.status === CeramicStatus.RUNNING) && + session?.did && ( + + + + )} ) } const Container = styled.main` + height: 100%; display: flex; flex-direction: row; gap: 20px; - margin-top: 25px; - margin-bottom: 25px; justify-content: stretch; + padding: 20px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; ` const ListBox = styled.div` background: #1b1e23; @@ -331,6 +344,7 @@ const NodesListBox = styled.div` ` const NodeInfoContainer = styled.div` + height: 100%; display: flex; flex-direction: column; gap: 20px; @@ -342,10 +356,11 @@ const NodeInfoBox = styled.div` border-radius: 20px; border: 1px solid #39424c; background: #1b1e23; - width: calc(100%-280px); display: flex; flex-direction: column; gap: 20px; + flex-shrink: 0; + flex-grow: 0; .title { display: flex; flex-direction: row; @@ -402,8 +417,8 @@ const NodeInfoBox = styled.div` } ` const NodeTermnalBox = styled.div` - width: calc(100%-280px); - height: 600px; + flex-shrink: 1; + flex-grow: 1; padding: 20px; background-color: black; border-radius: 20px; diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index f08c1922..5e6ddc46 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -128,6 +128,7 @@ export enum CeramicNetwork { export enum CeramicStatus { PREPARING = 'Preparing', + STARTING = 'Starting', RUNNING = 'Running', // PAUSE = 'Pause', // RESUMING = 'Resuming', From 2a14067e507ce9571f4ab5feb51ed8d936c4c5d8 Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 9 Jan 2024 12:45:52 +0800 Subject: [PATCH 074/127] fix node status restrictions --- .../src/components/DeleteCeramicNodeModal.tsx | 3 +- .../src/components/FavoriteModal.tsx | 13 +++++--- .../dashboard/src/components/ModelList.tsx | 7 +++-- .../src/components/NoCeramicNodeModal.tsx | 30 ++++++++++++++----- .../dashboard/src/container/CeramicNodes.tsx | 26 ++++++++-------- .../dashboard/src/container/ExploreModel.tsx | 26 +++++++++------- .../dashboard/src/context/CeramicNodeCtx.tsx | 7 +++-- 7 files changed, 71 insertions(+), 41 deletions(-) diff --git a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx b/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx index 12a3d05b..608053f8 100644 --- a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx @@ -30,7 +30,8 @@ export default function DeleteCeramicNodeModal ({ signIn() return } - if (nodeName !== node.name) { + if (nodeName.trim() !== node.name.trim()) { + console.log('Node Name: ', nodeName, node.name) alert('Node name is not correct!') return } diff --git a/packages/client/dashboard/src/components/FavoriteModal.tsx b/packages/client/dashboard/src/components/FavoriteModal.tsx index 7065dbe4..2842dacd 100644 --- a/packages/client/dashboard/src/components/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/FavoriteModal.tsx @@ -10,7 +10,7 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { PersonalCollection, useAppCtx } from '../context/AppCtx' import { Network } from './Selector/EnumSelect' import { getStarModels, startIndexModel, updateDapp } from '../api' -import { ModelStream } from '../types' +import { CeramicStatus, ModelStream } from '../types.d' import { shortPubKey } from '../utils/shortPubKey' import dayjs from 'dayjs' import { S3_SCAN_URL } from '../constants' @@ -181,7 +181,12 @@ function ModelList() { @@ -230,7 +235,7 @@ export function OpsBtns({ setAdding(false) } }, - [hasIndexed, loadDapps, selectedDapp, session] + [ceramicNodeId, hasIndexed, loadDapps, selectedDapp, session] ) return (
@@ -295,7 +300,7 @@ const ListBox = styled.div` .btns { display: flex; align-items: center; - + .loading { width: 20px; } diff --git a/packages/client/dashboard/src/components/ModelList.tsx b/packages/client/dashboard/src/components/ModelList.tsx index a5a65784..ec4c4bb2 100644 --- a/packages/client/dashboard/src/components/ModelList.tsx +++ b/packages/client/dashboard/src/components/ModelList.tsx @@ -8,7 +8,7 @@ import PlusIcon from './Icons/PlusIcon' import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import useSelectedDapp from '../hooks/useSelectedDapp' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { DappComposite, ModelStream } from '../types' +import { CeramicStatus, DappComposite, ModelStream } from '../types.d' import { getStarModels, getDappComposites, deleteDappComposites } from '../api' import { Network } from './Selector/EnumSelect' import TrashIcon from './Icons/TrashIcon' @@ -43,7 +43,7 @@ export default function ModelList ({ const session = useSession() const { loadDapps, currDapp } = useAppCtx() const { appId, selectedDapp } = useSelectedDapp() - const { ceramicNodes } = useCeramicNodeCtx() + const { currCeramicNode } = useCeramicNodeCtx() const navigate = useNavigate() const [loading, setLoading] = useState(false) const [dappModels, setDappModels] = useState() @@ -178,7 +178,8 @@ export default function ModelList ({ {editable && isOwner && - (!ceramicNodes || ceramicNodes.length === 0 ? ( + (!currCeramicNode || + currCeramicNode.status !== CeramicStatus.RUNNING ? (
-
There is no available node now.
- {selectedDapp && ( - - - + {currCeramicNode ? ( + currCeramicNode.status !== CeramicStatus.RUNNING ? ( +
+

Your Private Ceramic Node is {currCeramicNode.status} ......

+

Please wait while it is ready!

+
+ ) : ( +
Your Private Ceramic Node is Ready to use.
+ ) + ) : ( +
+
There is no available node now.
+ {selectedDapp && ( + + + + )} +
)} ) @@ -29,12 +45,12 @@ export default function NoCeramicNodeModal ({ const Box = styled.div` display: flex; flex-direction: column; - justify-content: space-between; + /* justify-content: space-between; */ padding: 30px; gap: 20px; position: relative; width: 600px; - min-height: 200px; + min-height: 160px; margin: 0 auto; background: #1b1e23; diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 46b2be7e..0be0853e 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -26,24 +26,26 @@ import NodeTerminal from '../components/Terminal' import CopyTint from '../components/CopyTint' export default function CeramicNodes () { const { + currCeramicNode, loadingCeramicNodes: loading, ceramicNodes, loadCeramicNodes } = useCeramicNodeCtx() const { currDapp } = useAppCtx() - const [selectedNode, setSelectedNode] = useState( - undefined - ) + useEffect(() => { + let timer: NodeJS.Timeout | undefined // console.log('ceramicNodes changes: ', ceramicNodes) if (ceramicNodes.length > 0) { - if (ceramicNodes[0].status === CeramicStatus.PREPARING) { - setTimeout(() => { + if (ceramicNodes[0].status !== CeramicStatus.RUNNING) { + timer = setTimeout(() => { loadCeramicNodes() - }, 10000) + }, 5000) } - setSelectedNode(ceramicNodes[0]) - } else setSelectedNode(undefined) + } + return ()=>{ + if (timer) clearTimeout(timer) + } }, [ceramicNodes, loadCeramicNodes]) const [curentDappNetwork, setCurentDappNetwork] = useState( @@ -83,15 +85,11 @@ export default function CeramicNodes () {
{ceramicNodes?.map(item => { - const active = selectedNode?.id === item.id + const active = currCeramicNode?.id === item.id return (
{ - if (active) return - setSelectedNode(item) - }} >
{item.name}
@@ -108,7 +106,7 @@ export default function CeramicNodes () { })} - {selectedNode && } + {currCeramicNode && } ) } diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 2833600b..376d77a8 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -3,7 +3,7 @@ import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' -import { ClientDApp, ModelStream } from '../types' +import { CeramicStatus, ClientDApp, ModelStream } from '../types.d' import { PageSize, getModelStreamList, @@ -273,7 +273,12 @@ export default function ExploreModel () { hasIndexed={!!item.isIndexed} hasStarItem={hasStarItem} fetchPersonal={fetchPersonalCollections} - ceramicNodeId={currCeramicNode?.id} + ceramicNodeId={ + currCeramicNode && + currCeramicNode.status === CeramicStatus.RUNNING + ? currCeramicNode?.id + : undefined + } /> @@ -288,11 +293,7 @@ export default function ExploreModel () { ) } -function Dapps({ - dapps, -}: { - dapps: ClientDApp[] -}) { +function Dapps ({ dapps }: { dapps: ClientDApp[] }) { const apps = useMemo(() => { const data = [...dapps] if (data.length > 3) @@ -301,17 +302,22 @@ function Dapps({ }, [dapps]) return ( - + {apps.data.length > 0 ? apps.data.map((item, idx) => { return ( - + ) }) : 'None'} - {apps.left > 0 && {apps.left}+} + {apps.left > 0 && {apps.left}+} ) } diff --git a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx index aec8d196..2fd5ecfd 100644 --- a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx +++ b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx @@ -8,7 +8,7 @@ import React, { } from 'react' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { CeramicDto } from '../types' +import { CeramicDto } from '../types.d' import { getCeramicNodes } from '../api/ceramicNode' export interface CeramicNodeContextData { @@ -42,7 +42,10 @@ export default function CeramicNodeProvider ({ setCeramicNodes(resp.data.data) }, [session]) - const currCeramicNode = useMemo(() => ceramicNodes[0], [ceramicNodes]) + const currCeramicNode = useMemo( + () => ceramicNodes[0], + [ceramicNodes] + ) useEffect(() => { setLoadingCeramicNodes(true) From d439ad22adeb2c2d93a69b1313c8102418423d6a Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 10 Jan 2024 11:37:49 +0800 Subject: [PATCH 075/127] split api file --- .../client/dashboard/src/api/ceramicNode.ts | 21 +- .../client/dashboard/src/api/composite.ts | 68 ++++ packages/client/dashboard/src/api/dapp.ts | 85 +++++ packages/client/dashboard/src/api/index.ts | 305 +----------------- packages/client/dashboard/src/api/model.ts | 165 ++++++++++ .../src/components/CreateCompositeModal.tsx | 2 +- .../src/components/CreateNewModel.tsx | 2 +- .../dashboard/src/components/Definition.tsx | 2 +- .../src/components/DelDappConfirmModal.tsx | 2 +- .../dashboard/src/components/EditDappInfo.tsx | 2 +- .../src/components/EditDappSocial.tsx | 2 +- .../src/components/FavoriteModal.tsx | 3 +- .../dashboard/src/components/MergeModal.tsx | 2 +- .../src/components/ModelInstance.tsx | 2 +- .../dashboard/src/components/ModelList.tsx | 5 +- .../dashboard/src/components/ModelSDK.tsx | 2 +- .../dashboard/src/components/Playground.tsx | 2 +- .../src/components/dapp-home/Dashboard.tsx | 3 +- .../dashboard/src/container/DappCreate.tsx | 2 +- .../dashboard/src/container/ExploreModel.tsx | 8 +- .../client/dashboard/src/context/AppCtx.tsx | 2 +- 21 files changed, 345 insertions(+), 342 deletions(-) create mode 100644 packages/client/dashboard/src/api/composite.ts create mode 100644 packages/client/dashboard/src/api/dapp.ts create mode 100644 packages/client/dashboard/src/api/model.ts diff --git a/packages/client/dashboard/src/api/ceramicNode.ts b/packages/client/dashboard/src/api/ceramicNode.ts index 1d55ced4..1b8f71cd 100644 --- a/packages/client/dashboard/src/api/ceramicNode.ts +++ b/packages/client/dashboard/src/api/ceramicNode.ts @@ -1,12 +1,3 @@ -/* - * @Author: bufan bufan@hotmail.com - * @Date: 2023-12-15 14:39:12 - * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-15 15:25:53 - * @FilePath: /s3/packages/client/dashboard/src/api/ceramicNode.ts - * @Description: - */ - import axios, { AxiosPromise } from 'axios' import { CERAMIC_NODE_SERVICE_API_URL } from '../constants' import { @@ -14,17 +5,7 @@ import { CeramicDto, CeramicNetwork, } from '../types' - -enum ApiRespCode { - SUCCESS = 0, - ERROR = 1, -} - -type ApiResp = { - code: ApiRespCode - msg: string - data: T -} +import { ApiResp } from '.' export function getCeramicNode(id: number): AxiosPromise> { return axios({ diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts new file mode 100644 index 00000000..4b5c5180 --- /dev/null +++ b/packages/client/dashboard/src/api/composite.ts @@ -0,0 +1,68 @@ +import axios, { AxiosPromise } from 'axios' +import { APP_API_URL } from '../constants' +import { + ClientDApp, + DappComposite, +} from '../types' +import { ApiResp } from '.' + +export function getDappComposites({ + dapp: { id }, + didSession, +}: { + dapp: ClientDApp + didSession?: string +}): AxiosPromise> { + let host = APP_API_URL + + return axios({ + url: host + `/dapps/${id}/composites`, + method: 'GET', + headers: { + 'did-session': didSession || '', + }, + }) +} + +export function createDappComposites({ + didSession, + dapp, + data, + name, +}: { + didSession: string + dapp: ClientDApp + data: string + name: string +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${dapp.id}/composites`, + method: 'POST', + headers: { + 'did-session': didSession, + }, + data: { graphql: data, name }, + }) +} + +export function updateDappComposites() {} + +export function deleteDappComposites({ + compositeId, + dapp, + didSession, +}: { + compositeId: number + dapp: ClientDApp + didSession: string +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${dapp.id}/composites/${compositeId}`, + method: 'DELETE', + headers: { + 'did-session': didSession, + }, + }) +} diff --git a/packages/client/dashboard/src/api/dapp.ts b/packages/client/dashboard/src/api/dapp.ts new file mode 100644 index 00000000..9e350ee1 --- /dev/null +++ b/packages/client/dashboard/src/api/dapp.ts @@ -0,0 +1,85 @@ +import axios, { AxiosPromise } from 'axios' +import { APP_API_URL } from '../constants' +import { + ClientDApp, +} from '../types' +import { + Network, +} from '../components/Selector/EnumSelect' +import { ApiResp } from '.' + +export const PageSize = 50 + +export function getDapp(appId: string) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${appId}`, + method: 'GET', + }) +} + +export function createDapp( + dapp: ClientDApp, + didSession: string +): AxiosPromise> { + let host = APP_API_URL + return axios({ + url: host + '/dapps', + method: 'POST', + headers: { + 'did-session': didSession, + }, + data: { ...dapp }, + }) +} + +export function updateDapp( + dapp: ClientDApp, + didSession: string, + ceramicId?:number, +): AxiosPromise> { + if (!dapp.id) throw new Error('dapp id is required') + + let host = APP_API_URL + + return axios({ + url: host + '/dapps', + method: 'POST', + headers: { + 'did-session': didSession, + }, + data: { ...dapp, ceramicId, id: Number(dapp.id) }, + }) +} + +export function delDapp( + dapp: ClientDApp, + didSession: string +): AxiosPromise> { + if (!dapp.id) throw new Error('dapp id is required') + + let host = APP_API_URL + + return axios({ + url: host + '/dapps/' + dapp.id, + method: 'DELETE', + headers: { + 'did-session': didSession, + }, + }) +} + +export function getDappWithDid( + didSession: string, + network?: Network +): AxiosPromise> { + let host = APP_API_URL + + return axios({ + url: host + '/dapps', + method: 'GET', + headers: { + 'did-session': didSession, + }, + }) +} diff --git a/packages/client/dashboard/src/api/index.ts b/packages/client/dashboard/src/api/index.ts index 4f629b66..d453c217 100644 --- a/packages/client/dashboard/src/api/index.ts +++ b/packages/client/dashboard/src/api/index.ts @@ -1,18 +1,5 @@ -import axios, { AxiosPromise } from 'axios' -import { APP_API_URL, UPLOAD_API_URL } from '../constants' -import { - ClientDApp, - DappComposite, - ModeCreateResult, - ModeQueryResult, - ModelMid, - ModelStream, -} from '../types' -import { - GraphqlGenType, - GraphqlGenTypeServer, - Network, -} from '../components/Selector/EnumSelect' +import axios from 'axios' +import { UPLOAD_API_URL } from '../constants' export const PageSize = 50 @@ -21,7 +8,7 @@ enum ApiRespCode { ERROR = 1, } -type ApiResp = { +export type ApiResp = { code: ApiRespCode msg: string data: T @@ -36,289 +23,3 @@ export function uploadImage({ file }: { file: File }) { data: form, }) } - -export function getDapp(appId: string) { - let host = APP_API_URL - return axios({ - url: host + `/dapps/${appId}`, - method: 'GET', - }) -} - -export function createDapp( - dapp: ClientDApp, - didSession: string -): AxiosPromise> { - let host = APP_API_URL - return axios({ - url: host + '/dapps', - method: 'POST', - headers: { - 'did-session': didSession, - }, - data: { ...dapp }, - }) -} - -export function updateDapp( - dapp: ClientDApp, - didSession: string, - ceramicId?:number, -): AxiosPromise> { - if (!dapp.id) throw new Error('dapp id is required') - - let host = APP_API_URL - - return axios({ - url: host + '/dapps', - method: 'POST', - headers: { - 'did-session': didSession, - }, - data: { ...dapp, ceramicId, id: Number(dapp.id) }, - }) -} - -export function delDapp( - dapp: ClientDApp, - didSession: string -): AxiosPromise> { - if (!dapp.id) throw new Error('dapp id is required') - - let host = APP_API_URL - - return axios({ - url: host + '/dapps/' + dapp.id, - method: 'DELETE', - headers: { - 'did-session': didSession, - }, - }) -} - -export function getDappWithDid( - didSession: string, - network?: Network -): AxiosPromise> { - let host = APP_API_URL - - return axios({ - url: host + '/dapps', - method: 'GET', - headers: { - 'did-session': didSession, - }, - }) -} - -export function getModelStreamList({ - name, - did, - pageSize = PageSize, - pageNumber = 1, - network, -}: { - name?: string - did?: string - pageSize?: number - pageNumber?: number - network?: Network -}): AxiosPromise>> { - let host = APP_API_URL - let net = network === Network.MAINNET ? Network.MAINNET : Network.TESTNET - return axios.get(`${host}/models`, { - params: { - name, - did, - pageSize, - pageNumber, - useCounting: true, - network: net.toUpperCase(), - }, - }) -} - -export function createModel( - graphql: string, - network: Network -): AxiosPromise> { - let host = APP_API_URL - return axios.post(`${host}/models`, { - graphql: graphql, - network: network.toUpperCase(), - }) -} - -export function getStarModels({ - network, - ids, -}: { - network: Network - ids: string[] -}): AxiosPromise>> { - let host = APP_API_URL - return axios.post(`${host}/models/ids`, { - network: network.toUpperCase(), - ids, - }) -} - -export function queryModelGraphql( - streamId: string | string[], - network: Network -): AxiosPromise> { - let host = APP_API_URL - return axios.post(`${host}/models/graphql`, { - models: Array.isArray(streamId) ? streamId : [streamId], - network: network.toUpperCase(), - }) -} - -export function getModelMid({ - network, - modelId, - pageSize = 50, - pageNumber = 1, -}: { - network: Network - modelId: string - pageSize?: number - pageNumber?: number -}): AxiosPromise> { - let host = APP_API_URL - return axios.get(`${host}/models/${modelId}/mids`, { - params: { - network: network.toUpperCase(), - pageSize, - pageNumber, - }, - }) -} - -export function getModelInfo({ - network, - id, -}: { - network: Network - id: string -}): AxiosPromise> { - let host = APP_API_URL - return axios.get(`${host}/models/${id}`, { - params: { - network: network.toUpperCase(), - }, - }) -} - -export function getDappComposites({ - dapp: { id }, - didSession, -}: { - dapp: ClientDApp - didSession?: string -}): AxiosPromise> { - let host = APP_API_URL - - return axios({ - url: host + `/dapps/${id}/composites`, - method: 'GET', - headers: { - 'did-session': didSession || '', - }, - }) -} - -export function createDappComposites({ - didSession, - dapp, - data, - name, -}: { - didSession: string - dapp: ClientDApp - data: string - name: string -}) { - let host = APP_API_URL - return axios({ - url: host + `/dapps/${dapp.id}/composites`, - method: 'POST', - headers: { - 'did-session': didSession, - }, - data: { graphql: data, name }, - }) -} - -export function updateDappComposites() {} - -export function deleteDappComposites({ - compositeId, - dapp, - didSession, -}: { - compositeId: number - dapp: ClientDApp - didSession: string -}) { - let host = APP_API_URL - return axios({ - url: host + `/dapps/${dapp.id}/composites/${compositeId}`, - method: 'DELETE', - headers: { - 'did-session': didSession, - }, - }) -} - -export function getModelSDK({ - network, - modelId, - type, -}: { - network: Network - modelId: string - type: GraphqlGenType -}): AxiosPromise> { - let host = APP_API_URL - const serverType = GraphqlGenTypeServer[type] - return axios({ - url: host + `/models/${modelId}/sdk?network=${network}&type=${serverType}`, - method: 'GET', - }) -} - -export function startIndexModel({ - network, - modelId, - didSession, -}: { - network: Network - modelId: string - didSession?: string -}): AxiosPromise> { - return axios({ - url: `${APP_API_URL}/models/indexing?network=${network.toUpperCase()}&model=${modelId}`, - method: 'post', - headers: { - 'did-session': didSession || '', - }, - }) -} - -export function getStreamsCountWithModels({ - network, - modelStreamIds, -}: { - network: Network - modelStreamIds: string -}): AxiosPromise> { - let host = APP_API_URL - let net = network === Network.MAINNET ? Network.MAINNET : Network.TESTNET - return axios({ - url: - host + - `/${net.toUpperCase()}/streams/count?modelStreamIds=${modelStreamIds}`, - method: 'GET', - }) -} diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts new file mode 100644 index 00000000..ca54ff9a --- /dev/null +++ b/packages/client/dashboard/src/api/model.ts @@ -0,0 +1,165 @@ +import axios, { AxiosPromise } from 'axios' +import { APP_API_URL } from '../constants' +import { + ModeCreateResult, + ModeQueryResult, + ModelMid, + ModelStream, +} from '../types' +import { + GraphqlGenType, + GraphqlGenTypeServer, + Network, +} from '../components/Selector/EnumSelect' +import { ApiResp, PageSize } from '.' + +export function getModelStreamList({ + name, + did, + pageSize = PageSize, + pageNumber = 1, + network, +}: { + name?: string + did?: string + pageSize?: number + pageNumber?: number + network?: Network +}): AxiosPromise>> { + let host = APP_API_URL + let net = network === Network.MAINNET ? Network.MAINNET : Network.TESTNET + return axios.get(`${host}/models`, { + params: { + name, + did, + pageSize, + pageNumber, + useCounting: true, + network: net.toUpperCase(), + }, + }) +} + +export function createModel( + graphql: string, + network: Network +): AxiosPromise> { + let host = APP_API_URL + return axios.post(`${host}/models`, { + graphql: graphql, + network: network.toUpperCase(), + }) +} + +export function getStarModels({ + network, + ids, +}: { + network: Network + ids: string[] +}): AxiosPromise>> { + let host = APP_API_URL + return axios.post(`${host}/models/ids`, { + network: network.toUpperCase(), + ids, + }) +} + +export function queryModelGraphql( + streamId: string | string[], + network: Network +): AxiosPromise> { + let host = APP_API_URL + return axios.post(`${host}/models/graphql`, { + models: Array.isArray(streamId) ? streamId : [streamId], + network: network.toUpperCase(), + }) +} + +export function getModelMid({ + network, + modelId, + pageSize = 50, + pageNumber = 1, +}: { + network: Network + modelId: string + pageSize?: number + pageNumber?: number +}): AxiosPromise> { + let host = APP_API_URL + return axios.get(`${host}/models/${modelId}/mids`, { + params: { + network: network.toUpperCase(), + pageSize, + pageNumber, + }, + }) +} + +export function getModelInfo({ + network, + id, +}: { + network: Network + id: string +}): AxiosPromise> { + let host = APP_API_URL + return axios.get(`${host}/models/${id}`, { + params: { + network: network.toUpperCase(), + }, + }) +} + +export function getModelSDK({ + network, + modelId, + type, +}: { + network: Network + modelId: string + type: GraphqlGenType +}): AxiosPromise> { + let host = APP_API_URL + const serverType = GraphqlGenTypeServer[type] + return axios({ + url: host + `/models/${modelId}/sdk?network=${network}&type=${serverType}`, + method: 'GET', + }) +} + +export function startIndexModel({ + network, + modelId, + didSession, +}: { + network: Network + modelId: string + didSession?: string +}): AxiosPromise> { + return axios({ + url: `${APP_API_URL}/models/indexing?network=${network.toUpperCase()}&model=${modelId}`, + method: 'post', + headers: { + 'did-session': didSession || '', + }, + }) +} + +export function getStreamsCountWithModels({ + network, + modelStreamIds, +}: { + network: Network + modelStreamIds: string +}): AxiosPromise> { + let host = APP_API_URL + let net = network === Network.MAINNET ? Network.MAINNET : Network.TESTNET + return axios({ + url: + host + + `/${net.toUpperCase()}/streams/count?modelStreamIds=${modelStreamIds}`, + method: 'GET', + }) +} diff --git a/packages/client/dashboard/src/components/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/CreateCompositeModal.tsx index 26ab61a3..dc821702 100644 --- a/packages/client/dashboard/src/components/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/CreateCompositeModal.tsx @@ -7,7 +7,7 @@ import CloseIcon from './Icons/CloseIcon' import { schemas } from '../utils/composedb-types/schemas' import useSelectedDapp from '../hooks/useSelectedDapp' -import { createDappComposites } from '../api' +import { createDappComposites } from '../api/composite' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { ModelStream } from '../types' diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/CreateNewModel.tsx index a55ac5dd..8a2a3f87 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/CreateNewModel.tsx @@ -7,7 +7,7 @@ import CloseIcon from './Icons/CloseIcon' import { schemas } from '../utils/composedb-types/schemas' import useSelectedDapp from '../hooks/useSelectedDapp' -import { updateDapp } from '../api' +import { updateDapp } from '../api/dapp' // import { Network } from './Selector/EnumSelect' import { useAppCtx } from '../context/AppCtx' import { useSession } from '@us3r-network/auth-with-rainbowkit' diff --git a/packages/client/dashboard/src/components/Definition.tsx b/packages/client/dashboard/src/components/Definition.tsx index 5cd42d17..c250b0ad 100644 --- a/packages/client/dashboard/src/components/Definition.tsx +++ b/packages/client/dashboard/src/components/Definition.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { getModelInfo, queryModelGraphql } from '../api' +import { getModelInfo, queryModelGraphql } from '../api/model' import { ModeQueryResult, ModelStream } from '../types' import { schemas } from '../utils/composedb-types/schemas' import { AxiosError } from 'axios' diff --git a/packages/client/dashboard/src/components/DelDappConfirmModal.tsx b/packages/client/dashboard/src/components/DelDappConfirmModal.tsx index d7996bc0..98722dc2 100644 --- a/packages/client/dashboard/src/components/DelDappConfirmModal.tsx +++ b/packages/client/dashboard/src/components/DelDappConfirmModal.tsx @@ -3,7 +3,7 @@ import styled from 'styled-components' import { useAppCtx } from '../context/AppCtx' import { useCallback, useState } from 'react' import useSelectedDapp from '../hooks/useSelectedDapp' -import { delDapp } from '../api' +import { delDapp } from '../api/dapp' import CloseIcon from './Icons/CloseIcon' import InfoCircleIcon from './Icons/InfoCircleIcon' diff --git a/packages/client/dashboard/src/components/EditDappInfo.tsx b/packages/client/dashboard/src/components/EditDappInfo.tsx index 42e650ca..476db8e8 100644 --- a/packages/client/dashboard/src/components/EditDappInfo.tsx +++ b/packages/client/dashboard/src/components/EditDappInfo.tsx @@ -5,7 +5,7 @@ import AppIconInput from './AppIconInput' import InputItem from './InputItem' import EnumSelect, { AppType, Network, Stage } from './Selector/EnumSelect' import { ClientDApp } from '../types' -import { updateDapp } from '../api' +import { updateDapp } from '../api/dapp' import { useAuthentication, useSession, diff --git a/packages/client/dashboard/src/components/EditDappSocial.tsx b/packages/client/dashboard/src/components/EditDappSocial.tsx index ee7c5fb7..541d15e1 100644 --- a/packages/client/dashboard/src/components/EditDappSocial.tsx +++ b/packages/client/dashboard/src/components/EditDappSocial.tsx @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react' import styled from 'styled-components' import CloseIcon from './Icons/CloseIcon' import InputItem from './InputItem' -import { updateDapp } from '../api' +import { updateDapp } from '../api/dapp' import { DISCORD, GITHUB, MEDIUM, MIRROR, TWITTER } from '../constants' import { ClientDApp } from '../types' import { diff --git a/packages/client/dashboard/src/components/FavoriteModal.tsx b/packages/client/dashboard/src/components/FavoriteModal.tsx index 2842dacd..27c0137a 100644 --- a/packages/client/dashboard/src/components/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/FavoriteModal.tsx @@ -9,7 +9,8 @@ import useSelectedDapp from '../hooks/useSelectedDapp' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { PersonalCollection, useAppCtx } from '../context/AppCtx' import { Network } from './Selector/EnumSelect' -import { getStarModels, startIndexModel, updateDapp } from '../api' +import { getStarModels, startIndexModel } from '../api/model' +import { updateDapp } from '../api/dapp' import { CeramicStatus, ModelStream } from '../types.d' import { shortPubKey } from '../utils/shortPubKey' import dayjs from 'dayjs' diff --git a/packages/client/dashboard/src/components/MergeModal.tsx b/packages/client/dashboard/src/components/MergeModal.tsx index ddbe9c9b..81e799fe 100644 --- a/packages/client/dashboard/src/components/MergeModal.tsx +++ b/packages/client/dashboard/src/components/MergeModal.tsx @@ -2,7 +2,7 @@ import { useCallback, useState } from 'react' import { CheckboxGroup, Checkbox, Label } from 'react-aria-components' import { Composite } from '@composedb/devtools' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' -import { queryModelGraphql } from '../api' +import { queryModelGraphql } from '../api/model' import useSelectedDapp from '../hooks/useSelectedDapp' import { Network } from './Selector/EnumSelect' import { ClientDApp, DappComposite, ModelStream } from '../types' diff --git a/packages/client/dashboard/src/components/ModelInstance.tsx b/packages/client/dashboard/src/components/ModelInstance.tsx index e09c19b4..a5329702 100644 --- a/packages/client/dashboard/src/components/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/ModelInstance.tsx @@ -6,7 +6,7 @@ import InfiniteScroll from 'react-infinite-scroll-component' import { AxiosError } from 'axios' import { Network } from './Selector/EnumSelect' import { ModelStream } from '../types' -import { queryModelGraphql } from '../api' +import { queryModelGraphql } from '../api/model' import ModelStreamList from './ModelStreamList' import { Button } from 'react-aria-components' import PlusIcon from './Icons/PlusIcon' diff --git a/packages/client/dashboard/src/components/ModelList.tsx b/packages/client/dashboard/src/components/ModelList.tsx index ec4c4bb2..087ac230 100644 --- a/packages/client/dashboard/src/components/ModelList.tsx +++ b/packages/client/dashboard/src/components/ModelList.tsx @@ -9,13 +9,14 @@ import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import useSelectedDapp from '../hooks/useSelectedDapp' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { CeramicStatus, DappComposite, ModelStream } from '../types.d' -import { getStarModels, getDappComposites, deleteDappComposites } from '../api' +import { getStarModels } from '../api/model' +import { getDappComposites, deleteDappComposites } from '../api/composite' import { Network } from './Selector/EnumSelect' import TrashIcon from './Icons/TrashIcon' import FavoriteModel from './FavoriteModal' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { useAppCtx } from '../context/AppCtx' -import { updateDapp } from '../api' +import { updateDapp } from '../api/dapp' import MergeModal from './MergeModal' import CreateNewModel from './CreateNewModel' import CreateCompositeModal from './CreateCompositeModal' diff --git a/packages/client/dashboard/src/components/ModelSDK.tsx b/packages/client/dashboard/src/components/ModelSDK.tsx index b2e2d852..c90d5783 100644 --- a/packages/client/dashboard/src/components/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/ModelSDK.tsx @@ -8,7 +8,7 @@ import 'prismjs/components/prism-typescript' import 'prismjs/plugins/line-numbers/prism-line-numbers.js' import 'prismjs/plugins/line-numbers/prism-line-numbers.css' -import { getModelSDK } from '../api' +import { getModelSDK } from '../api/model' import useSelectedDapp from '../hooks/useSelectedDapp' import { sdkTemplate } from './sdkTemplate' diff --git a/packages/client/dashboard/src/components/Playground.tsx b/packages/client/dashboard/src/components/Playground.tsx index 6ea913d3..38adc649 100644 --- a/packages/client/dashboard/src/components/Playground.tsx +++ b/packages/client/dashboard/src/components/Playground.tsx @@ -16,7 +16,7 @@ import { AxiosError } from 'axios' import styled from 'styled-components' import useSelectedDapp from '../hooks/useSelectedDapp' import { Network } from './Selector/EnumSelect' -import { queryModelGraphql } from '../api' +import { queryModelGraphql } from '../api/model' import { createGraphqlDefaultQuery } from '../utils/createDefaultQuery' import { useComposeClient } from '../hooks/useComposeClient' diff --git a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx b/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx index 21378095..f6f80804 100644 --- a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx +++ b/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx @@ -3,7 +3,8 @@ import modelsIconUrl from './imgs/models.svg' import compositesIconUrl from './imgs/composites.svg' import streamsIconUrl from './imgs/streams.svg' import { useEffect, useState, useMemo } from 'react' -import { getDappComposites, getStreamsCountWithModels } from '../../api' +import { getStreamsCountWithModels } from '../../api/model' +import { getDappComposites } from '../../api/composite' import { Network } from '../Selector/EnumSelect' import { ClientDApp } from '../../types' diff --git a/packages/client/dashboard/src/container/DappCreate.tsx b/packages/client/dashboard/src/container/DappCreate.tsx index 30329307..afa08852 100644 --- a/packages/client/dashboard/src/container/DappCreate.tsx +++ b/packages/client/dashboard/src/container/DappCreate.tsx @@ -6,7 +6,7 @@ import { useAuthentication, useSession, } from '@us3r-network/auth-with-rainbowkit' -import { createDapp } from '../api' +import { createDapp } from '../api/dapp' import { useAppCtx } from '../context/AppCtx' export default function DappCreate() { diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 376d77a8..791120a1 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -4,13 +4,13 @@ import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' import { CeramicStatus, ClientDApp, ModelStream } from '../types.d' +import { PageSize } from '../api' +import { updateDapp } from '../api/dapp' import { - PageSize, getModelStreamList, getStarModels, - startIndexModel, - updateDapp -} from '../api' + startIndexModel +} from '../api/model' import { TableBox, TableContainer } from '../components/TableBox' import dayjs from 'dayjs' import { shortPubKey } from '../utils/shortPubKey' diff --git a/packages/client/dashboard/src/context/AppCtx.tsx b/packages/client/dashboard/src/context/AppCtx.tsx index 8f8c2af6..a03114c4 100644 --- a/packages/client/dashboard/src/context/AppCtx.tsx +++ b/packages/client/dashboard/src/context/AppCtx.tsx @@ -8,7 +8,7 @@ import React, { import { useSession } from '@us3r-network/auth-with-rainbowkit' import { ClientDApp } from '../types' -import { getDapp, getDappWithDid } from '../api' +import { getDapp, getDappWithDid } from '../api/dapp' import { useGuideStepsState } from '../hooks/useGuideSteps' export type PersonalCollection = { From 0471b7ce90f99db03a150c2da5cd2c0f5dea8692 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 10 Jan 2024 11:44:43 +0800 Subject: [PATCH 076/127] split api file --- packages/client/dashboard/src/api/index.ts | 2 -- packages/client/dashboard/src/api/model.ts | 5 +++-- packages/client/dashboard/src/container/ExploreModel.tsx | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/client/dashboard/src/api/index.ts b/packages/client/dashboard/src/api/index.ts index d453c217..d86e3e0e 100644 --- a/packages/client/dashboard/src/api/index.ts +++ b/packages/client/dashboard/src/api/index.ts @@ -1,8 +1,6 @@ import axios from 'axios' import { UPLOAD_API_URL } from '../constants' -export const PageSize = 50 - enum ApiRespCode { SUCCESS = 0, ERROR = 1, diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index ca54ff9a..8b89777a 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -11,12 +11,13 @@ import { GraphqlGenTypeServer, Network, } from '../components/Selector/EnumSelect' -import { ApiResp, PageSize } from '.' +import { ApiResp } from '.' +export const PAGE_SIZE = 50 export function getModelStreamList({ name, did, - pageSize = PageSize, + pageSize = PAGE_SIZE, pageNumber = 1, network, }: { diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 791120a1..1249050b 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -4,9 +4,9 @@ import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' import { CeramicStatus, ClientDApp, ModelStream } from '../types.d' -import { PageSize } from '../api' import { updateDapp } from '../api/dapp' import { + PAGE_SIZE, getModelStreamList, getStarModels, startIndexModel @@ -113,7 +113,7 @@ export default function ExploreModel () { }) const list = resp.data.data setModels(list) - setHasMore(list.length >= PageSize) + setHasMore(list.length >= PAGE_SIZE) pageNum.current = 1 }, [selectedDapp?.network]) @@ -123,7 +123,7 @@ export default function ExploreModel () { pageNumber }) const list = resp.data.data - setHasMore(list.length >= PageSize) + setHasMore(list.length >= PAGE_SIZE) setModels([...models, ...list]) }, [models] From 7c14b0ad52995f4d62ae031643a05ac3cf4da210 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 11 Jan 2024 11:50:11 +0800 Subject: [PATCH 077/127] rearrange App.tsx --- packages/client/dashboard/src/App.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 26d18c76..792990cd 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -9,7 +9,7 @@ import { useAppCtx } from './context/AppCtx' import MyDapps from './container/MyDapps' import NoMatch from './container/NoMatch' -import CeramicProvider from './context/AppCtx' +import AppProvider from './context/AppCtx' import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' import DappHome from './container/DappHome' import DappCreate from './container/DappCreate' @@ -65,14 +65,20 @@ export default function App () { - - + + - - + + ) From ec6c80878c4b7a21c5233ca63a619a3ed9ca1f4c Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 11 Jan 2024 13:35:01 +0800 Subject: [PATCH 078/127] reconstruct common components and types --- packages/client/dashboard/src/App.tsx | 2 +- .../client/dashboard/src/api/ceramicNode.ts | 2 +- .../client/dashboard/src/api/composite.ts | 2 +- packages/client/dashboard/src/api/dapp.ts | 4 +- packages/client/dashboard/src/api/model.ts | 4 +- .../src/components/CompositeDefinition.tsx | 2 +- .../src/components/CreateCeramicNodeModal.tsx | 2 +- .../src/components/CreateCompositeModal.tsx | 2 +- .../src/components/DappSocialEditor.tsx | 2 +- .../src/components/DappTitleEditor.tsx | 3 +- .../dashboard/src/components/Definition.tsx | 3 +- .../src/components/DeleteCeramicNodeModal.tsx | 2 +- .../dashboard/src/components/EditDappInfo.tsx | 4 +- .../src/components/EditDappSocial.tsx | 2 +- .../src/components/FavoriteModal.tsx | 3 +- .../dashboard/src/components/Header.tsx | 49 +++++- .../dashboard/src/components/MergeModal.tsx | 3 +- .../src/components/ModelInstance.tsx | 3 +- .../src/components/ModelInstanceFormModal.tsx | 2 +- .../dashboard/src/components/ModelList.tsx | 3 +- .../dashboard/src/components/ModelSDK.tsx | 2 +- .../dashboard/src/components/Playground.tsx | 2 +- .../src/components/Selector/DappSelector.tsx | 46 ------ .../{Selector => common}/ComboBox.tsx | 0 .../{Selector => common}/EnumSelect.tsx | 34 +---- .../{Selector => common}/ListBox.tsx | 0 .../{Modal => common}/ModalBase.tsx | 0 .../{Selector => common}/Popover.tsx | 0 .../{Selector => common}/Select.tsx | 0 .../{Selector => common}/SelectorIcon.tsx | 0 .../{Selector => common}/shared.tsx | 0 .../src/components/dapp-home/Dashboard.tsx | 3 +- .../dashboard/src/container/CeramicNodes.tsx | 3 +- .../dashboard/src/container/DappCreate.tsx | 3 +- .../src/container/DappDataStatistic.tsx | 3 +- .../src/container/DappModelEditor.tsx | 2 +- .../src/container/DappModelPlayground.tsx | 2 +- .../dashboard/src/container/DappModelSdk.tsx | 2 +- .../dashboard/src/container/ExploreModel.tsx | 3 +- .../dashboard/src/container/MyDapps.tsx | 2 +- .../client/dashboard/src/context/AppCtx.tsx | 2 +- .../dashboard/src/hooks/useComposeClient.ts | 2 +- .../dashboard/src/hooks/useGuideSteps.ts | 2 +- .../dashboard/src/hooks/useSelectedDapp.ts | 2 +- packages/client/dashboard/src/types.d.ts | 144 +++++++++++------- packages/client/dashboard/tsconfig.json | 3 +- 46 files changed, 176 insertions(+), 185 deletions(-) delete mode 100644 packages/client/dashboard/src/components/Selector/DappSelector.tsx rename packages/client/dashboard/src/components/{Selector => common}/ComboBox.tsx (100%) rename packages/client/dashboard/src/components/{Selector => common}/EnumSelect.tsx (81%) rename packages/client/dashboard/src/components/{Selector => common}/ListBox.tsx (100%) rename packages/client/dashboard/src/components/{Modal => common}/ModalBase.tsx (100%) rename packages/client/dashboard/src/components/{Selector => common}/Popover.tsx (100%) rename packages/client/dashboard/src/components/{Selector => common}/Select.tsx (100%) rename packages/client/dashboard/src/components/{Selector => common}/SelectorIcon.tsx (100%) rename packages/client/dashboard/src/components/{Selector => common}/shared.tsx (100%) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 792990cd..b168f7ba 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -25,7 +25,7 @@ import Components from './container/Components' import { useEffect, useState } from 'react' import ModelList from './components/ModelList' -import { DappComposite, ModelStream } from './types' +import { DappComposite, ModelStream } from './types.d' import { ToastContainer } from 'react-toastify' import 'react-toastify/dist/ReactToastify.min.css' import DappModelSdk from './container/DappModelSdk' diff --git a/packages/client/dashboard/src/api/ceramicNode.ts b/packages/client/dashboard/src/api/ceramicNode.ts index 1b8f71cd..7b6c7c79 100644 --- a/packages/client/dashboard/src/api/ceramicNode.ts +++ b/packages/client/dashboard/src/api/ceramicNode.ts @@ -4,7 +4,7 @@ import { CeramicRequestDto, CeramicDto, CeramicNetwork, -} from '../types' +} from '../types.d' import { ApiResp } from '.' export function getCeramicNode(id: number): AxiosPromise> { diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index 4b5c5180..1a3c7672 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -3,7 +3,7 @@ import { APP_API_URL } from '../constants' import { ClientDApp, DappComposite, -} from '../types' +} from '../types.d' import { ApiResp } from '.' export function getDappComposites({ diff --git a/packages/client/dashboard/src/api/dapp.ts b/packages/client/dashboard/src/api/dapp.ts index 9e350ee1..9eb1c437 100644 --- a/packages/client/dashboard/src/api/dapp.ts +++ b/packages/client/dashboard/src/api/dapp.ts @@ -2,10 +2,8 @@ import axios, { AxiosPromise } from 'axios' import { APP_API_URL } from '../constants' import { ClientDApp, -} from '../types' -import { Network, -} from '../components/Selector/EnumSelect' +} from '../types.d' import { ApiResp } from '.' export const PageSize = 50 diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index 8b89777a..e350d8fb 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -5,12 +5,10 @@ import { ModeQueryResult, ModelMid, ModelStream, -} from '../types' -import { GraphqlGenType, GraphqlGenTypeServer, Network, -} from '../components/Selector/EnumSelect' +} from '../types.d' import { ApiResp } from '.' export const PAGE_SIZE = 50 diff --git a/packages/client/dashboard/src/components/CompositeDefinition.tsx b/packages/client/dashboard/src/components/CompositeDefinition.tsx index 1e0c5220..74a8e070 100644 --- a/packages/client/dashboard/src/components/CompositeDefinition.tsx +++ b/packages/client/dashboard/src/components/CompositeDefinition.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react' import styled from 'styled-components' import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { DappComposite } from '../types' +import { DappComposite } from '../types.d' import { schemas } from '../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' diff --git a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx index cf18cda9..a6b427ea 100644 --- a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx @@ -2,7 +2,7 @@ import styled from 'styled-components' import { useCallback, useState } from 'react' import CloseIcon from './Icons/CloseIcon' -import EnumSelect from './Selector/EnumSelect' +import EnumSelect from './common/EnumSelect' import { useAuthentication, useSession diff --git a/packages/client/dashboard/src/components/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/CreateCompositeModal.tsx index dc821702..91fe02d4 100644 --- a/packages/client/dashboard/src/components/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/CreateCompositeModal.tsx @@ -9,7 +9,7 @@ import { schemas } from '../utils/composedb-types/schemas' import useSelectedDapp from '../hooks/useSelectedDapp' import { createDappComposites } from '../api/composite' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { ModelStream } from '../types' +import { ModelStream } from '../types.d' const TINT_WORD = `# Edit the model's relation based on your business needs. # See Example below diff --git a/packages/client/dashboard/src/components/DappSocialEditor.tsx b/packages/client/dashboard/src/components/DappSocialEditor.tsx index d00bd05a..8a9723da 100644 --- a/packages/client/dashboard/src/components/DappSocialEditor.tsx +++ b/packages/client/dashboard/src/components/DappSocialEditor.tsx @@ -15,7 +15,7 @@ import MirrorIcon from './Icons/MirrorIcon' import MediumIcon from './Icons/MediumIcon' import GithubIcon from './Icons/GithubIcon' import React from 'react' -import { ClientDApp } from '../types' +import { ClientDApp } from '../types.d' const IconMap: { [key: string]: () => JSX.Element } = { twitter: TwitterIcon, diff --git a/packages/client/dashboard/src/components/DappTitleEditor.tsx b/packages/client/dashboard/src/components/DappTitleEditor.tsx index f4e0648a..1c3fc6c4 100644 --- a/packages/client/dashboard/src/components/DappTitleEditor.tsx +++ b/packages/client/dashboard/src/components/DappTitleEditor.tsx @@ -8,8 +8,7 @@ import { Modal, ModalOverlay, } from 'react-aria-components' -import { ClientDApp } from '../types' -import { Network } from './Selector/EnumSelect' +import { ClientDApp, Network } from '../types.d' export default function DappTitleEditor({ selectedDapp, diff --git a/packages/client/dashboard/src/components/Definition.tsx b/packages/client/dashboard/src/components/Definition.tsx index c250b0ad..f6b9b884 100644 --- a/packages/client/dashboard/src/components/Definition.tsx +++ b/packages/client/dashboard/src/components/Definition.tsx @@ -2,10 +2,9 @@ import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { getModelInfo, queryModelGraphql } from '../api/model' -import { ModeQueryResult, ModelStream } from '../types' +import { ModeQueryResult, ModelStream, Network } from '../types.d' import { schemas } from '../utils/composedb-types/schemas' import { AxiosError } from 'axios' -import { Network } from './Selector/EnumSelect' import useSelectedDapp from '../hooks/useSelectedDapp' import CodeDownload from './CodeDownload' diff --git a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx b/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx index 608053f8..183d9484 100644 --- a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx @@ -6,7 +6,7 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { delCeramicNode } from '../api/ceramicNode' -import { CeramicDto } from '../types' +import { CeramicDto } from '../types.d' export default function DeleteCeramicNodeModal ({ node, diff --git a/packages/client/dashboard/src/components/EditDappInfo.tsx b/packages/client/dashboard/src/components/EditDappInfo.tsx index 476db8e8..e5718c85 100644 --- a/packages/client/dashboard/src/components/EditDappInfo.tsx +++ b/packages/client/dashboard/src/components/EditDappInfo.tsx @@ -3,8 +3,8 @@ import styled from 'styled-components' import CloseIcon from './Icons/CloseIcon' import AppIconInput from './AppIconInput' import InputItem from './InputItem' -import EnumSelect, { AppType, Network, Stage } from './Selector/EnumSelect' -import { ClientDApp } from '../types' +import EnumSelect from './common/EnumSelect' +import { ClientDApp, AppType, Network, Stage } from '../types.d' import { updateDapp } from '../api/dapp' import { useAuthentication, diff --git a/packages/client/dashboard/src/components/EditDappSocial.tsx b/packages/client/dashboard/src/components/EditDappSocial.tsx index 541d15e1..4840cdd6 100644 --- a/packages/client/dashboard/src/components/EditDappSocial.tsx +++ b/packages/client/dashboard/src/components/EditDappSocial.tsx @@ -4,7 +4,7 @@ import CloseIcon from './Icons/CloseIcon' import InputItem from './InputItem' import { updateDapp } from '../api/dapp' import { DISCORD, GITHUB, MEDIUM, MIRROR, TWITTER } from '../constants' -import { ClientDApp } from '../types' +import { ClientDApp } from '../types.d' import { useAuthentication, useSession, diff --git a/packages/client/dashboard/src/components/FavoriteModal.tsx b/packages/client/dashboard/src/components/FavoriteModal.tsx index 27c0137a..c54c91f8 100644 --- a/packages/client/dashboard/src/components/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/FavoriteModal.tsx @@ -8,10 +8,9 @@ import { useCallback, useEffect, useState } from 'react' import useSelectedDapp from '../hooks/useSelectedDapp' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { PersonalCollection, useAppCtx } from '../context/AppCtx' -import { Network } from './Selector/EnumSelect' import { getStarModels, startIndexModel } from '../api/model' import { updateDapp } from '../api/dapp' -import { CeramicStatus, ModelStream } from '../types.d' +import { CeramicStatus, ModelStream, Network } from '../types.d' import { shortPubKey } from '../utils/shortPubKey' import dayjs from 'dayjs' import { S3_SCAN_URL } from '../constants' diff --git a/packages/client/dashboard/src/components/Header.tsx b/packages/client/dashboard/src/components/Header.tsx index 3bf25d6d..04cef913 100644 --- a/packages/client/dashboard/src/components/Header.tsx +++ b/packages/client/dashboard/src/components/Header.tsx @@ -2,10 +2,14 @@ import styled from 'styled-components' import { useSession } from '@us3r-network/auth-with-rainbowkit' import { LogoWhite } from './Logo' -import { Link } from 'react-router-dom' -import DappSelector from './Selector/DappSelector' +import { Link, useLocation, useNavigate } from 'react-router-dom' import LoginButton from './LoginButton' import useSelectedDapp from '../hooks/useSelectedDapp' +import { useMemo } from 'react' +import { Item } from './common/ComboBox' +import { Select } from './common/Select' +import { Label } from './common/ListBox' + export default function Header() { const { appId, selectDapps } = useSelectedDapp() @@ -74,3 +78,44 @@ const HeaderContainer = styled.header` } } ` + +function DappSelector({ + dapps, + selected, +}: { + dapps: { id: number; name: string }[] + selected: string +}) { + const navigate = useNavigate() + const location = useLocation() + + const dappItems = useMemo(() => { + return [...dapps, { id: 0, name: '+ Create Dapp' }] + }, [dapps]) + + return ( + + ) +} \ No newline at end of file diff --git a/packages/client/dashboard/src/components/MergeModal.tsx b/packages/client/dashboard/src/components/MergeModal.tsx index 81e799fe..b83004fa 100644 --- a/packages/client/dashboard/src/components/MergeModal.tsx +++ b/packages/client/dashboard/src/components/MergeModal.tsx @@ -4,8 +4,7 @@ import { Composite } from '@composedb/devtools' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { queryModelGraphql } from '../api/model' import useSelectedDapp from '../hooks/useSelectedDapp' -import { Network } from './Selector/EnumSelect' -import { ClientDApp, DappComposite, ModelStream } from '../types' +import { ClientDApp, DappComposite, ModelStream, Network } from '../types.d' import styled from 'styled-components' import FileSaver from 'file-saver' import { CeramicClient } from '@ceramicnetwork/http-client' diff --git a/packages/client/dashboard/src/components/ModelInstance.tsx b/packages/client/dashboard/src/components/ModelInstance.tsx index a5329702..f1d4b472 100644 --- a/packages/client/dashboard/src/components/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/ModelInstance.tsx @@ -4,8 +4,7 @@ import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' // import ModelStreamList from '../../components/ModelStreamList' import { AxiosError } from 'axios' -import { Network } from './Selector/EnumSelect' -import { ModelStream } from '../types' +import { ModelStream, Network } from '../types.d' import { queryModelGraphql } from '../api/model' import ModelStreamList from './ModelStreamList' import { Button } from 'react-aria-components' diff --git a/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx b/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx index 732f2b19..f48a0b0b 100644 --- a/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx +++ b/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx @@ -1,7 +1,7 @@ import { ModelInstanceFormProps } from './ModelInstanceForm' import ModelInstanceForm from './ModelInstanceForm' import styled from 'styled-components' -import ModalBase, { ModalBaseProps } from './Modal/ModalBase' +import ModalBase, { ModalBaseProps } from './common/ModalBase' interface ModelInstanceFormModalProps extends ModalBaseProps, diff --git a/packages/client/dashboard/src/components/ModelList.tsx b/packages/client/dashboard/src/components/ModelList.tsx index 087ac230..ea6d4607 100644 --- a/packages/client/dashboard/src/components/ModelList.tsx +++ b/packages/client/dashboard/src/components/ModelList.tsx @@ -8,10 +8,9 @@ import PlusIcon from './Icons/PlusIcon' import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' import useSelectedDapp from '../hooks/useSelectedDapp' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { CeramicStatus, DappComposite, ModelStream } from '../types.d' +import { CeramicStatus, DappComposite, ModelStream, Network } from '../types.d' import { getStarModels } from '../api/model' import { getDappComposites, deleteDappComposites } from '../api/composite' -import { Network } from './Selector/EnumSelect' import TrashIcon from './Icons/TrashIcon' import FavoriteModel from './FavoriteModal' import { useSession } from '@us3r-network/auth-with-rainbowkit' diff --git a/packages/client/dashboard/src/components/ModelSDK.tsx b/packages/client/dashboard/src/components/ModelSDK.tsx index c90d5783..6c110b99 100644 --- a/packages/client/dashboard/src/components/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/ModelSDK.tsx @@ -12,7 +12,7 @@ import { getModelSDK } from '../api/model' import useSelectedDapp from '../hooks/useSelectedDapp' import { sdkTemplate } from './sdkTemplate' -import { GraphqlGenType, Network } from './Selector/EnumSelect' +import { GraphqlGenType, Network } from '../types.d' import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' import FileSaver from 'file-saver' diff --git a/packages/client/dashboard/src/components/Playground.tsx b/packages/client/dashboard/src/components/Playground.tsx index 38adc649..cc7ea038 100644 --- a/packages/client/dashboard/src/components/Playground.tsx +++ b/packages/client/dashboard/src/components/Playground.tsx @@ -15,7 +15,7 @@ import { RuntimeCompositeDefinition } from '@composedb/types' import { AxiosError } from 'axios' import styled from 'styled-components' import useSelectedDapp from '../hooks/useSelectedDapp' -import { Network } from './Selector/EnumSelect' +import { Network } from '../types.d' import { queryModelGraphql } from '../api/model' import { createGraphqlDefaultQuery } from '../utils/createDefaultQuery' import { useComposeClient } from '../hooks/useComposeClient' diff --git a/packages/client/dashboard/src/components/Selector/DappSelector.tsx b/packages/client/dashboard/src/components/Selector/DappSelector.tsx deleted file mode 100644 index 596cff72..00000000 --- a/packages/client/dashboard/src/components/Selector/DappSelector.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Select } from './Select' -import { Item } from './ComboBox' -import { Label } from './ListBox' -import { useLocation, useNavigate } from 'react-router-dom' -import { useMemo } from 'react' - -export default function DappSelector({ - dapps, - selected, -}: { - dapps: { id: number; name: string }[] - selected: string -}) { - const navigate = useNavigate() - const location = useLocation() - - const dappItems = useMemo(() => { - return [...dapps, { id: 0, name: '+ Create Dapp' }] - }, [dapps]) - - return ( - - ) -} diff --git a/packages/client/dashboard/src/components/Selector/ComboBox.tsx b/packages/client/dashboard/src/components/common/ComboBox.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/ComboBox.tsx rename to packages/client/dashboard/src/components/common/ComboBox.tsx diff --git a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx b/packages/client/dashboard/src/components/common/EnumSelect.tsx similarity index 81% rename from packages/client/dashboard/src/components/Selector/EnumSelect.tsx rename to packages/client/dashboard/src/components/common/EnumSelect.tsx index b3652a68..acfb0c04 100644 --- a/packages/client/dashboard/src/components/Selector/EnumSelect.tsx +++ b/packages/client/dashboard/src/components/common/EnumSelect.tsx @@ -10,39 +10,7 @@ import { import styled from 'styled-components' import SelectorIcon from './SelectorIcon' import { useMemo, useState } from 'react' -import { CeramicDBType, CeramicNetwork } from '../../types' - -export enum Stage { - DEVELOPMENT = 'Under development', - NOT_RELEASE = 'Completed but not released', - RELEASE = 'Completed and released', -} - -export enum Network { - MAINNET = 'Mainnet', - TESTNET = 'Testnet', -} - -export enum AppType { - GAME = 'Game', - SOCIAL = 'Social', - MARKETPLACE = 'Marketplace', - TOOL = 'Tool', - DEFI = 'DeFi', - OTHER = 'Other', -} - -export enum GraphqlGenType { - CLIENT_PRESET = 'Client preset', - REACT_QUERY_HOOKS = 'React-Query Hooks', - REACT_APOLLO_HOOKS = 'React-Apollo Hooks', -} - -export enum GraphqlGenTypeServer { - 'Client preset' = 'ClientPreset', - 'React-Query Hooks' = 'ReactQueryHooks', - 'React-Apollo Hooks' = 'ReactApolloHooks', -} +import { AppType, CeramicDBType, CeramicNetwork, GraphqlGenType, Network, Stage } from '../../types.d' export default function EnumSelector< T extends Stage | Network | CeramicNetwork | CeramicDBType | AppType | GraphqlGenType diff --git a/packages/client/dashboard/src/components/Selector/ListBox.tsx b/packages/client/dashboard/src/components/common/ListBox.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/ListBox.tsx rename to packages/client/dashboard/src/components/common/ListBox.tsx diff --git a/packages/client/dashboard/src/components/Modal/ModalBase.tsx b/packages/client/dashboard/src/components/common/ModalBase.tsx similarity index 100% rename from packages/client/dashboard/src/components/Modal/ModalBase.tsx rename to packages/client/dashboard/src/components/common/ModalBase.tsx diff --git a/packages/client/dashboard/src/components/Selector/Popover.tsx b/packages/client/dashboard/src/components/common/Popover.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/Popover.tsx rename to packages/client/dashboard/src/components/common/Popover.tsx diff --git a/packages/client/dashboard/src/components/Selector/Select.tsx b/packages/client/dashboard/src/components/common/Select.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/Select.tsx rename to packages/client/dashboard/src/components/common/Select.tsx diff --git a/packages/client/dashboard/src/components/Selector/SelectorIcon.tsx b/packages/client/dashboard/src/components/common/SelectorIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/SelectorIcon.tsx rename to packages/client/dashboard/src/components/common/SelectorIcon.tsx diff --git a/packages/client/dashboard/src/components/Selector/shared.tsx b/packages/client/dashboard/src/components/common/shared.tsx similarity index 100% rename from packages/client/dashboard/src/components/Selector/shared.tsx rename to packages/client/dashboard/src/components/common/shared.tsx diff --git a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx b/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx index f6f80804..1e4559c7 100644 --- a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx +++ b/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx @@ -5,8 +5,7 @@ import streamsIconUrl from './imgs/streams.svg' import { useEffect, useState, useMemo } from 'react' import { getStreamsCountWithModels } from '../../api/model' import { getDappComposites } from '../../api/composite' -import { Network } from '../Selector/EnumSelect' -import { ClientDApp } from '../../types' +import { ClientDApp, Network } from '../../types.d' export default function Dashboard({ dapp }: { dapp: ClientDApp }) { const models = useMemo(() => dapp?.models || [], [dapp]) diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 0be0853e..1a0433b8 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -15,12 +15,11 @@ import { Button, Dialog, DialogTrigger } from 'react-aria-components' import { Modal, ModalOverlay } from 'react-aria-components' import PlusIcon from '../components/Icons/PlusIcon' import CreateCeramicNodeModal from '../components/CreateCeramicNodeModal' -import { CeramicDto, CeramicNetwork, CeramicStatus } from '../types.d' +import { CeramicDto, CeramicNetwork, CeramicStatus, Network } from '../types.d' import dayjs from 'dayjs' import { useAppCtx } from '../context/AppCtx' import DeleteCeramicNodeModal from '../components/DeleteCeramicNodeModal' import TrashIcon from '../components/Icons/TrashIcon' -import { Network } from '../components/Selector/EnumSelect' import { useSession } from '@us3r-network/auth-with-rainbowkit' import NodeTerminal from '../components/Terminal' import CopyTint from '../components/CopyTint' diff --git a/packages/client/dashboard/src/container/DappCreate.tsx b/packages/client/dashboard/src/container/DappCreate.tsx index afa08852..6e9154e9 100644 --- a/packages/client/dashboard/src/container/DappCreate.tsx +++ b/packages/client/dashboard/src/container/DappCreate.tsx @@ -1,5 +1,6 @@ import styled from 'styled-components' -import EnumSelect, { Network } from '../components/Selector/EnumSelect' +import { Network } from '../types.d' +import EnumSelect from '../components/common/EnumSelect' import { useNavigate } from 'react-router-dom' import { useCallback, useState } from 'react' import { diff --git a/packages/client/dashboard/src/container/DappDataStatistic.tsx b/packages/client/dashboard/src/container/DappDataStatistic.tsx index b8018c66..4b7bf848 100644 --- a/packages/client/dashboard/src/container/DappDataStatistic.tsx +++ b/packages/client/dashboard/src/container/DappDataStatistic.tsx @@ -1,8 +1,7 @@ import Instance from '../components/ModelInstance' import useSelectedDapp from '../hooks/useSelectedDapp' -import { Network } from '../components/Selector/EnumSelect' import { useLocation, useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types' +import { DappComposite, ModelStream, Network } from '../types.d' import CompositeDefinition from '../components/CompositeDefinition' export default function DappDataStatistic() { diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappModelEditor.tsx index 36605138..4a8fea60 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappModelEditor.tsx @@ -1,5 +1,5 @@ import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types' +import { DappComposite, ModelStream } from '../types.d' import CompositeDefinition from '../components/CompositeDefinition' import styled from 'styled-components' import Definition from '../components/Definition' diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index dd4d2d96..f8f1c800 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -1,6 +1,6 @@ import PlaygroundGraphiQL from '../components/Playground' import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types' +import { DappComposite, ModelStream } from '../types.d' import CompositePlaygroundGraphiQL from '../components/CompositePlaygroundGraphiQL' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' diff --git a/packages/client/dashboard/src/container/DappModelSdk.tsx b/packages/client/dashboard/src/container/DappModelSdk.tsx index 6b7a79f2..f4910c3e 100644 --- a/packages/client/dashboard/src/container/DappModelSdk.tsx +++ b/packages/client/dashboard/src/container/DappModelSdk.tsx @@ -1,5 +1,5 @@ import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types' +import { DappComposite, ModelStream } from '../types.d' import styled from 'styled-components' import ModelSDK from '../components/ModelSDK' diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 1249050b..5c542a9a 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -3,7 +3,7 @@ import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' import InfiniteScroll from 'react-infinite-scroll-component' -import { CeramicStatus, ClientDApp, ModelStream } from '../types.d' +import { CeramicStatus, ClientDApp, ModelStream, Network } from '../types.d' import { updateDapp } from '../api/dapp' import { PAGE_SIZE, @@ -18,7 +18,6 @@ import Search from '../components/Search' import useSelectedDapp from '../hooks/useSelectedDapp' import { PersonalCollection, useAppCtx } from '../context/AppCtx' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { Network } from '../components/Selector/EnumSelect' import StarIcon from '../components/Icons/StarIcon' import StarGoldIcon from '../components/Icons/StarGoldIcon' import { S3_SCAN_URL } from '../constants' diff --git a/packages/client/dashboard/src/container/MyDapps.tsx b/packages/client/dashboard/src/container/MyDapps.tsx index affd0729..88229d8b 100644 --- a/packages/client/dashboard/src/container/MyDapps.tsx +++ b/packages/client/dashboard/src/container/MyDapps.tsx @@ -7,7 +7,7 @@ import { useAuthentication, useSession, } from '@us3r-network/auth-with-rainbowkit' -import { ClientDApp } from '../types' +import { ClientDApp } from '../types.d' import { createImageFromInitials } from '../utils/createImage' import { getRandomColor } from '../utils/randomColor' diff --git a/packages/client/dashboard/src/context/AppCtx.tsx b/packages/client/dashboard/src/context/AppCtx.tsx index a03114c4..fff23961 100644 --- a/packages/client/dashboard/src/context/AppCtx.tsx +++ b/packages/client/dashboard/src/context/AppCtx.tsx @@ -7,7 +7,7 @@ import React, { } from 'react' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { ClientDApp } from '../types' +import { ClientDApp } from '../types.d' import { getDapp, getDappWithDid } from '../api/dapp' import { useGuideStepsState } from '../hooks/useGuideSteps' diff --git a/packages/client/dashboard/src/hooks/useComposeClient.ts b/packages/client/dashboard/src/hooks/useComposeClient.ts index 2bafc705..4774dda9 100644 --- a/packages/client/dashboard/src/hooks/useComposeClient.ts +++ b/packages/client/dashboard/src/hooks/useComposeClient.ts @@ -4,7 +4,7 @@ import { ComposeClient } from '@composedb/client' import { RuntimeCompositeDefinition } from '@composedb/types' import { DID } from 'dids' import useSelectedDapp from './useSelectedDapp' -import { Network } from '../components/Selector/EnumSelect' +import { Network } from '../types.d' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { CeramicClient } from '@ceramicnetwork/http-client' diff --git a/packages/client/dashboard/src/hooks/useGuideSteps.ts b/packages/client/dashboard/src/hooks/useGuideSteps.ts index 31d8ec7c..5688a58e 100644 --- a/packages/client/dashboard/src/hooks/useGuideSteps.ts +++ b/packages/client/dashboard/src/hooks/useGuideSteps.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import { ClientDApp } from '../types' +import { ClientDApp } from '../types.d' import { useLocation } from 'react-router-dom' const GUIDE_STEPS_KEY = 'guide-steps' diff --git a/packages/client/dashboard/src/hooks/useSelectedDapp.ts b/packages/client/dashboard/src/hooks/useSelectedDapp.ts index e0ef28b6..ff0fb071 100644 --- a/packages/client/dashboard/src/hooks/useSelectedDapp.ts +++ b/packages/client/dashboard/src/hooks/useSelectedDapp.ts @@ -1,7 +1,7 @@ import { useParams } from 'react-router-dom' import { useAppCtx } from '../context/AppCtx' import { useMemo } from 'react' -import { Network } from '../components/Selector/EnumSelect' +import { Network } from '../types.d' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { S3ModelCollectionModel } from '@us3r-network/data-model' diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 5e6ddc46..0b7a97a1 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -6,6 +6,28 @@ * @FilePath: /s3/packages/client/dashboard/src/types.d.ts * @Description: */ + +/************************ App ******************************/ +export enum Stage { + DEVELOPMENT = 'Under development', + NOT_RELEASE = 'Completed but not released', + RELEASE = 'Completed and released', +} + +export enum Network { + MAINNET = 'Mainnet', + TESTNET = 'Testnet', +} + +export enum AppType { + GAME = 'Game', + SOCIAL = 'Social', + MARKETPLACE = 'Marketplace', + TOOL = 'Tool', + DEFI = 'DeFi', + OTHER = 'Other', +} + export type ClientDApp = { id?: number modelId?: string @@ -23,6 +45,73 @@ export type ClientDApp = { lastModifiedAt?: number } +/************************ Node ******************************/ +export type CeramicDto = { + id: number; + name: string; + network: CeramicNetwork; + status: string; + privateKey: string; + apiKey: string; + namespace: string; + serviceHost: string; + serviceUrl: string; + serviceK8sMetadata: CeramicServiceK8sMetadata; + createdAt: number; + lastModifiedAt: number; +} + +export type CeramicRequestDto = { + name: string; + network: CeramicNetwork; + ceramicDbType?: CeramicDBType; + ceramicEnableHistoricalSync?: boolean; +} + +export enum CeramicDBType { + SQLITE ='sqlite', + PGSQL = 'postgres', +} + +export enum CeramicNetwork { + MAINNET = 'mainnet', + TESTNET = 'testnet-clay', + ALL = 'all', +} + +export enum CeramicStatus { + PREPARING = 'Preparing', + STARTING = 'Starting', + RUNNING = 'Running', + // PAUSE = 'Pause', + // RESUMING = 'Resuming', + TERMINATE = 'Terminate', + FAILED = 'Failed', + ALL = 'All', +} + +export type CeramicServiceK8sMetadata = { + // k8s namespace is created by `ns_${creater_did}_${id}` + keramikObjectName: string; + ceramicLoadbalanceHost: string; + ceramicLoadbalancePort: number; + ceramicDbType: CeramicDBType; + ceramicEnableHistoricalSync: boolean; +} + +/************************ Model ******************************/ +export enum GraphqlGenType { + CLIENT_PRESET = 'Client preset', + REACT_QUERY_HOOKS = 'React-Query Hooks', + REACT_APOLLO_HOOKS = 'React-Apollo Hooks', +} + +export enum GraphqlGenTypeServer { + 'Client preset' = 'ClientPreset', + 'React-Query Hooks' = 'ReactQueryHooks', + 'React-Apollo Hooks' = 'ReactApolloHooks', +} + export type ModelStream = { stream_id: string controller_did: string @@ -91,57 +180,4 @@ export type DappComposite = { runtimeDefinition: string createdAt: number lastModifiedAt: number -} - -export type CeramicDto = { - id: number; - name: string; - network: CeramicNetwork; - status: string; - privateKey: string; - apiKey: string; - namespace: string; - serviceHost: string; - serviceUrl: string; - serviceK8sMetadata: CeramicServiceK8sMetadata; - createdAt: number; - lastModifiedAt: number; -} - -export type CeramicRequestDto = { - name: string; - network: CeramicNetwork; - ceramicDbType?: CeramicDBType; - ceramicEnableHistoricalSync?: boolean; -} - -export enum CeramicDBType { - SQLITE ='sqlite', - PGSQL = 'postgres', -} - -export enum CeramicNetwork { - MAINNET = 'mainnet', - TESTNET = 'testnet-clay', - ALL = 'all', -} - -export enum CeramicStatus { - PREPARING = 'Preparing', - STARTING = 'Starting', - RUNNING = 'Running', - // PAUSE = 'Pause', - // RESUMING = 'Resuming', - TERMINATE = 'Terminate', - FAILED = 'Failed', - ALL = 'All', -} - -export type CeramicServiceK8sMetadata = { - // k8s namespace is created by `ns_${creater_did}_${id}` - keramikObjectName: string; - ceramicLoadbalanceHost: string; - ceramicLoadbalancePort: number; - ceramicDbType: CeramicDBType; - ceramicEnableHistoricalSync: boolean; -} +} \ No newline at end of file diff --git a/packages/client/dashboard/tsconfig.json b/packages/client/dashboard/tsconfig.json index a273b0cf..cf260c6e 100644 --- a/packages/client/dashboard/tsconfig.json +++ b/packages/client/dashboard/tsconfig.json @@ -21,6 +21,7 @@ "jsx": "react-jsx" }, "include": [ - "src" + "src", + "types.d.ts" ] } From 4f52e1ba51677031102f94ffac4d570faa8a468c Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 11 Jan 2024 15:11:19 +0800 Subject: [PATCH 079/127] reconstruct business components and types --- packages/client/dashboard/src/App.tsx | 33 +++++++------ .../components/{ => common}/AppIconInput.tsx | 4 +- .../src/components/common/ComboBox.tsx | 11 ++--- .../src/components/{ => common}/CopyTint.tsx | 2 +- .../src/components/common/EnumSelect.tsx | 6 +-- .../src/components/{ => common}/ImgOrName.tsx | 0 .../src/components/{ => common}/InputItem.tsx | 0 .../src/components/common/ListBox.tsx | 6 +-- .../src/components/common/ModalBase.tsx | 2 +- .../src/components/common/Popover.tsx | 6 +-- .../src/components/{ => common}/Search.tsx | 3 +- .../src/components/common/Select.tsx | 17 +++---- .../src/components/{ => common}/TableBox.tsx | 0 .../{ => common}/UserAvatarStyled.tsx | 0 .../{ => dapp}/DappSocialEditor.tsx | 19 ++++---- .../components/{ => dapp}/DappTitleEditor.tsx | 8 ++-- .../{ => dapp}/DelDappConfirmModal.tsx | 12 ++--- .../components/{ => dapp}/EditDappInfo.tsx | 18 +++---- .../components/{ => dapp}/EditDappSocial.tsx | 16 +++---- .../{dapp-home => dapp/home}/Dashboard.tsx | 10 ++-- .../{dapp-home => dapp/home}/Header.tsx | 10 ++-- .../home}/imgs/composites.svg | 0 .../{dapp-home => dapp/home}/imgs/models.svg | 0 .../{dapp-home => dapp/home}/imgs/streams.svg | 0 .../components/{Icons => icons}/ChartIcon.tsx | 0 .../{Icons => icons}/CheckCircleIcon.tsx | 0 .../{Icons => icons}/CheckronDown.tsx | 0 .../{Icons => icons}/ChevronLeft.tsx | 0 .../{Icons => icons}/ChevronRight.tsx | 0 .../{Icons => icons}/ChevronRightDouble.tsx | 0 .../components/{Icons => icons}/CloseIcon.tsx | 0 .../{Icons => icons}/ComponentIcon.tsx | 0 .../components/{Icons => icons}/CopyIcon.tsx | 0 .../{Icons => icons}/DisabledIcon.tsx | 0 .../{Icons => icons}/DiscordIcon.tsx | 0 .../components/{Icons => icons}/DocIcon.tsx | 0 .../{Icons => icons}/DownloadIcon.tsx | 0 .../components/{Icons => icons}/EditIcon.tsx | 0 .../{Icons => icons}/ExploreIcon.tsx | 0 .../{Icons => icons}/GithubIcon.tsx | 0 .../components/{Icons => icons}/HomeIcon.tsx | 0 .../{Icons => icons}/InfoCircleIcon.tsx | 0 .../components/{Icons => icons}/InfoIcon.tsx | 0 .../{Icons => icons}/LayoutIcon.tsx | 0 .../{Icons => icons}/LightbulbIcon.tsx | 0 .../{Icons => icons}/LogoutIcon.tsx | 0 .../{Icons => icons}/MediumIcon.tsx | 0 .../components/{Icons => icons}/MergeIcon.tsx | 0 .../{Icons => icons}/MirrorIcon.tsx | 0 .../components/{Icons => icons}/NodeIcon.tsx | 0 .../{Icons => icons}/PlusCircleIcon.tsx | 0 .../components/{Icons => icons}/PlusIcon.tsx | 0 .../components/{Icons => icons}/SdkIcon.tsx | 0 .../{common => icons}/SelectorIcon.tsx | 0 .../{Icons => icons}/StarGoldIcon.tsx | 0 .../components/{Icons => icons}/StarIcon.tsx | 0 .../{Icons => icons}/TerminalIcon.tsx | 0 .../components/{Icons => icons}/TrashIcon.tsx | 0 .../{Icons => icons}/TwitterIcon.tsx | 0 .../components/{Icons => icons}/mirror.png | Bin .../components/{ => model}/CodeDownload.tsx | 8 ++-- .../{ => model}/CompositeDefinition.tsx | 7 ++- .../CompositePlaygroundGraphiQL.tsx | 11 ++--- .../{ => model}/CreateCompositeModal.tsx | 20 ++++---- .../components/{ => model}/CreateNewModel.tsx | 25 +++++----- .../src/components/{ => model}/Definition.tsx | 12 ++--- .../components/{ => model}/FavoriteModal.tsx | 30 ++++++------ .../src/components/{ => model}/MergeModal.tsx | 18 +++---- .../components/{ => model}/ModelInstance.tsx | 34 +++++++------ .../{ => model}/ModelInstanceForm.tsx | 4 +- .../{ => model}/ModelInstanceFormModal.tsx | 5 +- .../src/components/{ => model}/ModelList.tsx | 44 ++++++++--------- .../src/components/{ => model}/ModelSDK.tsx | 19 ++++---- .../{ => model}/ModelStreamList.tsx | 24 +++++----- .../src/components/{ => model}/ModelTabs.tsx | 3 +- .../src/components/{ => model}/Playground.tsx | 21 ++++---- .../src/components/{ => model}/sdkTemplate.ts | 0 .../src/components/{ => nav}/Header.tsx | 15 +++--- .../src/components/{ => nav}/LoginButton.tsx | 5 +- .../src/components/{ => nav}/Logo.tsx | 0 .../src/components/{ => nav}/Nav.tsx | 30 ++++++------ .../{ => node}/CreateCeramicNodeModal.tsx | 15 +++--- .../{ => node}/DeleteCeramicNodeModal.tsx | 10 ++-- .../{ => node}/NoCeramicNodeModal.tsx | 10 ++-- .../src/components/{ => node}/Terminal.tsx | 8 ++-- .../dashboard/src/container/CeramicNodes.tsx | 24 +++++----- .../dashboard/src/container/Components.tsx | 2 +- .../dashboard/src/container/DappCreate.tsx | 32 ++++++------- .../src/container/DappDataStatistic.tsx | 6 +-- .../dashboard/src/container/DappHome.tsx | 22 ++++----- .../dashboard/src/container/DappInfo.tsx | 21 ++++---- .../src/container/DappModelEditor.tsx | 6 +-- .../src/container/DappModelPlayground.tsx | 6 +-- .../dashboard/src/container/DappModelSdk.tsx | 4 +- .../dashboard/src/container/ExploreModel.tsx | 45 +++++++++--------- .../dashboard/src/container/MyDapps.tsx | 10 ++-- .../client/dashboard/src/context/AppCtx.tsx | 5 +- .../dashboard/src/context/CeramicNodeCtx.tsx | 5 +- .../dashboard/src/hooks/useComposeClient.ts | 10 ++-- .../dashboard/src/hooks/useGuideSteps.ts | 2 +- .../dashboard/src/hooks/useLocalStorage.ts | 4 +- .../dashboard/src/hooks/useSelectedDapp.ts | 6 +-- .../dashboard/src/styles/playground.css | 1 - ...index.ts => createCompositeFromBrowser.ts} | 5 +- packages/client/dashboard/tsconfig.json | 3 +- 105 files changed, 369 insertions(+), 411 deletions(-) rename packages/client/dashboard/src/components/{ => common}/AppIconInput.tsx (95%) rename packages/client/dashboard/src/components/{ => common}/CopyTint.tsx (96%) rename packages/client/dashboard/src/components/{ => common}/ImgOrName.tsx (100%) rename packages/client/dashboard/src/components/{ => common}/InputItem.tsx (100%) rename packages/client/dashboard/src/components/{ => common}/Search.tsx (96%) rename packages/client/dashboard/src/components/{ => common}/TableBox.tsx (100%) rename packages/client/dashboard/src/components/{ => common}/UserAvatarStyled.tsx (100%) rename packages/client/dashboard/src/components/{ => dapp}/DappSocialEditor.tsx (88%) rename packages/client/dashboard/src/components/{ => dapp}/DappTitleEditor.tsx (91%) rename packages/client/dashboard/src/components/{ => dapp}/DelDappConfirmModal.tsx (92%) rename packages/client/dashboard/src/components/{ => dapp}/EditDappInfo.tsx (94%) rename packages/client/dashboard/src/components/{ => dapp}/EditDappSocial.tsx (95%) rename packages/client/dashboard/src/components/{dapp-home => dapp/home}/Dashboard.tsx (89%) rename packages/client/dashboard/src/components/{dapp-home => dapp/home}/Header.tsx (84%) rename packages/client/dashboard/src/components/{dapp-home => dapp/home}/imgs/composites.svg (100%) rename packages/client/dashboard/src/components/{dapp-home => dapp/home}/imgs/models.svg (100%) rename packages/client/dashboard/src/components/{dapp-home => dapp/home}/imgs/streams.svg (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ChartIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/CheckCircleIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/CheckronDown.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ChevronLeft.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ChevronRight.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ChevronRightDouble.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/CloseIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ComponentIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/CopyIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/DisabledIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/DiscordIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/DocIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/DownloadIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/EditIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/ExploreIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/GithubIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/HomeIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/InfoCircleIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/InfoIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/LayoutIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/LightbulbIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/LogoutIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/MediumIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/MergeIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/MirrorIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/NodeIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/PlusCircleIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/PlusIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/SdkIcon.tsx (100%) rename packages/client/dashboard/src/components/{common => icons}/SelectorIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/StarGoldIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/StarIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/TerminalIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/TrashIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/TwitterIcon.tsx (100%) rename packages/client/dashboard/src/components/{Icons => icons}/mirror.png (100%) rename packages/client/dashboard/src/components/{ => model}/CodeDownload.tsx (95%) rename packages/client/dashboard/src/components/{ => model}/CompositeDefinition.tsx (97%) rename packages/client/dashboard/src/components/{ => model}/CompositePlaygroundGraphiQL.tsx (96%) rename packages/client/dashboard/src/components/{ => model}/CreateCompositeModal.tsx (94%) rename packages/client/dashboard/src/components/{ => model}/CreateNewModel.tsx (90%) rename packages/client/dashboard/src/components/{ => model}/Definition.tsx (94%) rename packages/client/dashboard/src/components/{ => model}/FavoriteModal.tsx (91%) rename packages/client/dashboard/src/components/{ => model}/MergeModal.tsx (96%) rename packages/client/dashboard/src/components/{ => model}/ModelInstance.tsx (95%) rename packages/client/dashboard/src/components/{ => model}/ModelInstanceForm.tsx (95%) rename packages/client/dashboard/src/components/{ => model}/ModelInstanceFormModal.tsx (77%) rename packages/client/dashboard/src/components/{ => model}/ModelList.tsx (94%) rename packages/client/dashboard/src/components/{ => model}/ModelSDK.tsx (97%) rename packages/client/dashboard/src/components/{ => model}/ModelStreamList.tsx (93%) rename packages/client/dashboard/src/components/{ => model}/ModelTabs.tsx (93%) rename packages/client/dashboard/src/components/{ => model}/Playground.tsx (94%) rename packages/client/dashboard/src/components/{ => model}/sdkTemplate.ts (100%) rename packages/client/dashboard/src/components/{ => nav}/Header.tsx (92%) rename packages/client/dashboard/src/components/{ => nav}/LoginButton.tsx (97%) rename packages/client/dashboard/src/components/{ => nav}/Logo.tsx (100%) rename packages/client/dashboard/src/components/{ => nav}/Nav.tsx (87%) rename packages/client/dashboard/src/components/{ => node}/CreateCeramicNodeModal.tsx (94%) rename packages/client/dashboard/src/components/{ => node}/DeleteCeramicNodeModal.tsx (96%) rename packages/client/dashboard/src/components/{ => node}/NoCeramicNodeModal.tsx (89%) rename packages/client/dashboard/src/components/{ => node}/Terminal.tsx (97%) rename packages/client/dashboard/src/utils/{creamic-composedb/index.ts => createCompositeFromBrowser.ts} (99%) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index b168f7ba..a941a406 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -1,36 +1,35 @@ +import { useEffect, useState } from 'react' import { Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom' import styled from 'styled-components' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { Us3rAuthWithRainbowkitProvider } from '@us3r-network/auth-with-rainbowkit' import { ProfileStateProvider } from '@us3r-network/profile' +import { ToastContainer } from 'react-toastify' +import 'react-toastify/dist/ReactToastify.min.css' + +import { DappComposite, ModelStream } from './types.d' +import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' -import { useAppCtx } from './context/AppCtx' +import AppProvider, { useAppCtx } from './context/AppCtx' +import CeramicNodeProvider from './context/CeramicNodeCtx' import MyDapps from './container/MyDapps' -import NoMatch from './container/NoMatch' -import AppProvider from './context/AppCtx' -import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' -import DappHome from './container/DappHome' import DappCreate from './container/DappCreate' -import Header from './components/Header' -import Nav from './components/Nav' +import DappHome from './container/DappHome' import DappInfo from './container/DappInfo' -import ExploreModel from './container/ExploreModel' - import DappModelEditor from './container/DappModelEditor' import DappModelPlayground from './container/DappModelPlayground' +import DappModelSdk from './container/DappModelSdk' import DappDataStatistic from './container/DappDataStatistic' import Components from './container/Components' - -import { useEffect, useState } from 'react' -import ModelList from './components/ModelList' -import { DappComposite, ModelStream } from './types.d' -import { ToastContainer } from 'react-toastify' -import 'react-toastify/dist/ReactToastify.min.css' -import DappModelSdk from './container/DappModelSdk' import CeramicNodes from './container/CeramicNodes' -import CeramicNodeProvider from './context/CeramicNodeCtx' +import ExploreModel from './container/ExploreModel' +import NoMatch from './container/NoMatch' + +import Header from './components/nav/Header' +import Nav from './components/nav/Nav' +import ModelList from './components/model/ModelList' dayjs.extend(relativeTime) diff --git a/packages/client/dashboard/src/components/AppIconInput.tsx b/packages/client/dashboard/src/components/common/AppIconInput.tsx similarity index 95% rename from packages/client/dashboard/src/components/AppIconInput.tsx rename to packages/client/dashboard/src/components/common/AppIconInput.tsx index dca24162..fee386e8 100644 --- a/packages/client/dashboard/src/components/AppIconInput.tsx +++ b/packages/client/dashboard/src/components/common/AppIconInput.tsx @@ -1,7 +1,7 @@ import { useRef } from 'react' import styled from 'styled-components' -import { uploadImage } from '../api' -import PlusIcon from './Icons/PlusIcon' +import { uploadImage } from '../../api' +import PlusIcon from '../icons/PlusIcon' export default function AppIconInput({ icon, diff --git a/packages/client/dashboard/src/components/common/ComboBox.tsx b/packages/client/dashboard/src/components/common/ComboBox.tsx index f15e39db..a6608662 100644 --- a/packages/client/dashboard/src/components/common/ComboBox.tsx +++ b/packages/client/dashboard/src/components/common/ComboBox.tsx @@ -1,14 +1,11 @@ -import * as React from 'react' -import styled from 'styled-components' import type { ComboBoxProps } from '@react-types/combobox' +import * as React from 'react' +import { useButton, useComboBox, useFilter } from 'react-aria' import { useComboBoxState } from 'react-stately' -import { useComboBox, useButton, useFilter } from 'react-aria' - +import styled from 'styled-components' import { ListBox } from './ListBox' import { Popover } from './Popover' -import { Wrapper, Label } from './shared' - -export { Item, Section } from 'react-stately' +import { Label, Wrapper } from './shared' interface StyleProps { isFocused?: boolean diff --git a/packages/client/dashboard/src/components/CopyTint.tsx b/packages/client/dashboard/src/components/common/CopyTint.tsx similarity index 96% rename from packages/client/dashboard/src/components/CopyTint.tsx rename to packages/client/dashboard/src/components/common/CopyTint.tsx index 0f222890..12df4191 100644 --- a/packages/client/dashboard/src/components/CopyTint.tsx +++ b/packages/client/dashboard/src/components/common/CopyTint.tsx @@ -1,6 +1,6 @@ import { useCallback, useState } from 'react' -import CopyIcon from './Icons/CopyIcon' import styled from 'styled-components' +import CopyIcon from '../icons/CopyIcon' export default function CopyTint({ data }: { data: string }) { const [showCopyTint, setShowCopyTint] = useState(false) diff --git a/packages/client/dashboard/src/components/common/EnumSelect.tsx b/packages/client/dashboard/src/components/common/EnumSelect.tsx index acfb0c04..09dc4de7 100644 --- a/packages/client/dashboard/src/components/common/EnumSelect.tsx +++ b/packages/client/dashboard/src/components/common/EnumSelect.tsx @@ -1,16 +1,16 @@ +import { useMemo, useState } from 'react' import { Button, - ListBoxItem, Label, ListBox, + ListBoxItem, Popover, Select, SelectValue, } from 'react-aria-components' import styled from 'styled-components' -import SelectorIcon from './SelectorIcon' -import { useMemo, useState } from 'react' import { AppType, CeramicDBType, CeramicNetwork, GraphqlGenType, Network, Stage } from '../../types.d' +import SelectorIcon from '../icons/SelectorIcon' export default function EnumSelector< T extends Stage | Network | CeramicNetwork | CeramicDBType | AppType | GraphqlGenType diff --git a/packages/client/dashboard/src/components/ImgOrName.tsx b/packages/client/dashboard/src/components/common/ImgOrName.tsx similarity index 100% rename from packages/client/dashboard/src/components/ImgOrName.tsx rename to packages/client/dashboard/src/components/common/ImgOrName.tsx diff --git a/packages/client/dashboard/src/components/InputItem.tsx b/packages/client/dashboard/src/components/common/InputItem.tsx similarity index 100% rename from packages/client/dashboard/src/components/InputItem.tsx rename to packages/client/dashboard/src/components/common/InputItem.tsx diff --git a/packages/client/dashboard/src/components/common/ListBox.tsx b/packages/client/dashboard/src/components/common/ListBox.tsx index c277d660..bfea1e4f 100644 --- a/packages/client/dashboard/src/components/common/ListBox.tsx +++ b/packages/client/dashboard/src/components/common/ListBox.tsx @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-use-before-define */ -import * as React from 'react' -import styled from 'styled-components' import type { AriaListBoxOptions } from '@react-aria/listbox' import type { Node } from '@react-types/shared' -import type { ListState } from 'react-stately' +import * as React from 'react' import { useListBox, useOption } from 'react-aria' +import type { ListState } from 'react-stately' +import styled from 'styled-components' interface ListBoxProps extends AriaListBoxOptions { listBoxRef?: React.RefObject diff --git a/packages/client/dashboard/src/components/common/ModalBase.tsx b/packages/client/dashboard/src/components/common/ModalBase.tsx index 697227cf..d8e75838 100644 --- a/packages/client/dashboard/src/components/common/ModalBase.tsx +++ b/packages/client/dashboard/src/components/common/ModalBase.tsx @@ -6,8 +6,8 @@ import { ModalOverlay, ModalOverlayProps, } from 'react-aria-components' -import CloseIcon from '../Icons/CloseIcon' import styled, { keyframes } from 'styled-components' +import CloseIcon from '../icons/CloseIcon' export interface ModalBaseProps extends ModalOverlayProps { children?: React.ReactNode diff --git a/packages/client/dashboard/src/components/common/Popover.tsx b/packages/client/dashboard/src/components/common/Popover.tsx index 844c01ae..bbb04df9 100644 --- a/packages/client/dashboard/src/components/common/Popover.tsx +++ b/packages/client/dashboard/src/components/common/Popover.tsx @@ -1,8 +1,8 @@ -import type { OverlayTriggerState } from 'react-stately' import type { AriaPopoverProps } from '@react-aria/overlays' -import styled from 'styled-components' +import { DismissButton, Overlay, usePopover } from '@react-aria/overlays' import React from 'react' -import { usePopover, DismissButton, Overlay } from '@react-aria/overlays' +import type { OverlayTriggerState } from 'react-stately' +import styled from 'styled-components' interface PopoverProps extends Omit { children: React.ReactNode diff --git a/packages/client/dashboard/src/components/Search.tsx b/packages/client/dashboard/src/components/common/Search.tsx similarity index 96% rename from packages/client/dashboard/src/components/Search.tsx rename to packages/client/dashboard/src/components/common/Search.tsx index 2819fbeb..311036e5 100644 --- a/packages/client/dashboard/src/components/Search.tsx +++ b/packages/client/dashboard/src/components/common/Search.tsx @@ -1,5 +1,4 @@ -import { useCallback } from 'react' -import { useState } from 'react' +import { useCallback, useState } from 'react' import styled from 'styled-components' export default function Search({ diff --git a/packages/client/dashboard/src/components/common/Select.tsx b/packages/client/dashboard/src/components/common/Select.tsx index 06716348..4d232213 100644 --- a/packages/client/dashboard/src/components/common/Select.tsx +++ b/packages/client/dashboard/src/components/common/Select.tsx @@ -1,21 +1,18 @@ -import React from 'react' -import styled from 'styled-components' import type { AriaSelectProps } from '@react-types/select' -import { useSelectState } from 'react-stately' +import React from 'react' import { - useSelect, HiddenSelect, - useButton, mergeProps, + useButton, useFocusRing, + useSelect, } from 'react-aria' - +import { useSelectState } from 'react-stately' +import styled from 'styled-components' import { ListBox } from './ListBox' import { Popover } from './Popover' -import { Wrapper, Label } from './shared' -import SelectorIcon from './SelectorIcon' - -export { Item } from 'react-stately' +import SelectorIcon from '../icons/SelectorIcon' +import { Label, Wrapper } from './shared' interface ButtonProps { isOpen?: boolean diff --git a/packages/client/dashboard/src/components/TableBox.tsx b/packages/client/dashboard/src/components/common/TableBox.tsx similarity index 100% rename from packages/client/dashboard/src/components/TableBox.tsx rename to packages/client/dashboard/src/components/common/TableBox.tsx diff --git a/packages/client/dashboard/src/components/UserAvatarStyled.tsx b/packages/client/dashboard/src/components/common/UserAvatarStyled.tsx similarity index 100% rename from packages/client/dashboard/src/components/UserAvatarStyled.tsx rename to packages/client/dashboard/src/components/common/UserAvatarStyled.tsx diff --git a/packages/client/dashboard/src/components/DappSocialEditor.tsx b/packages/client/dashboard/src/components/dapp/DappSocialEditor.tsx similarity index 88% rename from packages/client/dashboard/src/components/DappSocialEditor.tsx rename to packages/client/dashboard/src/components/dapp/DappSocialEditor.tsx index 8a9723da..08470e8a 100644 --- a/packages/client/dashboard/src/components/DappSocialEditor.tsx +++ b/packages/client/dashboard/src/components/dapp/DappSocialEditor.tsx @@ -1,4 +1,4 @@ -import styled from 'styled-components' +import React from 'react' import { Button, Dialog, @@ -6,16 +6,15 @@ import { Modal, ModalOverlay, } from 'react-aria-components' - -import EditIcon from './Icons/EditIcon' +import styled from 'styled-components' +import { ClientDApp } from '../../types' +import DiscordIcon from '../icons/DiscordIcon' +import EditIcon from '../icons/EditIcon' +import GithubIcon from '../icons/GithubIcon' +import MediumIcon from '../icons/MediumIcon' +import MirrorIcon from '../icons/MirrorIcon' +import TwitterIcon from '../icons/TwitterIcon' import EditDappSocial from './EditDappSocial' -import TwitterIcon from './Icons/TwitterIcon' -import DiscordIcon from './Icons/DiscordIcon' -import MirrorIcon from './Icons/MirrorIcon' -import MediumIcon from './Icons/MediumIcon' -import GithubIcon from './Icons/GithubIcon' -import React from 'react' -import { ClientDApp } from '../types.d' const IconMap: { [key: string]: () => JSX.Element } = { twitter: TwitterIcon, diff --git a/packages/client/dashboard/src/components/DappTitleEditor.tsx b/packages/client/dashboard/src/components/dapp/DappTitleEditor.tsx similarity index 91% rename from packages/client/dashboard/src/components/DappTitleEditor.tsx rename to packages/client/dashboard/src/components/dapp/DappTitleEditor.tsx index 1c3fc6c4..c99ab6c8 100644 --- a/packages/client/dashboard/src/components/DappTitleEditor.tsx +++ b/packages/client/dashboard/src/components/dapp/DappTitleEditor.tsx @@ -1,6 +1,3 @@ -import styled from 'styled-components' -import EditIcon from '../components/Icons/EditIcon' -import EditDappInfo from '../components/EditDappInfo' import { Button, Dialog, @@ -8,7 +5,10 @@ import { Modal, ModalOverlay, } from 'react-aria-components' -import { ClientDApp, Network } from '../types.d' +import styled from 'styled-components' +import { ClientDApp, Network } from '../../types.d' +import EditIcon from '../icons/EditIcon' +import EditDappInfo from './EditDappInfo' export default function DappTitleEditor({ selectedDapp, diff --git a/packages/client/dashboard/src/components/DelDappConfirmModal.tsx b/packages/client/dashboard/src/components/dapp/DelDappConfirmModal.tsx similarity index 92% rename from packages/client/dashboard/src/components/DelDappConfirmModal.tsx rename to packages/client/dashboard/src/components/dapp/DelDappConfirmModal.tsx index 98722dc2..b4682aa6 100644 --- a/packages/client/dashboard/src/components/DelDappConfirmModal.tsx +++ b/packages/client/dashboard/src/components/dapp/DelDappConfirmModal.tsx @@ -1,11 +1,11 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' -import styled from 'styled-components' -import { useAppCtx } from '../context/AppCtx' import { useCallback, useState } from 'react' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { delDapp } from '../api/dapp' -import CloseIcon from './Icons/CloseIcon' -import InfoCircleIcon from './Icons/InfoCircleIcon' +import styled from 'styled-components' +import { delDapp } from '../../api/dapp' +import { useAppCtx } from '../../context/AppCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import CloseIcon from '../icons/CloseIcon' +import InfoCircleIcon from '../icons/InfoCircleIcon' export default function DelConfirmModal({ closeModal, diff --git a/packages/client/dashboard/src/components/EditDappInfo.tsx b/packages/client/dashboard/src/components/dapp/EditDappInfo.tsx similarity index 94% rename from packages/client/dashboard/src/components/EditDappInfo.tsx rename to packages/client/dashboard/src/components/dapp/EditDappInfo.tsx index e5718c85..77ceeb29 100644 --- a/packages/client/dashboard/src/components/EditDappInfo.tsx +++ b/packages/client/dashboard/src/components/dapp/EditDappInfo.tsx @@ -1,16 +1,16 @@ -import { useCallback, useState } from 'react' -import styled from 'styled-components' -import CloseIcon from './Icons/CloseIcon' -import AppIconInput from './AppIconInput' -import InputItem from './InputItem' -import EnumSelect from './common/EnumSelect' -import { ClientDApp, AppType, Network, Stage } from '../types.d' -import { updateDapp } from '../api/dapp' import { useAuthentication, useSession, } from '@us3r-network/auth-with-rainbowkit' -import { useAppCtx } from '../context/AppCtx' +import { useCallback, useState } from 'react' +import styled from 'styled-components' +import { updateDapp } from '../../api/dapp' +import { useAppCtx } from '../../context/AppCtx' +import { AppType, ClientDApp, Network, Stage } from '../../types.d' +import EnumSelect from '../common/EnumSelect' +import CloseIcon from '../icons/CloseIcon' +import AppIconInput from '../common/AppIconInput' +import InputItem from '../common/InputItem' export default function EditDappInfo({ closeModal, diff --git a/packages/client/dashboard/src/components/EditDappSocial.tsx b/packages/client/dashboard/src/components/dapp/EditDappSocial.tsx similarity index 95% rename from packages/client/dashboard/src/components/EditDappSocial.tsx rename to packages/client/dashboard/src/components/dapp/EditDappSocial.tsx index 4840cdd6..899b6607 100644 --- a/packages/client/dashboard/src/components/EditDappSocial.tsx +++ b/packages/client/dashboard/src/components/dapp/EditDappSocial.tsx @@ -1,15 +1,15 @@ -import { useCallback, useState } from 'react' -import styled from 'styled-components' -import CloseIcon from './Icons/CloseIcon' -import InputItem from './InputItem' -import { updateDapp } from '../api/dapp' -import { DISCORD, GITHUB, MEDIUM, MIRROR, TWITTER } from '../constants' -import { ClientDApp } from '../types.d' import { useAuthentication, useSession, } from '@us3r-network/auth-with-rainbowkit' -import { useAppCtx } from '../context/AppCtx' +import { useCallback, useState } from 'react' +import styled from 'styled-components' +import { updateDapp } from '../../api/dapp' +import { DISCORD, GITHUB, MEDIUM, MIRROR, TWITTER } from '../../constants' +import { useAppCtx } from '../../context/AppCtx' +import { ClientDApp } from '../../types' +import CloseIcon from '../icons/CloseIcon' +import InputItem from '../common/InputItem' export default function EditDappSocial({ closeModal, diff --git a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx b/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx similarity index 89% rename from packages/client/dashboard/src/components/dapp-home/Dashboard.tsx rename to packages/client/dashboard/src/components/dapp/home/Dashboard.tsx index 1e4559c7..c10e7281 100644 --- a/packages/client/dashboard/src/components/dapp-home/Dashboard.tsx +++ b/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx @@ -1,11 +1,11 @@ +import { useEffect, useMemo, useState } from 'react' import styled from 'styled-components' -import modelsIconUrl from './imgs/models.svg' +import { getDappComposites } from '../../../api/composite' +import { getStreamsCountWithModels } from '../../../api/model' +import { ClientDApp, Network } from '../../../types' import compositesIconUrl from './imgs/composites.svg' +import modelsIconUrl from './imgs/models.svg' import streamsIconUrl from './imgs/streams.svg' -import { useEffect, useState, useMemo } from 'react' -import { getStreamsCountWithModels } from '../../api/model' -import { getDappComposites } from '../../api/composite' -import { ClientDApp, Network } from '../../types.d' export default function Dashboard({ dapp }: { dapp: ClientDApp }) { const models = useMemo(() => dapp?.models || [], [dapp]) diff --git a/packages/client/dashboard/src/components/dapp-home/Header.tsx b/packages/client/dashboard/src/components/dapp/home/Header.tsx similarity index 84% rename from packages/client/dashboard/src/components/dapp-home/Header.tsx rename to packages/client/dashboard/src/components/dapp/home/Header.tsx index 5895378c..129a5868 100644 --- a/packages/client/dashboard/src/components/dapp-home/Header.tsx +++ b/packages/client/dashboard/src/components/dapp/home/Header.tsx @@ -1,9 +1,9 @@ -import styled from 'styled-components' -import { createImageFromInitials } from '../../utils/createImage' -import { getRandomColor } from '../../utils/randomColor' -import { useRef } from 'react' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import useIsOwner from '../../hooks/useIsOwner' +import { useRef } from 'react' +import styled from 'styled-components' +import useIsOwner from '../../../hooks/useIsOwner' +import { createImageFromInitials } from '../../../utils/createImage' +import { getRandomColor } from '../../../utils/randomColor' export default function Header({ icon, diff --git a/packages/client/dashboard/src/components/dapp-home/imgs/composites.svg b/packages/client/dashboard/src/components/dapp/home/imgs/composites.svg similarity index 100% rename from packages/client/dashboard/src/components/dapp-home/imgs/composites.svg rename to packages/client/dashboard/src/components/dapp/home/imgs/composites.svg diff --git a/packages/client/dashboard/src/components/dapp-home/imgs/models.svg b/packages/client/dashboard/src/components/dapp/home/imgs/models.svg similarity index 100% rename from packages/client/dashboard/src/components/dapp-home/imgs/models.svg rename to packages/client/dashboard/src/components/dapp/home/imgs/models.svg diff --git a/packages/client/dashboard/src/components/dapp-home/imgs/streams.svg b/packages/client/dashboard/src/components/dapp/home/imgs/streams.svg similarity index 100% rename from packages/client/dashboard/src/components/dapp-home/imgs/streams.svg rename to packages/client/dashboard/src/components/dapp/home/imgs/streams.svg diff --git a/packages/client/dashboard/src/components/Icons/ChartIcon.tsx b/packages/client/dashboard/src/components/icons/ChartIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ChartIcon.tsx rename to packages/client/dashboard/src/components/icons/ChartIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/CheckCircleIcon.tsx b/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/CheckCircleIcon.tsx rename to packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/CheckronDown.tsx b/packages/client/dashboard/src/components/icons/CheckronDown.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/CheckronDown.tsx rename to packages/client/dashboard/src/components/icons/CheckronDown.tsx diff --git a/packages/client/dashboard/src/components/Icons/ChevronLeft.tsx b/packages/client/dashboard/src/components/icons/ChevronLeft.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ChevronLeft.tsx rename to packages/client/dashboard/src/components/icons/ChevronLeft.tsx diff --git a/packages/client/dashboard/src/components/Icons/ChevronRight.tsx b/packages/client/dashboard/src/components/icons/ChevronRight.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ChevronRight.tsx rename to packages/client/dashboard/src/components/icons/ChevronRight.tsx diff --git a/packages/client/dashboard/src/components/Icons/ChevronRightDouble.tsx b/packages/client/dashboard/src/components/icons/ChevronRightDouble.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ChevronRightDouble.tsx rename to packages/client/dashboard/src/components/icons/ChevronRightDouble.tsx diff --git a/packages/client/dashboard/src/components/Icons/CloseIcon.tsx b/packages/client/dashboard/src/components/icons/CloseIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/CloseIcon.tsx rename to packages/client/dashboard/src/components/icons/CloseIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/ComponentIcon.tsx b/packages/client/dashboard/src/components/icons/ComponentIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ComponentIcon.tsx rename to packages/client/dashboard/src/components/icons/ComponentIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/CopyIcon.tsx b/packages/client/dashboard/src/components/icons/CopyIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/CopyIcon.tsx rename to packages/client/dashboard/src/components/icons/CopyIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/DisabledIcon.tsx b/packages/client/dashboard/src/components/icons/DisabledIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/DisabledIcon.tsx rename to packages/client/dashboard/src/components/icons/DisabledIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/DiscordIcon.tsx b/packages/client/dashboard/src/components/icons/DiscordIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/DiscordIcon.tsx rename to packages/client/dashboard/src/components/icons/DiscordIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/DocIcon.tsx b/packages/client/dashboard/src/components/icons/DocIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/DocIcon.tsx rename to packages/client/dashboard/src/components/icons/DocIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/DownloadIcon.tsx b/packages/client/dashboard/src/components/icons/DownloadIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/DownloadIcon.tsx rename to packages/client/dashboard/src/components/icons/DownloadIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/EditIcon.tsx b/packages/client/dashboard/src/components/icons/EditIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/EditIcon.tsx rename to packages/client/dashboard/src/components/icons/EditIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/ExploreIcon.tsx b/packages/client/dashboard/src/components/icons/ExploreIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/ExploreIcon.tsx rename to packages/client/dashboard/src/components/icons/ExploreIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/GithubIcon.tsx b/packages/client/dashboard/src/components/icons/GithubIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/GithubIcon.tsx rename to packages/client/dashboard/src/components/icons/GithubIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/HomeIcon.tsx b/packages/client/dashboard/src/components/icons/HomeIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/HomeIcon.tsx rename to packages/client/dashboard/src/components/icons/HomeIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/InfoCircleIcon.tsx b/packages/client/dashboard/src/components/icons/InfoCircleIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/InfoCircleIcon.tsx rename to packages/client/dashboard/src/components/icons/InfoCircleIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/InfoIcon.tsx b/packages/client/dashboard/src/components/icons/InfoIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/InfoIcon.tsx rename to packages/client/dashboard/src/components/icons/InfoIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/LayoutIcon.tsx b/packages/client/dashboard/src/components/icons/LayoutIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/LayoutIcon.tsx rename to packages/client/dashboard/src/components/icons/LayoutIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/LightbulbIcon.tsx b/packages/client/dashboard/src/components/icons/LightbulbIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/LightbulbIcon.tsx rename to packages/client/dashboard/src/components/icons/LightbulbIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/LogoutIcon.tsx b/packages/client/dashboard/src/components/icons/LogoutIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/LogoutIcon.tsx rename to packages/client/dashboard/src/components/icons/LogoutIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/MediumIcon.tsx b/packages/client/dashboard/src/components/icons/MediumIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/MediumIcon.tsx rename to packages/client/dashboard/src/components/icons/MediumIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/MergeIcon.tsx b/packages/client/dashboard/src/components/icons/MergeIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/MergeIcon.tsx rename to packages/client/dashboard/src/components/icons/MergeIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/MirrorIcon.tsx b/packages/client/dashboard/src/components/icons/MirrorIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/MirrorIcon.tsx rename to packages/client/dashboard/src/components/icons/MirrorIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/NodeIcon.tsx b/packages/client/dashboard/src/components/icons/NodeIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/NodeIcon.tsx rename to packages/client/dashboard/src/components/icons/NodeIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/PlusCircleIcon.tsx b/packages/client/dashboard/src/components/icons/PlusCircleIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/PlusCircleIcon.tsx rename to packages/client/dashboard/src/components/icons/PlusCircleIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/PlusIcon.tsx b/packages/client/dashboard/src/components/icons/PlusIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/PlusIcon.tsx rename to packages/client/dashboard/src/components/icons/PlusIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/SdkIcon.tsx b/packages/client/dashboard/src/components/icons/SdkIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/SdkIcon.tsx rename to packages/client/dashboard/src/components/icons/SdkIcon.tsx diff --git a/packages/client/dashboard/src/components/common/SelectorIcon.tsx b/packages/client/dashboard/src/components/icons/SelectorIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/common/SelectorIcon.tsx rename to packages/client/dashboard/src/components/icons/SelectorIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/StarGoldIcon.tsx b/packages/client/dashboard/src/components/icons/StarGoldIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/StarGoldIcon.tsx rename to packages/client/dashboard/src/components/icons/StarGoldIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/StarIcon.tsx b/packages/client/dashboard/src/components/icons/StarIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/StarIcon.tsx rename to packages/client/dashboard/src/components/icons/StarIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/TerminalIcon.tsx b/packages/client/dashboard/src/components/icons/TerminalIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/TerminalIcon.tsx rename to packages/client/dashboard/src/components/icons/TerminalIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/TrashIcon.tsx b/packages/client/dashboard/src/components/icons/TrashIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/TrashIcon.tsx rename to packages/client/dashboard/src/components/icons/TrashIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/TwitterIcon.tsx b/packages/client/dashboard/src/components/icons/TwitterIcon.tsx similarity index 100% rename from packages/client/dashboard/src/components/Icons/TwitterIcon.tsx rename to packages/client/dashboard/src/components/icons/TwitterIcon.tsx diff --git a/packages/client/dashboard/src/components/Icons/mirror.png b/packages/client/dashboard/src/components/icons/mirror.png similarity index 100% rename from packages/client/dashboard/src/components/Icons/mirror.png rename to packages/client/dashboard/src/components/icons/mirror.png diff --git a/packages/client/dashboard/src/components/CodeDownload.tsx b/packages/client/dashboard/src/components/model/CodeDownload.tsx similarity index 95% rename from packages/client/dashboard/src/components/CodeDownload.tsx rename to packages/client/dashboard/src/components/model/CodeDownload.tsx index 2aedec14..51e3dd77 100644 --- a/packages/client/dashboard/src/components/CodeDownload.tsx +++ b/packages/client/dashboard/src/components/model/CodeDownload.tsx @@ -1,9 +1,9 @@ import FileSaver from 'file-saver' -import ChevronDown from './Icons/CheckronDown' -import DownloadIcon from './Icons/DownloadIcon' -import { Code } from './ModelSDK' -import styled from 'styled-components' import { useState } from 'react' +import styled from 'styled-components' +import ChevronDown from '../icons/CheckronDown' +import DownloadIcon from '../icons/DownloadIcon' +import { Code } from './ModelSDK' export default function CodeDownload({ downloadContent, diff --git a/packages/client/dashboard/src/components/CompositeDefinition.tsx b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx similarity index 97% rename from packages/client/dashboard/src/components/CompositeDefinition.tsx rename to packages/client/dashboard/src/components/model/CompositeDefinition.tsx index 74a8e070..1e021ac1 100644 --- a/packages/client/dashboard/src/components/CompositeDefinition.tsx +++ b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx @@ -1,9 +1,8 @@ +import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { useEffect, useState } from 'react' import styled from 'styled-components' -import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { DappComposite } from '../types.d' -import { schemas } from '../utils/composedb-types/schemas' - +import { DappComposite } from '../../types' +import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' export default function CompositeDefinition({ diff --git a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx similarity index 96% rename from packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx rename to packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx index 98b74014..a6e1f8b8 100644 --- a/packages/client/dashboard/src/components/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx @@ -1,5 +1,4 @@ -import 'json-bigint-patch' -import React, { useCallback, useEffect, useMemo, useState } from 'react' +import { RuntimeCompositeDefinition } from '@composedb/types' import { useExplorerPlugin } from '@graphiql/plugin-explorer' import { Fetcher, FetcherOpts, FetcherParams } from '@graphiql/toolkit' import { LoadFromUrlOptions } from '@graphql-tools/url-loader' @@ -9,12 +8,12 @@ import { GraphiQLProps, GraphiQLProvider, } from 'graphiql' -import { RuntimeCompositeDefinition } from '@composedb/types' - +import 'json-bigint-patch' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import styled from 'styled-components' -import { createGraphqlDefaultQuery } from '../utils/createDefaultQuery' -import { useComposeClient } from '../hooks/useComposeClient' import { useUrlSearchParams } from 'use-url-search-params' +import { useComposeClient } from '../../hooks/useComposeClient' +import { createGraphqlDefaultQuery } from '../../utils/createDefaultQuery' const type = { query: String, diff --git a/packages/client/dashboard/src/components/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx similarity index 94% rename from packages/client/dashboard/src/components/CreateCompositeModal.tsx rename to packages/client/dashboard/src/components/model/CreateCompositeModal.tsx index 91fe02d4..6f95c123 100644 --- a/packages/client/dashboard/src/components/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx @@ -1,15 +1,13 @@ -import styled from 'styled-components' -import { useCallback, useState } from 'react' -import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { AxiosError } from 'axios' - -import CloseIcon from './Icons/CloseIcon' - -import { schemas } from '../utils/composedb-types/schemas' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { createDappComposites } from '../api/composite' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { ModelStream } from '../types.d' +import { AxiosError } from 'axios' +import { GraphQLEditor, PassedSchema } from 'graphql-editor' +import { useCallback, useState } from 'react' +import styled from 'styled-components' +import { createDappComposites } from '../../api/composite' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { ModelStream } from '../../types.d' +import { schemas } from '../../utils/composedb-types/schemas' +import CloseIcon from '../icons/CloseIcon' const TINT_WORD = `# Edit the model's relation based on your business needs. # See Example below diff --git a/packages/client/dashboard/src/components/CreateNewModel.tsx b/packages/client/dashboard/src/components/model/CreateNewModel.tsx similarity index 90% rename from packages/client/dashboard/src/components/CreateNewModel.tsx rename to packages/client/dashboard/src/components/model/CreateNewModel.tsx index 8a2a3f87..67cf3559 100644 --- a/packages/client/dashboard/src/components/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewModel.tsx @@ -1,18 +1,15 @@ -import styled from 'styled-components' -import { useCallback, useState } from 'react' -import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { AxiosError } from 'axios' - -import CloseIcon from './Icons/CloseIcon' - -import { schemas } from '../utils/composedb-types/schemas' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { updateDapp } from '../api/dapp' -// import { Network } from './Selector/EnumSelect' -import { useAppCtx } from '../context/AppCtx' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { createCompositeFromBrowser } from '../utils/creamic-composedb' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { AxiosError } from 'axios' +import { GraphQLEditor, PassedSchema } from 'graphql-editor' +import { useCallback, useState } from 'react' +import styled from 'styled-components' +import { updateDapp } from '../../api/dapp' +import { useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { schemas } from '../../utils/composedb-types/schemas' +import { createCompositeFromBrowser } from '../../utils/createCompositeFromBrowser' +import CloseIcon from '../icons/CloseIcon' export default function CreateNewModel ({ closeModal diff --git a/packages/client/dashboard/src/components/Definition.tsx b/packages/client/dashboard/src/components/model/Definition.tsx similarity index 94% rename from packages/client/dashboard/src/components/Definition.tsx rename to packages/client/dashboard/src/components/model/Definition.tsx index f6b9b884..b583bf39 100644 --- a/packages/client/dashboard/src/components/Definition.tsx +++ b/packages/client/dashboard/src/components/model/Definition.tsx @@ -1,11 +1,11 @@ +import { AxiosError } from 'axios' +import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' -import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { getModelInfo, queryModelGraphql } from '../api/model' -import { ModeQueryResult, ModelStream, Network } from '../types.d' -import { schemas } from '../utils/composedb-types/schemas' -import { AxiosError } from 'axios' -import useSelectedDapp from '../hooks/useSelectedDapp' +import { getModelInfo, queryModelGraphql } from '../../api/model' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { ModeQueryResult, ModelStream, Network } from '../../types.d' +import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' export default function Definition({ streamId }: { streamId: string }) { diff --git a/packages/client/dashboard/src/components/FavoriteModal.tsx b/packages/client/dashboard/src/components/model/FavoriteModal.tsx similarity index 91% rename from packages/client/dashboard/src/components/FavoriteModal.tsx rename to packages/client/dashboard/src/components/model/FavoriteModal.tsx index c54c91f8..03b0a1b6 100644 --- a/packages/client/dashboard/src/components/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/model/FavoriteModal.tsx @@ -1,20 +1,20 @@ -import styled from 'styled-components' -import CloseIcon from './Icons/CloseIcon' -import { TableBox, TableContainer } from './TableBox' -import PlusCircleIcon from './Icons/PlusCircleIcon' -import StarGoldIcon from './Icons/StarGoldIcon' -import CheckCircleIcon from './Icons/CheckCircleIcon' -import { useCallback, useEffect, useState } from 'react' -import useSelectedDapp from '../hooks/useSelectedDapp' import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { PersonalCollection, useAppCtx } from '../context/AppCtx' -import { getStarModels, startIndexModel } from '../api/model' -import { updateDapp } from '../api/dapp' -import { CeramicStatus, ModelStream, Network } from '../types.d' -import { shortPubKey } from '../utils/shortPubKey' import dayjs from 'dayjs' -import { S3_SCAN_URL } from '../constants' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { useCallback, useEffect, useState } from 'react' +import styled from 'styled-components' +import { updateDapp } from '../../api/dapp' +import { getStarModels, startIndexModel } from '../../api/model' +import { S3_SCAN_URL } from '../../constants' +import { PersonalCollection, useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { CeramicStatus, ModelStream, Network } from '../../types.d' +import { shortPubKey } from '../../utils/shortPubKey' +import { TableBox, TableContainer } from '../common/TableBox' +import CheckCircleIcon from '../icons/CheckCircleIcon' +import CloseIcon from '../icons/CloseIcon' +import PlusCircleIcon from '../icons/PlusCircleIcon' +import StarGoldIcon from '../icons/StarGoldIcon' export default function FavoriteModal({ closeModal, diff --git a/packages/client/dashboard/src/components/MergeModal.tsx b/packages/client/dashboard/src/components/model/MergeModal.tsx similarity index 96% rename from packages/client/dashboard/src/components/MergeModal.tsx rename to packages/client/dashboard/src/components/model/MergeModal.tsx index b83004fa..cc6e6657 100644 --- a/packages/client/dashboard/src/components/MergeModal.tsx +++ b/packages/client/dashboard/src/components/model/MergeModal.tsx @@ -1,14 +1,14 @@ -import { useCallback, useState } from 'react' -import { CheckboxGroup, Checkbox, Label } from 'react-aria-components' -import { Composite } from '@composedb/devtools' -import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' -import { queryModelGraphql } from '../api/model' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { ClientDApp, DappComposite, ModelStream, Network } from '../types.d' -import styled from 'styled-components' -import FileSaver from 'file-saver' import { CeramicClient } from '@ceramicnetwork/http-client' +import { Composite } from '@composedb/devtools' import type { EncodedCompositeDefinition } from '@composedb/types' +import FileSaver from 'file-saver' +import { useCallback, useState } from 'react' +import { Checkbox, CheckboxGroup, Label } from 'react-aria-components' +import styled from 'styled-components' +import { queryModelGraphql } from '../../api/model' +import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../../constants' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { ClientDApp, DappComposite, ModelStream, Network } from '../../types.d' export default function MergeModal({ closeModal, diff --git a/packages/client/dashboard/src/components/ModelInstance.tsx b/packages/client/dashboard/src/components/model/ModelInstance.tsx similarity index 95% rename from packages/client/dashboard/src/components/ModelInstance.tsx rename to packages/client/dashboard/src/components/model/ModelInstance.tsx index f1d4b472..433f08e0 100644 --- a/packages/client/dashboard/src/components/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/model/ModelInstance.tsx @@ -1,21 +1,19 @@ -import { useCallback, useEffect, useState } from 'react' - -import styled from 'styled-components' -import InfiniteScroll from 'react-infinite-scroll-component' -// import ModelStreamList from '../../components/ModelStreamList' +import { Stream } from '@ceramicnetwork/common' import { AxiosError } from 'axios' -import { ModelStream, Network } from '../types.d' -import { queryModelGraphql } from '../api/model' -import ModelStreamList from './ModelStreamList' +import { lowerFirst } from 'lodash' +import { useCallback, useEffect, useState } from 'react' import { Button } from 'react-aria-components' -import PlusIcon from './Icons/PlusIcon' -import ModelInstanceFormModal from './ModelInstanceFormModal' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { useComposeClient } from '../hooks/useComposeClient' +import InfiniteScroll from 'react-infinite-scroll-component' import { toast } from 'react-toastify' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { lowerFirst } from 'lodash' -import { Stream } from '@ceramicnetwork/common' +import styled from 'styled-components' +import { queryModelGraphql } from '../../api/model' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import { useComposeClient } from '../../hooks/useComposeClient' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { ModelStream, Network } from '../../types' +import PlusIcon from '../icons/PlusIcon' +import ModelInstanceFormModal from './ModelInstanceFormModal' +import ModelStreamList from './ModelStreamList' export default function Instance ({ streamId, @@ -51,7 +49,6 @@ export default function Instance ({ const { currCeramicNode } = useCeramicNodeCtx() const { - ceramicClient, loadMultiStreams, composeClient, composeClientAuthenticated @@ -113,6 +110,7 @@ export default function Instance ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [composeClientAuthenticated, composeClient] ) @@ -126,7 +124,7 @@ export default function Instance ({ const newStreams = await loadMultiStreams(ids) setStreams({ ...streams, ...newStreams }) } - }, [queryStream, endCursor, streams]) + }, [endCursor, queryStream, loadMultiStreams, streams]) const fetchMids = useCallback(async () => { try { @@ -146,7 +144,7 @@ export default function Instance ({ } finally { setLoading(false) } - }, [queryStream]) + }, [loadMultiStreams, queryStream]) useEffect(() => { fetchMids() diff --git a/packages/client/dashboard/src/components/ModelInstanceForm.tsx b/packages/client/dashboard/src/components/model/ModelInstanceForm.tsx similarity index 95% rename from packages/client/dashboard/src/components/ModelInstanceForm.tsx rename to packages/client/dashboard/src/components/model/ModelInstanceForm.tsx index e585b05d..ce72dff2 100644 --- a/packages/client/dashboard/src/components/ModelInstanceForm.tsx +++ b/packages/client/dashboard/src/components/model/ModelInstanceForm.tsx @@ -1,8 +1,8 @@ -import { useMemo } from 'react' -import styled, { css } from 'styled-components' import Form, { FormProps } from '@rjsf/core' import { RJSFSchema } from '@rjsf/utils' import defaultValidator from '@rjsf/validator-ajv8' +import { useMemo } from 'react' +import styled, { css } from 'styled-components' const formatSchema = (schema: RJSFSchema) => { const newSchema = { ...schema } diff --git a/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx b/packages/client/dashboard/src/components/model/ModelInstanceFormModal.tsx similarity index 77% rename from packages/client/dashboard/src/components/ModelInstanceFormModal.tsx rename to packages/client/dashboard/src/components/model/ModelInstanceFormModal.tsx index f48a0b0b..04d1d2fb 100644 --- a/packages/client/dashboard/src/components/ModelInstanceFormModal.tsx +++ b/packages/client/dashboard/src/components/model/ModelInstanceFormModal.tsx @@ -1,7 +1,6 @@ -import { ModelInstanceFormProps } from './ModelInstanceForm' -import ModelInstanceForm from './ModelInstanceForm' import styled from 'styled-components' -import ModalBase, { ModalBaseProps } from './common/ModalBase' +import ModalBase, { ModalBaseProps } from '../common/ModalBase' +import ModelInstanceForm, { ModelInstanceFormProps } from './ModelInstanceForm' interface ModelInstanceFormModalProps extends ModalBaseProps, diff --git a/packages/client/dashboard/src/components/ModelList.tsx b/packages/client/dashboard/src/components/model/ModelList.tsx similarity index 94% rename from packages/client/dashboard/src/components/ModelList.tsx rename to packages/client/dashboard/src/components/model/ModelList.tsx index ea6d4607..68aeb820 100644 --- a/packages/client/dashboard/src/components/ModelList.tsx +++ b/packages/client/dashboard/src/components/model/ModelList.tsx @@ -1,30 +1,26 @@ -import styled from 'styled-components' -import { Button, Dialog, DialogTrigger, Popover } from 'react-aria-components' -import { MenuTrigger, Menu, MenuItem } from 'react-aria-components' - -import { Modal, ModalOverlay } from 'react-aria-components' - -import PlusIcon from './Icons/PlusIcon' -import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' -import useSelectedDapp from '../hooks/useSelectedDapp' +import { useSession } from '@us3r-network/auth-with-rainbowkit' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { CeramicStatus, DappComposite, ModelStream, Network } from '../types.d' -import { getStarModels } from '../api/model' -import { getDappComposites, deleteDappComposites } from '../api/composite' -import TrashIcon from './Icons/TrashIcon' +import { Button, Dialog, DialogTrigger, Menu, MenuItem, MenuTrigger, Modal, ModalOverlay, Popover } from 'react-aria-components' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' +import styled from 'styled-components' +import { deleteDappComposites, getDappComposites } from '../../api/composite' +import { updateDapp } from '../../api/dapp' +import { getStarModels } from '../../api/model' +import { useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useIsOwner from '../../hooks/useIsOwner' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { CeramicStatus, DappComposite, ModelStream, Network } from '../../types.d' +import { shortPubKey } from '../../utils/shortPubKey' +import CopyTint from '../common/CopyTint' +import MergeIcon from '../icons/MergeIcon' +import PlusIcon from '../icons/PlusIcon' +import TrashIcon from '../icons/TrashIcon' +import NoCeramicNodeModal from '../node/NoCeramicNodeModal' +import CreateCompositeModal from './CreateCompositeModal' +import CreateNewModel from './CreateNewModel' import FavoriteModel from './FavoriteModal' -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { useAppCtx } from '../context/AppCtx' -import { updateDapp } from '../api/dapp' import MergeModal from './MergeModal' -import CreateNewModel from './CreateNewModel' -import CreateCompositeModal from './CreateCompositeModal' -import MergeIcon from './Icons/MergeIcon' -import { shortPubKey } from '../utils/shortPubKey' -import CopyTint from './CopyTint' -import useIsOwner from '../hooks/useIsOwner' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import NoCeramicNodeModal from './NoCeramicNodeModal' export default function ModelList ({ editable, diff --git a/packages/client/dashboard/src/components/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx similarity index 97% rename from packages/client/dashboard/src/components/ModelSDK.tsx rename to packages/client/dashboard/src/components/model/ModelSDK.tsx index 6c110b99..f43a405e 100644 --- a/packages/client/dashboard/src/components/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -1,20 +1,17 @@ -import { useCallback, useEffect, useState } from 'react' -import styled from 'styled-components' import camelCase from 'camelcase' +import FileSaver from 'file-saver' import JSZip from 'jszip' - import Prism from 'prismjs' import 'prismjs/components/prism-typescript' -import 'prismjs/plugins/line-numbers/prism-line-numbers.js' import 'prismjs/plugins/line-numbers/prism-line-numbers.css' - -import { getModelSDK } from '../api/model' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { sdkTemplate } from './sdkTemplate' - -import { GraphqlGenType, Network } from '../types.d' +import 'prismjs/plugins/line-numbers/prism-line-numbers.js' +import { useCallback, useEffect, useState } from 'react' import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' -import FileSaver from 'file-saver' +import styled from 'styled-components' +import { getModelSDK } from '../../api/model' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { GraphqlGenType, Network } from '../../types.d' +import { sdkTemplate } from './sdkTemplate' export default function ModelSDK({ modelId, diff --git a/packages/client/dashboard/src/components/ModelStreamList.tsx b/packages/client/dashboard/src/components/model/ModelStreamList.tsx similarity index 93% rename from packages/client/dashboard/src/components/ModelStreamList.tsx rename to packages/client/dashboard/src/components/model/ModelStreamList.tsx index fbd9a140..80458031 100644 --- a/packages/client/dashboard/src/components/ModelStreamList.tsx +++ b/packages/client/dashboard/src/components/model/ModelStreamList.tsx @@ -1,17 +1,17 @@ -import styled from 'styled-components' -import { TableBox } from './TableBox' -import dayjs from 'dayjs' -import { shortPubKey } from '../utils/shortPubKey' -import UserAvatarStyled from './UserAvatarStyled' -import { UserName } from '@us3r-network/profile' -import EditIcon from './Icons/EditIcon' -import { Button } from 'react-aria-components' +import { Stream } from '@ceramicnetwork/common' import { useSession } from '@us3r-network/auth-with-rainbowkit' +import { UserName } from '@us3r-network/profile' +import dayjs from 'dayjs' import { useMemo } from 'react' -import { S3_SCAN_URL } from '../constants' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { Stream } from '@ceramicnetwork/common' -import PlusIcon from './Icons/PlusIcon' +import { Button } from 'react-aria-components' +import styled from 'styled-components' +import { S3_SCAN_URL } from '../../constants' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { shortPubKey } from '../../utils/shortPubKey' +import { TableBox } from '../common/TableBox' +import UserAvatarStyled from '../common/UserAvatarStyled' +import EditIcon from '../icons/EditIcon' +import PlusIcon from '../icons/PlusIcon' export default function ModelStreamList ({ modelId, diff --git a/packages/client/dashboard/src/components/ModelTabs.tsx b/packages/client/dashboard/src/components/model/ModelTabs.tsx similarity index 93% rename from packages/client/dashboard/src/components/ModelTabs.tsx rename to packages/client/dashboard/src/components/model/ModelTabs.tsx index bd605d73..11106f20 100644 --- a/packages/client/dashboard/src/components/ModelTabs.tsx +++ b/packages/client/dashboard/src/components/model/ModelTabs.tsx @@ -6,9 +6,8 @@ * @FilePath: /s3/packages/client/dashboard/src/components/ModelTabs.tsx * @Description: */ -import { Tabs, TabList, Tab, TabPanel } from 'react-aria-components' +import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' import Definition from './Definition' - import ModelSDK from './ModelSDK' export default function ModelTabs({ diff --git a/packages/client/dashboard/src/components/Playground.tsx b/packages/client/dashboard/src/components/model/Playground.tsx similarity index 94% rename from packages/client/dashboard/src/components/Playground.tsx rename to packages/client/dashboard/src/components/model/Playground.tsx index cc7ea038..5c0f4dda 100644 --- a/packages/client/dashboard/src/components/Playground.tsx +++ b/packages/client/dashboard/src/components/model/Playground.tsx @@ -1,24 +1,23 @@ -import 'json-bigint-patch' -import React, { useCallback, useEffect, useMemo, useState } from 'react' +import { RuntimeCompositeDefinition } from '@composedb/types' import { useExplorerPlugin } from '@graphiql/plugin-explorer' import { Fetcher, FetcherOpts, FetcherParams } from '@graphiql/toolkit' import { LoadFromUrlOptions } from '@graphql-tools/url-loader' +import { AxiosError } from 'axios' import { GraphiQL, GraphiQLInterface, GraphiQLProps, GraphiQLProvider, } from 'graphiql' -import { useUrlSearchParams } from 'use-url-search-params' -import { RuntimeCompositeDefinition } from '@composedb/types' - -import { AxiosError } from 'axios' +import 'json-bigint-patch' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import styled from 'styled-components' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { Network } from '../types.d' -import { queryModelGraphql } from '../api/model' -import { createGraphqlDefaultQuery } from '../utils/createDefaultQuery' -import { useComposeClient } from '../hooks/useComposeClient' +import { useUrlSearchParams } from 'use-url-search-params' +import { queryModelGraphql } from '../../api/model' +import { useComposeClient } from '../../hooks/useComposeClient' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { Network } from '../../types.d' +import { createGraphqlDefaultQuery } from '../../utils/createDefaultQuery' const type = { query: String, diff --git a/packages/client/dashboard/src/components/sdkTemplate.ts b/packages/client/dashboard/src/components/model/sdkTemplate.ts similarity index 100% rename from packages/client/dashboard/src/components/sdkTemplate.ts rename to packages/client/dashboard/src/components/model/sdkTemplate.ts diff --git a/packages/client/dashboard/src/components/Header.tsx b/packages/client/dashboard/src/components/nav/Header.tsx similarity index 92% rename from packages/client/dashboard/src/components/Header.tsx rename to packages/client/dashboard/src/components/nav/Header.tsx index 04cef913..c8510475 100644 --- a/packages/client/dashboard/src/components/Header.tsx +++ b/packages/client/dashboard/src/components/nav/Header.tsx @@ -1,14 +1,13 @@ -import styled from 'styled-components' import { useSession } from '@us3r-network/auth-with-rainbowkit' - -import { LogoWhite } from './Logo' +import { useMemo } from 'react' import { Link, useLocation, useNavigate } from 'react-router-dom' +import { Item } from 'react-stately' +import styled from 'styled-components' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { Label } from '../common/ListBox' +import { Select } from '../common/Select' import LoginButton from './LoginButton' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { useMemo } from 'react' -import { Item } from './common/ComboBox' -import { Select } from './common/Select' -import { Label } from './common/ListBox' +import { LogoWhite } from './Logo' export default function Header() { diff --git a/packages/client/dashboard/src/components/LoginButton.tsx b/packages/client/dashboard/src/components/nav/LoginButton.tsx similarity index 97% rename from packages/client/dashboard/src/components/LoginButton.tsx rename to packages/client/dashboard/src/components/nav/LoginButton.tsx index b9720300..be75519c 100644 --- a/packages/client/dashboard/src/components/LoginButton.tsx +++ b/packages/client/dashboard/src/components/nav/LoginButton.tsx @@ -1,17 +1,16 @@ -import styled from 'styled-components' import { useAuthentication, useIsAuthenticated, useSession, } from '@us3r-network/auth-with-rainbowkit' - import { LoginButton as LoginButtonStyled, UserAvatar, } from '@us3r-network/profile' -import LogoutIcon from './Icons/LogoutIcon' import { useCallback } from 'react' import { useNavigate } from 'react-router-dom' +import styled from 'styled-components' +import LogoutIcon from '../icons/LogoutIcon' const LoginButton = () => { const session = useSession() diff --git a/packages/client/dashboard/src/components/Logo.tsx b/packages/client/dashboard/src/components/nav/Logo.tsx similarity index 100% rename from packages/client/dashboard/src/components/Logo.tsx rename to packages/client/dashboard/src/components/nav/Logo.tsx diff --git a/packages/client/dashboard/src/components/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx similarity index 87% rename from packages/client/dashboard/src/components/Nav.tsx rename to packages/client/dashboard/src/components/nav/Nav.tsx index 95840004..2e9f1550 100644 --- a/packages/client/dashboard/src/components/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -1,20 +1,20 @@ import React, { useMemo, useState } from 'react' +import { Link, NavLink, useSearchParams } from 'react-router-dom' import styled from 'styled-components' -import ChevronRight from './Icons/ChevronRight' -import HomeIcon from './Icons/HomeIcon' -import NodeIcon from './Icons/NodeIcon' -import LayoutIcon from './Icons/LayoutIcon' -import InfoIcon from './Icons/InfoIcon' -import TerminalIcon from './Icons/TerminalIcon' -import ChartIcon from './Icons/ChartIcon' -import { NavLink, Link, useSearchParams } from 'react-router-dom' -import ExploreIcon from './Icons/ExploreIcon' -import StarIcon from './Icons/StarIcon' -import DocIcon from './Icons/DocIcon' -import { DOCS_URL } from '../constants' -import StarGoldIcon from './Icons/StarGoldIcon' -import ComponentIcon from './Icons/ComponentIcon' -import SdkIcon from './Icons/SdkIcon' +import { DOCS_URL } from '../../constants' +import ChartIcon from '../icons/ChartIcon' +import ChevronRight from '../icons/ChevronRight' +import ComponentIcon from '../icons/ComponentIcon' +import DocIcon from '../icons/DocIcon' +import ExploreIcon from '../icons/ExploreIcon' +import HomeIcon from '../icons/HomeIcon' +import InfoIcon from '../icons/InfoIcon' +import LayoutIcon from '../icons/LayoutIcon' +import NodeIcon from '../icons/NodeIcon' +import SdkIcon from '../icons/SdkIcon' +import StarGoldIcon from '../icons/StarGoldIcon' +import StarIcon from '../icons/StarIcon' +import TerminalIcon from '../icons/TerminalIcon' export default function Nav({ appId }: { appId: string }) { const [open, setOpen] = useState(true) diff --git a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx similarity index 94% rename from packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx rename to packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx index a6b427ea..276cfc34 100644 --- a/packages/client/dashboard/src/components/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx @@ -1,15 +1,14 @@ -import styled from 'styled-components' -import { useCallback, useState } from 'react' - -import CloseIcon from './Icons/CloseIcon' -import EnumSelect from './common/EnumSelect' import { useAuthentication, useSession } from '@us3r-network/auth-with-rainbowkit' -import { createCeramicNode } from '../api/ceramicNode' -import { CeramicDBType, CeramicNetwork } from '../types.d' +import { useCallback, useState } from 'react' import { Checkbox } from 'react-aria-components' +import styled from 'styled-components' +import { createCeramicNode } from '../../api/ceramicNode' +import { CeramicDBType, CeramicNetwork } from '../../types.d' +import EnumSelect from '../common/EnumSelect' +import CloseIcon from '../icons/CloseIcon' export default function CreateCeramicNodeModal ({ fixedNetwork, @@ -61,7 +60,7 @@ export default function CreateCeramicNodeModal ({ } finally { setSubmitting(false) } - }, [submitting, session, signIn, nodeName, network, onSussess, closeModal]) + }, [submitting, session, signIn, nodeName, network, dbType, onSussess, closeModal]) return ( diff --git a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx similarity index 96% rename from packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx rename to packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx index 183d9484..59611b94 100644 --- a/packages/client/dashboard/src/components/DeleteCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx @@ -1,12 +1,12 @@ -import styled from 'styled-components' -import { useCallback, useState } from 'react' -import CloseIcon from './Icons/CloseIcon' import { useAuthentication, useSession } from '@us3r-network/auth-with-rainbowkit' -import { delCeramicNode } from '../api/ceramicNode' -import { CeramicDto } from '../types.d' +import { useCallback, useState } from 'react' +import styled from 'styled-components' +import { delCeramicNode } from '../../api/ceramicNode' +import { CeramicDto } from '../../types.d' +import CloseIcon from '../icons/CloseIcon' export default function DeleteCeramicNodeModal ({ node, diff --git a/packages/client/dashboard/src/components/NoCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/NoCeramicNodeModal.tsx similarity index 89% rename from packages/client/dashboard/src/components/NoCeramicNodeModal.tsx rename to packages/client/dashboard/src/components/node/NoCeramicNodeModal.tsx index a31307b1..1ef9337d 100644 --- a/packages/client/dashboard/src/components/NoCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/NoCeramicNodeModal.tsx @@ -1,9 +1,9 @@ -import styled from 'styled-components' -import CloseIcon from './Icons/CloseIcon' import { Link } from 'react-router-dom' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { CeramicStatus } from '../types.d' +import styled from 'styled-components' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { CeramicStatus } from '../../types.d' +import CloseIcon from '../icons/CloseIcon' export default function NoCeramicNodeModal ({ closeModal diff --git a/packages/client/dashboard/src/components/Terminal.tsx b/packages/client/dashboard/src/components/node/Terminal.tsx similarity index 97% rename from packages/client/dashboard/src/components/Terminal.tsx rename to packages/client/dashboard/src/components/node/Terminal.tsx index 3a692c76..3b2fccda 100644 --- a/packages/client/dashboard/src/components/Terminal.tsx +++ b/packages/client/dashboard/src/components/node/Terminal.tsx @@ -6,12 +6,12 @@ * @FilePath: /s3/packages/client/dashboard/src/components/Terminal.tsx * @Description: */ -import { useMemo, useEffect } from 'react' -import 'xterm/css/xterm.css' +import { useEffect, useMemo } from 'react' +import { io } from 'socket.io-client' import { Terminal } from 'xterm' import { FitAddon } from 'xterm-addon-fit' -import { CERAMIC_NODE_SERVICE_WSS_URL } from '../constants' -import { io } from 'socket.io-client' +import 'xterm/css/xterm.css' +import { CERAMIC_NODE_SERVICE_WSS_URL } from '../../constants' const ANSI_COLOR = { red: '\x1B[1;3;31m', diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 1a0433b8..5e9e6c00 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -7,22 +7,20 @@ * @Description: */ -import styled from 'styled-components' +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import dayjs from 'dayjs' import { useEffect, useState } from 'react' +import { Button, Dialog, DialogTrigger, Modal, ModalOverlay } from 'react-aria-components' +import styled from 'styled-components' +import PlusIcon from '../components/icons/PlusIcon' +import TrashIcon from '../components/icons/TrashIcon' +import CopyTint from '../components/common/CopyTint' +import CreateCeramicNodeModal from '../components/node/CreateCeramicNodeModal' +import DeleteCeramicNodeModal from '../components/node/DeleteCeramicNodeModal' +import NodeTerminal from '../components/node/Terminal' +import { useAppCtx } from '../context/AppCtx' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { Button, Dialog, DialogTrigger } from 'react-aria-components' - -import { Modal, ModalOverlay } from 'react-aria-components' -import PlusIcon from '../components/Icons/PlusIcon' -import CreateCeramicNodeModal from '../components/CreateCeramicNodeModal' import { CeramicDto, CeramicNetwork, CeramicStatus, Network } from '../types.d' -import dayjs from 'dayjs' -import { useAppCtx } from '../context/AppCtx' -import DeleteCeramicNodeModal from '../components/DeleteCeramicNodeModal' -import TrashIcon from '../components/Icons/TrashIcon' -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import NodeTerminal from '../components/Terminal' -import CopyTint from '../components/CopyTint' export default function CeramicNodes () { const { currCeramicNode, diff --git a/packages/client/dashboard/src/container/Components.tsx b/packages/client/dashboard/src/container/Components.tsx index 3a00fd70..44ddbcb4 100644 --- a/packages/client/dashboard/src/container/Components.tsx +++ b/packages/client/dashboard/src/container/Components.tsx @@ -1,5 +1,5 @@ import styled from 'styled-components' -import ChevronRightDouble from '../components/Icons/ChevronRightDouble' +import ChevronRightDouble from '../components/icons/ChevronRightDouble' import { DOCS_URL } from '../constants' const pkgs = [ diff --git a/packages/client/dashboard/src/container/DappCreate.tsx b/packages/client/dashboard/src/container/DappCreate.tsx index 6e9154e9..21d20b01 100644 --- a/packages/client/dashboard/src/container/DappCreate.tsx +++ b/packages/client/dashboard/src/container/DappCreate.tsx @@ -1,16 +1,16 @@ -import styled from 'styled-components' -import { Network } from '../types.d' -import EnumSelect from '../components/common/EnumSelect' -import { useNavigate } from 'react-router-dom' -import { useCallback, useState } from 'react' import { useAuthentication, - useSession, + useSession } from '@us3r-network/auth-with-rainbowkit' +import { useCallback, useState } from 'react' +import { useNavigate } from 'react-router-dom' +import styled from 'styled-components' import { createDapp } from '../api/dapp' +import EnumSelect from '../components/common/EnumSelect' import { useAppCtx } from '../context/AppCtx' +import { Network } from '../types.d' -export default function DappCreate() { +export default function DappCreate () { const navigate = useNavigate() const [network, setNetwork] = useState(Network.TESTNET) const { signIn } = useAuthentication() @@ -45,35 +45,35 @@ export default function DappCreate() { }, [appName, navigate, network, session, signIn, loadDapps]) return ( - +

Create Application

-
+
* App Name: setAppName(e.target.value)} + onChange={e => setAppName(e.target.value)} />
-
- {creating ? ( ) : ( - )} diff --git a/packages/client/dashboard/src/container/DappDataStatistic.tsx b/packages/client/dashboard/src/container/DappDataStatistic.tsx index 4b7bf848..f7b26ab5 100644 --- a/packages/client/dashboard/src/container/DappDataStatistic.tsx +++ b/packages/client/dashboard/src/container/DappDataStatistic.tsx @@ -1,8 +1,8 @@ -import Instance from '../components/ModelInstance' -import useSelectedDapp from '../hooks/useSelectedDapp' import { useLocation, useOutletContext } from 'react-router-dom' +import CompositeDefinition from '../components/model/CompositeDefinition' +import Instance from '../components/model/ModelInstance' +import useSelectedDapp from '../hooks/useSelectedDapp' import { DappComposite, ModelStream, Network } from '../types.d' -import CompositeDefinition from '../components/CompositeDefinition' export default function DappDataStatistic() { const { selectModel, selectComposite } = useOutletContext<{ diff --git a/packages/client/dashboard/src/container/DappHome.tsx b/packages/client/dashboard/src/container/DappHome.tsx index d8dc8333..85b9babb 100644 --- a/packages/client/dashboard/src/container/DappHome.tsx +++ b/packages/client/dashboard/src/container/DappHome.tsx @@ -1,18 +1,18 @@ -import styled from 'styled-components' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { ChevronRightDoubleWhite } from '../components/Icons/ChevronRightDouble' -import { Link } from 'react-router-dom' -import LightbulbIcon from '../components/Icons/LightbulbIcon' +import { useSession } from '@us3r-network/auth-with-rainbowkit' import { useEffect, useMemo, useRef, useState } from 'react' -import ChevronDown from '../components/Icons/CheckronDown' import { Checkbox, ToggleButton } from 'react-aria-components' -import CheckCircleIcon from '../components/Icons/CheckCircleIcon' +import { Link } from 'react-router-dom' +import styled from 'styled-components' +import Dashboard from '../components/dapp/home/Dashboard' +import Header from '../components/dapp/home/Header' +import CheckCircleIcon from '../components/icons/CheckCircleIcon' +import ChevronDown from '../components/icons/CheckronDown' +import { ChevronRightDoubleWhite } from '../components/icons/ChevronRightDouble' +import DisabledIcon from '../components/icons/DisabledIcon' +import LightbulbIcon from '../components/icons/LightbulbIcon' import { useAppCtx } from '../context/AppCtx' -import DisabledIcon from '../components/Icons/DisabledIcon' -import Header from '../components/dapp-home/Header' -import Dashboard from '../components/dapp-home/Dashboard' -import { useSession } from '@us3r-network/auth-with-rainbowkit' import useIsOwner from '../hooks/useIsOwner' +import useSelectedDapp from '../hooks/useSelectedDapp' export default function DappHome() { const { guideSteps, currDapp } = useAppCtx() diff --git a/packages/client/dashboard/src/container/DappInfo.tsx b/packages/client/dashboard/src/container/DappInfo.tsx index 4a3133b7..d55c5e02 100644 --- a/packages/client/dashboard/src/container/DappInfo.tsx +++ b/packages/client/dashboard/src/container/DappInfo.tsx @@ -1,19 +1,16 @@ -import styled from 'styled-components' -import { Button, Dialog, DialogTrigger, Modal } from 'react-aria-components' - -import useSelectedDapp from '../hooks/useSelectedDapp' - -import DappTitleEditor from '../components/DappTitleEditor' -import DappSocialEditor from '../components/DappSocialEditor' import { useCallback, useMemo, useState } from 'react' -import CopyIcon from '../components/Icons/CopyIcon' - -import DelConfirmModal from '../components/DelDappConfirmModal' +import { Button, Dialog, DialogTrigger, Modal } from 'react-aria-components' import { useNavigate } from 'react-router-dom' -import { createImageFromInitials } from '../utils/createImage' -import { getRandomColor } from '../utils/randomColor' +import styled from 'styled-components' +import DappSocialEditor from '../components/dapp/DappSocialEditor' +import DappTitleEditor from '../components/dapp/DappTitleEditor' +import DelConfirmModal from '../components/dapp/DelDappConfirmModal' +import CopyIcon from '../components/icons/CopyIcon' import { useAppCtx } from '../context/AppCtx' import useIsOwner from '../hooks/useIsOwner' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { createImageFromInitials } from '../utils/createImage' +import { getRandomColor } from '../utils/randomColor' export default function DappInfo() { const { selectedDapp } = useSelectedDapp() diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappModelEditor.tsx index 4a8fea60..ab15d128 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappModelEditor.tsx @@ -1,8 +1,8 @@ import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types.d' -import CompositeDefinition from '../components/CompositeDefinition' import styled from 'styled-components' -import Definition from '../components/Definition' +import CompositeDefinition from '../components/model/CompositeDefinition' +import Definition from '../components/model/Definition' +import { DappComposite, ModelStream } from '../types.d' export default function DappModelEditor() { const { selectModel, selectComposite } = useOutletContext<{ diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index f8f1c800..8dc0685b 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -1,8 +1,8 @@ -import PlaygroundGraphiQL from '../components/Playground' import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types.d' -import CompositePlaygroundGraphiQL from '../components/CompositePlaygroundGraphiQL' +import CompositePlaygroundGraphiQL from '../components/model/CompositePlaygroundGraphiQL' +import PlaygroundGraphiQL from '../components/model/Playground' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { DappComposite, ModelStream } from '../types.d' export default function DappModelPlayground () { const { selectModel, selectComposite } = useOutletContext<{ diff --git a/packages/client/dashboard/src/container/DappModelSdk.tsx b/packages/client/dashboard/src/container/DappModelSdk.tsx index f4910c3e..2400f1d7 100644 --- a/packages/client/dashboard/src/container/DappModelSdk.tsx +++ b/packages/client/dashboard/src/container/DappModelSdk.tsx @@ -1,7 +1,7 @@ import { useOutletContext } from 'react-router-dom' -import { DappComposite, ModelStream } from '../types.d' import styled from 'styled-components' -import ModelSDK from '../components/ModelSDK' +import ModelSDK from '../components/model/ModelSDK' +import { DappComposite, ModelStream } from '../types.d' export default function DappModelSdk() { const { selectModel } = useOutletContext<{ diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 5c542a9a..7dfcd0cf 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -1,9 +1,16 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import dayjs from 'dayjs' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' +import InfiniteScroll from 'react-infinite-scroll-component' import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' -import InfiniteScroll from 'react-infinite-scroll-component' - -import { CeramicStatus, ClientDApp, ModelStream, Network } from '../types.d' import { updateDapp } from '../api/dapp' import { PAGE_SIZE, @@ -11,28 +18,20 @@ import { getStarModels, startIndexModel } from '../api/model' -import { TableBox, TableContainer } from '../components/TableBox' -import dayjs from 'dayjs' -import { shortPubKey } from '../utils/shortPubKey' -import Search from '../components/Search' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { PersonalCollection, useAppCtx } from '../context/AppCtx' -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import StarIcon from '../components/Icons/StarIcon' -import StarGoldIcon from '../components/Icons/StarGoldIcon' +import { ImgOrName } from '../components/common/ImgOrName' +import Search from '../components/common/Search' +import { TableBox, TableContainer } from '../components/common/TableBox' +import CheckCircleIcon from '../components/icons/CheckCircleIcon' +import PlusCircleIcon from '../components/icons/PlusCircleIcon' +import StarGoldIcon from '../components/icons/StarGoldIcon' +import StarIcon from '../components/icons/StarIcon' +import NoCeramicNodeModal from '../components/node/NoCeramicNodeModal' import { S3_SCAN_URL } from '../constants' -import CheckCircleIcon from '../components/Icons/CheckCircleIcon' -import PlusCircleIcon from '../components/Icons/PlusCircleIcon' +import { PersonalCollection, useAppCtx } from '../context/AppCtx' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { - Button, - Dialog, - DialogTrigger, - Modal, - ModalOverlay -} from 'react-aria-components' -import NoCeramicNodeModal from '../components/NoCeramicNodeModal' -import { ImgOrName } from '../components/ImgOrName' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { CeramicStatus, ClientDApp, ModelStream, Network } from '../types.d' +import { shortPubKey } from '../utils/shortPubKey' export default function ExploreModel () { // eslint-disable-next-line @typescript-eslint/no-unused-vars diff --git a/packages/client/dashboard/src/container/MyDapps.tsx b/packages/client/dashboard/src/container/MyDapps.tsx index 88229d8b..b7cca62b 100644 --- a/packages/client/dashboard/src/container/MyDapps.tsx +++ b/packages/client/dashboard/src/container/MyDapps.tsx @@ -1,12 +1,12 @@ -import styled from 'styled-components' -import { useAppCtx } from '../context/AppCtx' -import ChevronLeft from '../components/Icons/ChevronLeft' -import PlusIcon from '../components/Icons/PlusIcon' -import { Link, useNavigate } from 'react-router-dom' import { useAuthentication, useSession, } from '@us3r-network/auth-with-rainbowkit' +import { Link, useNavigate } from 'react-router-dom' +import styled from 'styled-components' +import ChevronLeft from '../components/icons/ChevronLeft' +import PlusIcon from '../components/icons/PlusIcon' +import { useAppCtx } from '../context/AppCtx' import { ClientDApp } from '../types.d' import { createImageFromInitials } from '../utils/createImage' import { getRandomColor } from '../utils/randomColor' diff --git a/packages/client/dashboard/src/context/AppCtx.tsx b/packages/client/dashboard/src/context/AppCtx.tsx index fff23961..efdad9ed 100644 --- a/packages/client/dashboard/src/context/AppCtx.tsx +++ b/packages/client/dashboard/src/context/AppCtx.tsx @@ -1,3 +1,4 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' import React, { createContext, useCallback, @@ -5,11 +6,9 @@ import React, { useEffect, useState, } from 'react' - -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { ClientDApp } from '../types.d' import { getDapp, getDappWithDid } from '../api/dapp' import { useGuideStepsState } from '../hooks/useGuideSteps' +import { ClientDApp } from '../types.d' export type PersonalCollection = { modelId: string diff --git a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx index 2fd5ecfd..cd139c57 100644 --- a/packages/client/dashboard/src/context/CeramicNodeCtx.tsx +++ b/packages/client/dashboard/src/context/CeramicNodeCtx.tsx @@ -1,3 +1,4 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' import React, { createContext, useCallback, @@ -6,10 +7,8 @@ import React, { useMemo, useState } from 'react' - -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { CeramicDto } from '../types.d' import { getCeramicNodes } from '../api/ceramicNode' +import { CeramicDto } from '../types.d' export interface CeramicNodeContextData { loadingCeramicNodes: boolean diff --git a/packages/client/dashboard/src/hooks/useComposeClient.ts b/packages/client/dashboard/src/hooks/useComposeClient.ts index 4774dda9..fa4f19fc 100644 --- a/packages/client/dashboard/src/hooks/useComposeClient.ts +++ b/packages/client/dashboard/src/hooks/useComposeClient.ts @@ -1,12 +1,12 @@ -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { useCallback, useEffect, useMemo, useState } from 'react' +import { CeramicClient } from '@ceramicnetwork/http-client' import { ComposeClient } from '@composedb/client' import { RuntimeCompositeDefinition } from '@composedb/types' +import { useSession } from '@us3r-network/auth-with-rainbowkit' import { DID } from 'dids' -import useSelectedDapp from './useSelectedDapp' -import { Network } from '../types.d' +import { useCallback, useEffect, useMemo, useState } from 'react' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' -import { CeramicClient } from '@ceramicnetwork/http-client' +import { Network } from '../types.d' +import useSelectedDapp from './useSelectedDapp' export function useComposeClient(definition: RuntimeCompositeDefinition | undefined, ceramicNodeURL: string|undefined = undefined) { const { selectedDapp } = useSelectedDapp() diff --git a/packages/client/dashboard/src/hooks/useGuideSteps.ts b/packages/client/dashboard/src/hooks/useGuideSteps.ts index 5688a58e..b576d504 100644 --- a/packages/client/dashboard/src/hooks/useGuideSteps.ts +++ b/packages/client/dashboard/src/hooks/useGuideSteps.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef, useState } from 'react' -import { ClientDApp } from '../types.d' import { useLocation } from 'react-router-dom' +import { ClientDApp } from '../types.d' const GUIDE_STEPS_KEY = 'guide-steps' const GUIDE_STEPS_DEFAULT = [false, false, false, false, false] diff --git a/packages/client/dashboard/src/hooks/useLocalStorage.ts b/packages/client/dashboard/src/hooks/useLocalStorage.ts index ce6c48b7..c9ea1859 100644 --- a/packages/client/dashboard/src/hooks/useLocalStorage.ts +++ b/packages/client/dashboard/src/hooks/useLocalStorage.ts @@ -1,9 +1,9 @@ import { - type Dispatch, - type SetStateAction, useEffect, useRef, useState, + type Dispatch, + type SetStateAction, } from 'react' export function useLocalStorage( diff --git a/packages/client/dashboard/src/hooks/useSelectedDapp.ts b/packages/client/dashboard/src/hooks/useSelectedDapp.ts index ff0fb071..30d2b4a7 100644 --- a/packages/client/dashboard/src/hooks/useSelectedDapp.ts +++ b/packages/client/dashboard/src/hooks/useSelectedDapp.ts @@ -1,9 +1,9 @@ +import { S3ModelCollectionModel } from '@us3r-network/data-model' +import { useMemo } from 'react' import { useParams } from 'react-router-dom' +import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { useAppCtx } from '../context/AppCtx' -import { useMemo } from 'react' import { Network } from '../types.d' -import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' -import { S3ModelCollectionModel } from '@us3r-network/data-model' export default function useSelectedDapp() { const { dapps } = useAppCtx() diff --git a/packages/client/dashboard/src/styles/playground.css b/packages/client/dashboard/src/styles/playground.css index f164e9ae..a7c7b818 100644 --- a/packages/client/dashboard/src/styles/playground.css +++ b/packages/client/dashboard/src/styles/playground.css @@ -1,4 +1,3 @@ - .graphiql-container { height: 100%; width: 100%; diff --git a/packages/client/dashboard/src/utils/creamic-composedb/index.ts b/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts similarity index 99% rename from packages/client/dashboard/src/utils/creamic-composedb/index.ts rename to packages/client/dashboard/src/utils/createCompositeFromBrowser.ts index 0bc5174f..0ac39b08 100644 --- a/packages/client/dashboard/src/utils/creamic-composedb/index.ts +++ b/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts @@ -1,14 +1,13 @@ import { CeramicApi } from '@ceramicnetwork/common' import { CeramicClient } from '@ceramicnetwork/http-client' import { Composite } from '@composedb/devtools' +import { EthereumWebAuth, getAccountId } from '@didtools/pkh-ethereum' +import { DIDSession } from 'did-session' import { DID } from 'dids' import { Ed25519Provider } from 'key-did-provider-ed25519' import { getResolver } from 'key-did-resolver' import { fromString } from 'uint8arrays/from-string' -import { DIDSession } from 'did-session' -import { EthereumWebAuth, getAccountId } from '@didtools/pkh-ethereum' - export async function createCompositeFromBrowser( graphql: string, myCeramicNode: string = '', diff --git a/packages/client/dashboard/tsconfig.json b/packages/client/dashboard/tsconfig.json index cf260c6e..a273b0cf 100644 --- a/packages/client/dashboard/tsconfig.json +++ b/packages/client/dashboard/tsconfig.json @@ -21,7 +21,6 @@ "jsx": "react-jsx" }, "include": [ - "src", - "types.d.ts" + "src" ] } From 6071ead86f8cf06e14347b00a252f096127d3819 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 11 Jan 2024 15:27:12 +0800 Subject: [PATCH 080/127] fix fetch mids issue --- .../client/dashboard/src/components/model/ModelInstance.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ModelInstance.tsx b/packages/client/dashboard/src/components/model/ModelInstance.tsx index 433f08e0..1b18cfe7 100644 --- a/packages/client/dashboard/src/components/model/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/model/ModelInstance.tsx @@ -124,7 +124,8 @@ export default function Instance ({ const newStreams = await loadMultiStreams(ids) setStreams({ ...streams, ...newStreams }) } - }, [endCursor, queryStream, loadMultiStreams, streams]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [endCursor, queryStream, streams]) const fetchMids = useCallback(async () => { try { @@ -144,7 +145,8 @@ export default function Instance ({ } finally { setLoading(false) } - }, [loadMultiStreams, queryStream]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [queryStream]) useEffect(() => { fetchMids() From dfd93a3c2f5f41d3f4c1ee0e2a6cb6a51dee67da Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 15 Jan 2024 14:44:05 +0800 Subject: [PATCH 081/127] remove unused api call --- packages/client/dashboard/src/api/model.ts | 28 +++++++++---------- .../src/components/model/Definition.tsx | 20 ++----------- 2 files changed, 17 insertions(+), 31 deletions(-) diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index e350d8fb..e40d7d8f 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -96,20 +96,20 @@ export function getModelMid({ }) } -export function getModelInfo({ - network, - id, -}: { - network: Network - id: string -}): AxiosPromise> { - let host = APP_API_URL - return axios.get(`${host}/models/${id}`, { - params: { - network: network.toUpperCase(), - }, - }) -} +// export function getModelInfo({ +// network, +// id, +// }: { +// network: Network +// id: string +// }): AxiosPromise> { +// let host = APP_API_URL +// return axios.get(`${host}/models/${id}`, { +// params: { +// network: network.toUpperCase(), +// }, +// }) +// } export function getModelSDK({ network, diff --git a/packages/client/dashboard/src/components/model/Definition.tsx b/packages/client/dashboard/src/components/model/Definition.tsx index b583bf39..356894bc 100644 --- a/packages/client/dashboard/src/components/model/Definition.tsx +++ b/packages/client/dashboard/src/components/model/Definition.tsx @@ -2,9 +2,9 @@ import { AxiosError } from 'axios' import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' -import { getModelInfo, queryModelGraphql } from '../../api/model' +import { queryModelGraphql } from '../../api/model' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { ModeQueryResult, ModelStream, Network } from '../../types.d' +import { ModeQueryResult, Network } from '../../types.d' import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' @@ -14,22 +14,9 @@ export default function Definition({ streamId }: { streamId: string }) { code: schemas.code, }) const [errMsg, setErrMsg] = useState('') - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [modelStream, setModelStream] = useState() const { selectedDapp } = useSelectedDapp() const [loading, setLoading] = useState(false) - const fetchModelInfo = useCallback( - async (streamId: string) => { - const resp = await getModelInfo({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - id: streamId, - }) - setModelStream(resp.data.data) - }, - [selectedDapp] - ) - const fetchModelGraphql = useCallback( async (streamId: string) => { try { @@ -64,8 +51,7 @@ export default function Definition({ streamId }: { streamId: string }) { useEffect(() => { if (!streamId) return fetchModelGraphql(streamId) - fetchModelInfo(streamId) - }, [fetchModelGraphql, streamId, fetchModelInfo]) + }, [fetchModelGraphql, streamId]) if (loading) { return ( From b1131c1f3981496901cd6fe38eb47668c4f91565 Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 16 Jan 2024 16:35:48 +0800 Subject: [PATCH 082/127] add email and node status --- packages/client/dashboard/src/api/index.ts | 2 +- packages/client/dashboard/src/api/user.ts | 59 ++++++ .../src/components/icons/CheckCircleIcon.tsx | 7 +- .../src/components/icons/CircleIcon.tsx | 13 ++ .../node/CreateCeramicNodeModal.tsx | 23 ++- .../src/components/node/NodeStatus.tsx | 187 ++++++++++++++++++ .../src/components/node/UserEmail.tsx | 164 +++++++++++++++ .../dashboard/src/container/CeramicNodes.tsx | 23 ++- .../dashboard/src/hooks/useUserAccount.ts | 77 ++++++++ packages/client/dashboard/src/types.d.ts | 8 +- 10 files changed, 545 insertions(+), 18 deletions(-) create mode 100644 packages/client/dashboard/src/api/user.ts create mode 100644 packages/client/dashboard/src/components/icons/CircleIcon.tsx create mode 100644 packages/client/dashboard/src/components/node/NodeStatus.tsx create mode 100644 packages/client/dashboard/src/components/node/UserEmail.tsx create mode 100644 packages/client/dashboard/src/hooks/useUserAccount.ts diff --git a/packages/client/dashboard/src/api/index.ts b/packages/client/dashboard/src/api/index.ts index d86e3e0e..5d938d3d 100644 --- a/packages/client/dashboard/src/api/index.ts +++ b/packages/client/dashboard/src/api/index.ts @@ -1,7 +1,7 @@ import axios from 'axios' import { UPLOAD_API_URL } from '../constants' -enum ApiRespCode { +export enum ApiRespCode { SUCCESS = 0, ERROR = 1, } diff --git a/packages/client/dashboard/src/api/user.ts b/packages/client/dashboard/src/api/user.ts new file mode 100644 index 00000000..da6912fa --- /dev/null +++ b/packages/client/dashboard/src/api/user.ts @@ -0,0 +1,59 @@ +import axios, { AxiosPromise } from 'axios' +import { ApiResp } from '.' +import { APP_API_URL } from '../constants' +import { AccountType } from '../types.d' + +export function getUserEmail( + didSession: string +): AxiosPromise> { + let host = APP_API_URL + return axios({ + url: host + `/users/email`, + method: 'GET', + headers: { + 'did-session': didSession, + }, + }) +} + +export function postUserEmail( + didSession: string, + email: string, +): AxiosPromise> { + if (!email) throw new Error('email id is required') + + let host = APP_API_URL + + return axios({ + url: host + '/users/email', + method: 'POST', + headers: { + 'did-session': didSession, + }, + data: { email }, + }) +} + +export function linkUserEmail( + didSession: string, + email: string, + code: string, +): AxiosPromise> { + if (!email) throw new Error('email is required') + if (!code) throw new Error('code is required') + + let host = APP_API_URL + + return axios({ + url: host + '/users/link', + method: 'POST', + headers: { + 'did-session': didSession, + }, + data: { + thirdpartyId: email, + code, + type: AccountType.EMAIL + }, + }) +} \ No newline at end of file diff --git a/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx b/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx index d87956d2..d585a088 100644 --- a/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx +++ b/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx @@ -1,4 +1,4 @@ -export default function CheckCircleIcon({ bgc = '#5BA85A' }: { bgc?: string }) { +export default function CheckCircleIcon({ bgc = '#00b171' }: { bgc?: string }) { return ( - + + + + ) +} diff --git a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx index 276cfc34..9fbbab32 100644 --- a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx @@ -9,6 +9,8 @@ import { createCeramicNode } from '../../api/ceramicNode' import { CeramicDBType, CeramicNetwork } from '../../types.d' import EnumSelect from '../common/EnumSelect' import CloseIcon from '../icons/CloseIcon' +import UserEmail from './UserEmail' +import { EmailStatus } from '../../hooks/useUserAccount' export default function CreateCeramicNodeModal ({ fixedNetwork, @@ -60,8 +62,17 @@ export default function CreateCeramicNodeModal ({ } finally { setSubmitting(false) } - }, [submitting, session, signIn, nodeName, network, dbType, onSussess, closeModal]) - + }, [ + submitting, + session, + signIn, + nodeName, + network, + dbType, + onSussess, + closeModal + ]) + const [userEmailVerified, setUserEmailVerified] = useState(false) return (
@@ -100,6 +111,11 @@ export default function CreateCeramicNodeModal ({
Enable Historic Sync + + setUserEmailVerified(stutas === EmailStatus.VERIFIED) + } + />
@@ -108,7 +124,7 @@ export default function CreateCeramicNodeModal ({ )) || ( - )} @@ -116,6 +132,7 @@ export default function CreateCeramicNodeModal ({ ) } + const EditorBox = styled.div` display: flex; flex-direction: column; diff --git a/packages/client/dashboard/src/components/node/NodeStatus.tsx b/packages/client/dashboard/src/components/node/NodeStatus.tsx new file mode 100644 index 00000000..18309b77 --- /dev/null +++ b/packages/client/dashboard/src/components/node/NodeStatus.tsx @@ -0,0 +1,187 @@ +import styled from 'styled-components' +import { CeramicStatus } from '../../types.d' +import CircleIcon from '../icons/CircleIcon' +import CheckCircleIcon from '../icons/CheckCircleIcon' + +import { ProgressBar, Label } from 'react-aria-components' +import { useEffect, useState } from 'react' + +export default function NodeStatus ({ + status, +}: { + status: CeramicStatus +}) { + const [prepageingPercentage, setPrepageingPercentage] = useState(0) + const [startingPercentage, setStartingPercentage] = useState(0) + + useEffect(() => { + if (status !== CeramicStatus.PREPARING) return + if (prepageingPercentage < 100) { + console.log('set prepare timeout', prepageingPercentage) + setTimeout(() => { + setPrepageingPercentage(prepageingPercentage + 1) + }, 350) + } + }, [prepageingPercentage, status]) + + useEffect(() => { + if (status !== CeramicStatus.STARTING) return + if (startingPercentage < 100) { + console.log('set start timeout', startingPercentage) + setTimeout(() => { + setStartingPercentage(startingPercentage + 1) + }, 200) + } + }, [startingPercentage, status]) + + useEffect(() => { + switch (status) { + case CeramicStatus.PREPARING: + setPrepageingPercentage(0) + setStartingPercentage(0) + break + case CeramicStatus.STARTING: + setPrepageingPercentage(100) + setStartingPercentage(0) + break + case CeramicStatus.RUNNING: + setPrepageingPercentage(100) + setStartingPercentage(100) + break + default: + break + } + }, [status]) + + switch (status) { + case CeramicStatus.PREPARING: + return ( + +
+ + + + + +
+
+ + + +
+
+ ) + case CeramicStatus.STARTING: + return ( + +
+ + + + + +
+
+ + + +
+
+ ) + case CeramicStatus.RUNNING: + return ( + +
+ + + + + +
+
+ + + +
+
+ ) + default: + return null + } +} + +const Box = styled.div` + width: 100%; + display: flex; + flex-direction: column; + gap: 10px; + > div { + width: 100%; + display: flex; + align-items: center; + gap: 10px; + justify-content: space-between; + } + .green { + color: #00b171; + } + .gray { + color: #718096; + } + label { + font-size: 12px; + font-weight: 500; + line-height: 1.2; + letter-spacing: 0.05em; + text-transform: uppercase; + } + .react-aria-ProgressBar { + display: grid; + grid-template-areas: "label value" + "bar bar"; + grid-template-columns: 1fr auto; + color: var(--text-color); + flex: 1; + .value { + grid-area: value; + } + + .bar { + grid-area: bar; + box-shadow: inset 0px 0px 0px 1px #718096; + forced-color-adjust: none; + height: 2px; + overflow: hidden; + will-change: transform; + } + + .fill { + background: #00b171; + height: 100%; + } + } +` +function StepNode ({ percentage = 0 }: { percentage?: number }) { + if (percentage === 0) { + return + } else if (percentage < 100) { + return + } else if (percentage >= 100) { + return + } + return null +} +function StepProgress ({ percentage = 0 }: { percentage?: number }) { + return ( + + {({ percentage, valueText }) => ( + <> + {/* {valueText} */} +
+
+
+ + )} + + ) +} diff --git a/packages/client/dashboard/src/components/node/UserEmail.tsx b/packages/client/dashboard/src/components/node/UserEmail.tsx new file mode 100644 index 00000000..6995a1ca --- /dev/null +++ b/packages/client/dashboard/src/components/node/UserEmail.tsx @@ -0,0 +1,164 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import { useEffect, useState } from 'react' +import styled from 'styled-components' +import useUserAccount, { EmailStatus } from '../../hooks/useUserAccount' + +export default function Email ({ + emailStatusChange +}: { + emailStatusChange: (stutas: EmailStatus) => void +}) { + const session = useSession() + const { + email, + emailStatus, + setEmailStatus, + errorMsg, + sendEmail, + sendEmailCountDown, + verifyEmail + } = useUserAccount(session?.serialize()) + const [newEmail, setNewEmail] = useState(email) + const [code, setCode] = useState('') + const [sendingEmail, setSendingEmail] = useState(false) + + const [verifyingEmail, setVerifyingEmail] = useState(false) + useEffect(() => { + emailStatusChange(emailStatus) + }, [emailStatus, emailStatusChange]) + + const send = async () => { + setSendingEmail(true) + await sendEmail(newEmail) + setSendingEmail(false) + } + + switch (emailStatus) { + case EmailStatus.VERIFIED: + return ( + + * Email: +
+ + +
+
+ ) + case EmailStatus.NOT_VERIFIED: + return ( + + * Email: +
+ setNewEmail(e.target.value)} + /> + +
+

{errorMsg}

+
+ ) + case EmailStatus.VERIFYING: + return ( + + * Email: +
+ setNewEmail(e.target.value)} + /> + +
+
+ setCode(e.target.value)} + /> + +
+

{errorMsg}

+
+ ) + } +} +const Box = styled.div` + display: flex; + flex-direction: column; + gap: 20px; + div { + /* height: calc(100v - 88px); */ + box-sizing: border-box; + display: flex; + gap: 20px; + } + + input { + width: auto; + background: #1a1e23; + outline: none; + border: 1px solid #39424c; + border-radius: 12px; + height: 48px; + padding: 0px 16px; + color: #ffffff; + font-weight: 400; + font-size: 16px; + line-height: 24px; + flex: 1 1 auto; + } + + button { + background: #1a1e23; + border: 1px solid #39424c; + border-radius: 12px; + padding: 12px 24px; + font-weight: 500; + font-size: 16px; + line-height: 24px; + color: #718096; + width: 160px; + flex: 0 0 150px; + &.submit { + color: #14171a; + background: #ffffff; + } + + > img { + height: 18px; + } + } +` diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 5e9e6c00..92bae353 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -21,6 +21,7 @@ import NodeTerminal from '../components/node/Terminal' import { useAppCtx } from '../context/AppCtx' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' import { CeramicDto, CeramicNetwork, CeramicStatus, Network } from '../types.d' +import NodeStatus from '../components/node/NodeStatus' export default function CeramicNodes () { const { currCeramicNode, @@ -163,15 +164,18 @@ function CeramicNodeInfo ({ node }: { node: CeramicDto }) { return ( -
-
{node.name}
-
{node.network}
+
+
+
{node.name}
+
{node.network}
+
+ {node.status === CeramicStatus.PREPARING ? (
- - Preparing your deployment... (It may take a few minutes) + {/* */} + {/* Preparing your deployment... (It may take a few minutes) */}
) : node.status === CeramicStatus.RUNNING ? (
@@ -269,7 +273,6 @@ const ListBox = styled.div` text-align: center; } ` - const NodesListBox = styled.div` display: flex; flex-direction: column; @@ -337,7 +340,6 @@ const NodesListBox = styled.div` } } ` - const NodeInfoContainer = styled.div` height: 100%; display: flex; @@ -347,6 +349,7 @@ const NodeInfoContainer = styled.div` flex-grow: 1; ` const NodeInfoBox = styled.div` + width: 100%; padding: 20px; border-radius: 20px; border: 1px solid #39424c; @@ -356,6 +359,12 @@ const NodeInfoBox = styled.div` gap: 20px; flex-shrink: 0; flex-grow: 0; + .title-container { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + } .title { display: flex; flex-direction: row; diff --git a/packages/client/dashboard/src/hooks/useUserAccount.ts b/packages/client/dashboard/src/hooks/useUserAccount.ts new file mode 100644 index 00000000..ce0b1ff5 --- /dev/null +++ b/packages/client/dashboard/src/hooks/useUserAccount.ts @@ -0,0 +1,77 @@ +import { useCallback, useEffect, useState } from 'react' +import { getUserEmail, linkUserEmail, postUserEmail } from '../api/user' +import { ApiRespCode } from '../api'; + +export enum EmailStatus { + NOT_VERIFIED, + VERIFIED, + VERIFYING, +} +const COUNT_DOWN = 60 +export default function useUserAccount(didSession: string | undefined) { + const [email, setEmail] = useState('') + const [emailStatus, setEmailStatus] = useState(EmailStatus.NOT_VERIFIED) + const [errorMsg, setErrorMsg] = useState(undefined) + + const [sendEmailCountDown, setSendEmailCountDown] = useState(0) + + useEffect(() => { + if (sendEmailCountDown > 0) { + setTimeout(() => { + setSendEmailCountDown(sendEmailCountDown - 1) + }, 1000) + } + }, [sendEmailCountDown]) + + const getEmail = useCallback(async () => { + if (!didSession) return + setErrorMsg('') + const resp = await getUserEmail(didSession) + if (resp.data?.code === ApiRespCode.SUCCESS && resp.data?.data?.email) { + setEmail(resp.data.data.email) + setEmailStatus(EmailStatus.VERIFIED) + } + if (resp?.data?.code === ApiRespCode.ERROR) { + setErrorMsg(resp?.data?.msg) + } + }, [didSession]) + + const sendEmail = useCallback(async (email: string) => { + if (!didSession) return + setErrorMsg('') + const resp = await postUserEmail(didSession, email) + if (resp.data?.code === ApiRespCode.SUCCESS) { + setEmailStatus(EmailStatus.VERIFYING) + setSendEmailCountDown(COUNT_DOWN) + } + if (resp?.data?.code === ApiRespCode.ERROR) { + setErrorMsg(resp?.data?.msg) + } + return resp; + }, [didSession]) + + const verifyEmail = useCallback(async (email: string, code: string) => { + if (!didSession) return + setErrorMsg('') + const resp = await linkUserEmail(didSession, email, code) + if (resp.data?.code === ApiRespCode.SUCCESS) { + getEmail() + } else if (resp?.data?.code === ApiRespCode.ERROR) { + setErrorMsg(resp?.data?.msg) + } + }, [didSession, getEmail]) + + useEffect(() => { + if (didSession) getEmail(); + }, [didSession, getEmail]) + + return { + email, + emailStatus, + errorMsg, + sendEmailCountDown, + setEmailStatus, + sendEmail, + verifyEmail, + } +} diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 0b7a97a1..a25da7dd 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -44,13 +44,17 @@ export type ClientDApp = { createdAt?: number lastModifiedAt?: number } - +/************************ Account ******************************/ +export enum AccountType { + EMAIL = 'email', + ALL = 'all', +} /************************ Node ******************************/ export type CeramicDto = { id: number; name: string; network: CeramicNetwork; - status: string; + status: CeramicStatus; privateKey: string; apiKey: string; namespace: string; From 73b291d1fce22072bba1b55a7643dab523be8a81 Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 16 Jan 2024 18:08:35 +0800 Subject: [PATCH 083/127] send email button style --- packages/client/dashboard/src/components/node/UserEmail.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/components/node/UserEmail.tsx b/packages/client/dashboard/src/components/node/UserEmail.tsx index 6995a1ca..cc7a54af 100644 --- a/packages/client/dashboard/src/components/node/UserEmail.tsx +++ b/packages/client/dashboard/src/components/node/UserEmail.tsx @@ -88,7 +88,7 @@ export default function Email ({ onClick={send} > {sendEmailCountDown - ? `Send Email (${sendEmailCountDown})` + ? `Send in ${sendEmailCountDown}s` : `Send Email`}
From c145614e11dae7c85a2659e0c3814a158c851fd0 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 19 Jan 2024 02:34:15 +0800 Subject: [PATCH 084/127] add composites --- packages/client/dashboard/src/App.tsx | 119 +++-- .../client/dashboard/src/api/composite.ts | 145 +++++- packages/client/dashboard/src/api/model.ts | 94 +++- .../src/components/dapp/home/Dashboard.tsx | 16 +- .../components/model/CompositeDefinition.tsx | 4 +- .../model/CompositePlaygroundGraphiQL.tsx | 5 +- .../components/model/CreateCompositeModal.tsx | 105 +++-- .../src/components/model/CreateNewModel.tsx | 45 +- .../src/components/model/MergeModal.tsx | 6 +- .../src/components/model/ModelList.tsx | 25 +- .../dashboard/src/components/nav/Nav.tsx | 8 +- .../client/dashboard/src/constants/index.ts | 4 +- .../src/container/DappDataStatistic.tsx | 4 +- .../src/container/DappModelEditor.tsx | 4 +- .../src/container/DappModelPlayground.tsx | 4 +- .../dashboard/src/container/DappModelSdk.tsx | 4 +- .../src/container/ExploreComposite.tsx | 440 ++++++++++++++++++ .../dashboard/src/container/ExploreModel.tsx | 8 +- packages/client/dashboard/src/types.d.ts | 72 ++- .../src/utils/composedb-types/schemas.ts | 20 + .../src/utils/createCompositeFromBrowser.ts | 5 +- 21 files changed, 954 insertions(+), 183 deletions(-) create mode 100644 packages/client/dashboard/src/container/ExploreComposite.tsx diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index a941a406..ee309d65 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react' -import { Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom' +import { NavLink, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom' import styled from 'styled-components' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -8,7 +8,7 @@ import { ProfileStateProvider } from '@us3r-network/profile' import { ToastContainer } from 'react-toastify' import 'react-toastify/dist/ReactToastify.min.css' -import { DappComposite, ModelStream } from './types.d' +import { DappCompositeDto, ModelStream } from './types.d' import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' import AppProvider, { useAppCtx } from './context/AppCtx' @@ -30,6 +30,7 @@ import NoMatch from './container/NoMatch' import Header from './components/nav/Header' import Nav from './components/nav/Nav' import ModelList from './components/model/ModelList' +import ExploreComposite from './container/ExploreComposite' dayjs.extend(relativeTime) @@ -49,8 +50,14 @@ function Routers () { } /> } /> - } /> - } /> + }> + } /> + } /> + + }> + } /> + } /> + } /> @@ -134,9 +141,36 @@ function DappLayout () { ) } + +const AppContainer = styled.div` + display: flex; + margin-top: 60px; + > main.container { + display: flex; + width: 100%; + + > div { + flex-grow: 1; + margin: 0 auto; + width: 100%; + max-width: 1300px; + z-index: 0; + } + + .login-first { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + margin-top: 20px; + justify-content: center; + } + } +` + function ModelEditorLayout () { const [selectModel, setSelectModel] = useState() - const [selectComposite, setSelectComposite] = useState() + const [selectComposite, setSelectComposite] = useState() const { pathname } = useLocation() @@ -165,32 +199,6 @@ function ModelEditorLayout () { ) } -const AppContainer = styled.div` - display: flex; - margin-top: 60px; - > main.container { - display: flex; - width: 100%; - - > div { - flex-grow: 1; - margin: 0 auto; - width: 100%; - max-width: 1300px; - z-index: 0; - } - - .login-first { - width: 100%; - display: flex; - flex-direction: column; - align-items: center; - margin-top: 20px; - justify-content: center; - } - } -` - const EditorLayoutContainer = styled.div` margin-top: 25px; margin-bottom: 25px; @@ -218,3 +226,52 @@ const EditorLayoutContainer = styled.div` } } ` + +function ExploreLayout () { + return ( + +
+ + {({ isActive }) => ( +
+ Models +
+ )} +
+ + {({ isActive }) => ( +
+ Composites +
+ )} +
+
+
+ +
+
+ ) +} + +const ExploreLayoutContainer = styled.div` + margin-top: 25px; + margin-bottom: 25px; + + .explore-catalog { + position: absolute; + display: flex; + gap: 20px; + .item { + font-size: 24px; + font-weight: 700; + color: #718096; + > span { + transition: opacity 0.09s ease-in-out; + } + &.active { + background: #14171a; + color: #fff; + } + } + } +` diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index 1a3c7672..2653a2fb 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -1,68 +1,179 @@ +import { Composite } from '@composedb/devtools' +import { RuntimeCompositeDefinition } from '@composedb/types' import axios, { AxiosPromise } from 'axios' +import { PassedSchema } from 'graphql-editor/lib/Models/Types' +import { ApiResp } from '.' import { APP_API_URL } from '../constants' import { ClientDApp, - DappComposite, + DappCompositeDto, + Network, } from '../types.d' -import { ApiResp } from '.' +import { PAGE_SIZE } from '../constants' export function getDappComposites({ dapp: { id }, - didSession, + did, }: { dapp: ClientDApp - didSession?: string -}): AxiosPromise> { + did?: string +}): AxiosPromise> { let host = APP_API_URL return axios({ url: host + `/dapps/${id}/composites`, method: 'GET', headers: { - 'did-session': didSession || '', + 'did-session': did || '', }, }) } export function createDappComposites({ - didSession, + did, dapp, data, - name, }: { - didSession: string + did: string dapp: ClientDApp - data: string - name: string + data: { name: string, gqlSchema: PassedSchema, composite: Composite, runtimeDefinition: RuntimeCompositeDefinition } }) { let host = APP_API_URL return axios({ url: host + `/dapps/${dapp.id}/composites`, method: 'POST', headers: { - 'did-session': didSession, + 'did-session': did, }, - data: { graphql: data, name }, + data: { graphql: data.gqlSchema.code, name: data.name, composite: data.composite, runtimeDefinition: data.runtimeDefinition }, }) } -export function updateDappComposites() {} +export function bindingDappComposites({ + did, + dapp, + compositeId, +}: { + did: string + dapp: ClientDApp + compositeId: number +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${dapp.id}/composites/${compositeId}/bindings`, + method: 'POST', + headers: { + 'did-session': did, + }, + }) +} + +export function updateDappComposites() { } export function deleteDappComposites({ compositeId, dapp, - didSession, + did, }: { compositeId: number dapp: ClientDApp - didSession: string + did: string }) { let host = APP_API_URL return axios({ url: host + `/dapps/${dapp.id}/composites/${compositeId}`, method: 'DELETE', headers: { - 'did-session': didSession, + 'did-session': did, }, }) } + +/*******************************************************/ + +export function getComposites({ + name, + did, + pageSize = PAGE_SIZE, + pageNumber = 1, + network, +}: { + name?: string + did?: string + pageSize?: number + pageNumber?: number + network?: Network +}): AxiosPromise> { + let host = APP_API_URL + + return axios({ + url: host + `/dapps/composites`, + method: 'GET', + data: { + pageSize, + pageNumber, + }, + headers: { + 'did-session': did || '', + }, + }) +} + +export function getComposite({ + id, + did, +}: { + id: string + did?: string +}): AxiosPromise> { + let host = APP_API_URL + + return axios({ + url: host + `/dapps/composites/${id}`, + method: 'GET', + headers: { + 'did-session': did || '', + }, + }) +} + +export function postComposite({ + did, + id, + data, + name, +}: { + did: string + id: string + data: string + name: string +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/composites/${id}`, + method: 'POST', + headers: { + 'did-session': did, + }, + data: { graphql: data, name }, + }) +} + +export function deleteComposite({ + id, + did, +}: { + id: number + did: string +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/composites/${id}`, + method: 'DELETE', + headers: { + 'did-session': did, + }, + }) +} + +export { PAGE_SIZE } diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index e40d7d8f..0894e001 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -1,17 +1,101 @@ +import { Composite } from '@composedb/devtools' +import { RuntimeCompositeDefinition } from '@composedb/types' import axios, { AxiosPromise } from 'axios' -import { APP_API_URL } from '../constants' +import { PassedSchema } from 'graphql-editor/lib/Models/Types' +import { ApiResp } from '.' +import { APP_API_URL, PAGE_SIZE } from '../constants' import { + ClientDApp, + DappCompositeDto, + GraphqlGenType, + GraphqlGenTypeServer, ModeCreateResult, ModeQueryResult, ModelMid, ModelStream, - GraphqlGenType, - GraphqlGenTypeServer, Network, } from '../types.d' -import { ApiResp } from '.' -export const PAGE_SIZE = 50 +export function getDappModels({ + dapp: { id }, + did, +}: { + dapp: ClientDApp + did?: string +}): AxiosPromise> { + let host = APP_API_URL + + return axios({ + url: host + `/dapps/${id}/models`, + method: 'GET', + headers: { + 'did-session': did || '', + }, + }) +} + +export function createDappModels({ + did, + dapp, + data, +}: { + did: string + dapp: ClientDApp + data: { mdoelStreamId:string, gqlSchema:PassedSchema , composite:Composite, runtimeDefinition:RuntimeCompositeDefinition} +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${dapp.id}/models`, + method: 'POST', + headers: { + 'did-session': did, + }, + data: { mdoelStreamId:data.mdoelStreamId, graphql: data.gqlSchema.code, composite: data.composite, runtimeDefinition: data.runtimeDefinition }, + }) +} + +// export function bindingDappModels({ +// did, +// dapp, +// modelId, +// }: { +// did: string +// dapp: ClientDApp +// modelId: number +// }) { +// let host = APP_API_URL +// return axios({ +// url: host + `/dapps/${dapp.id}/models/${modelId}/bindings`, +// method: 'POST', +// headers: { +// 'did-session': did, +// }, +// }) +// } + +export function updateDappModels() {} + +export function deleteDappModels({ + modelId, + dapp, + did, +}: { + modelId: number + dapp: ClientDApp + did: string +}) { + let host = APP_API_URL + return axios({ + url: host + `/dapps/${dapp.id}/models/${modelId}`, + method: 'DELETE', + headers: { + 'did-session': did, + }, + }) +} + +/*******************************************************/ + export function getModelStreamList({ name, did, diff --git a/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx b/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx index c10e7281..e920394e 100644 --- a/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx +++ b/packages/client/dashboard/src/components/dapp/home/Dashboard.tsx @@ -1,6 +1,5 @@ import { useEffect, useMemo, useState } from 'react' import styled from 'styled-components' -import { getDappComposites } from '../../../api/composite' import { getStreamsCountWithModels } from '../../../api/model' import { ClientDApp, Network } from '../../../types' import compositesIconUrl from './imgs/composites.svg' @@ -17,19 +16,10 @@ export default function Dashboard({ dapp }: { dapp: ClientDApp }) { if (!dapp) { setCompositesCount(0) return + }else{ + const compositesCount = dapp?.composites?.length || 0 + setCompositesCount(compositesCount) } - ;(async () => { - try { - const resp = await getDappComposites({ - dapp: dapp, - }) - if (resp.data.code !== 0) throw new Error(resp.data.msg) - setCompositesCount(resp.data?.data?.length || 0) - } catch (error) { - console.error(error) - setCompositesCount(0) - } - })() }, [dapp]) useEffect(() => { diff --git a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx index 1e021ac1..56fe3665 100644 --- a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx +++ b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx @@ -1,14 +1,14 @@ import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { useEffect, useState } from 'react' import styled from 'styled-components' -import { DappComposite } from '../../types' +import { DappCompositeDto } from '../../types' import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' export default function CompositeDefinition({ composite, }: { - composite: DappComposite + composite: DappCompositeDto }) { const [gqlSchema, setGqlSchema] = useState({ code: composite.graphql, diff --git a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx index a6e1f8b8..c427e690 100644 --- a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx @@ -69,15 +69,16 @@ export default function CompositePlaygroundGraphiQL( const updateQuery = useCallback(async () => { const data = JSON.parse(definition) + if (!data) return const modelName = Object.keys(data.models)[0] const objValues: any[] = Object.values(data.objects) const modelProperties = Object.entries(objValues[0]) const defaultQuery = createGraphqlDefaultQuery(modelName, modelProperties) setQuery(initialQuery + defaultQuery) }, [definition]) - + console.log('definition', definition, ceramicNodeURL) const { composeClient, composeClientAuthenticated } = - useComposeClient(definition as unknown as RuntimeCompositeDefinition, ceramicNodeURL) + useComposeClient(JSON.parse(definition) as RuntimeCompositeDefinition, ceramicNodeURL) useEffect(() => { localStorage.setItem('graphiql:theme', 'dark') diff --git a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx index 6f95c123..620bc25f 100644 --- a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx @@ -8,58 +8,58 @@ import useSelectedDapp from '../../hooks/useSelectedDapp' import { ModelStream } from '../../types.d' import { schemas } from '../../utils/composedb-types/schemas' import CloseIcon from '../icons/CloseIcon' +import { createCompositeFromBrowser } from '../../utils/createCompositeFromBrowser' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' -const TINT_WORD = `# Edit the model's relation based on your business needs. -# See Example below -# https://composedb.js.org/docs/0.4.x/guides/data-modeling/relations-container-of-items - -` - -export default function CreateCompositeModal({ +export default function CreateCompositeModal ({ closeModal, loadDappComposites, - dappModels, + defaultName, + defaultSchema, + readonly }: { closeModal: () => void - loadDappComposites: () => Promise - dappModels: ModelStream[] + loadDappComposites?: () => Promise + defaultName?: string + defaultSchema: string + readonly?: boolean }) { const { selectedDapp } = useSelectedDapp() const session = useSession() + const { currCeramicNode } = useCeramicNodeCtx() const [submitting, setSubmitting] = useState(false) - const [name, setName] = useState('') + const [name, setName] = useState(defaultName) const [gqlSchema, setGqlSchema] = useState({ - code: - TINT_WORD + - dappModels - .map((item) => { - return ` -type ${item.stream_content.name} @loadModel(id: "${item.stream_id}") { - id: ID! -} -` - }) - .join('\n'), - libraries: schemas.library, + code: defaultSchema, + libraries: schemas.library }) const submit = useCallback(async () => { if (submitting) return if (!selectedDapp) return - if (!session?.id) return + if (!session?.id || !currCeramicNode) return if (!gqlSchema.code || !name) return try { setSubmitting(true) + const result = await createCompositeFromBrowser( + gqlSchema.code, + currCeramicNode.serviceUrl + '/', + // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, + currCeramicNode.privateKey, + session + ) + if (!result) return + const { composite, runtimeDefinition } = result + const resp = await createDappComposites({ - name, - data: gqlSchema.code, + data: { name, gqlSchema, composite, runtimeDefinition }, dapp: selectedDapp, - didSession: session.serialize(), + did: session.serialize() }) if (resp.data.code !== 0) { throw new Error(resp.data.msg) } - await loadDappComposites() + if (loadDappComposites) await loadDappComposites() closeModal() } catch (error) { const err = error as AxiosError @@ -71,54 +71,63 @@ type ${item.stream_content.name} @loadModel(id: "${item.stream_id}") { submitting, selectedDapp, session, - gqlSchema.code, + currCeramicNode, + gqlSchema, name, loadDappComposites, - closeModal, + closeModal ]) return ( -
+

Create Composite

-
+
Composite Name:{' '} { + onChange={e => { setName(e.target.value) }} />
{ + setSchema={props => { setGqlSchema(props) }} schema={gqlSchema} sidebarExpanded={false} routeState={{ - code: 'on', + code: 'on' }} /> -
- - {(submitting && ( - - )) || ( - - )} -
+ {!readonly && ( +
+ + {(submitting && ( + + )) || ( + + )} +
+ )} ) } diff --git a/packages/client/dashboard/src/components/model/CreateNewModel.tsx b/packages/client/dashboard/src/components/model/CreateNewModel.tsx index 67cf3559..5c8f2cae 100644 --- a/packages/client/dashboard/src/components/model/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewModel.tsx @@ -10,6 +10,7 @@ import useSelectedDapp from '../../hooks/useSelectedDapp' import { schemas } from '../../utils/composedb-types/schemas' import { createCompositeFromBrowser } from '../../utils/createCompositeFromBrowser' import CloseIcon from '../icons/CloseIcon' +import { createDappModels } from '../../api/model' export default function CreateNewModel ({ closeModal @@ -26,7 +27,7 @@ export default function CreateNewModel ({ code: schemas.code, libraries: schemas.library }) - + const submit = useCallback(async () => { if (submitting) return if (!selectedDapp) return @@ -53,17 +54,28 @@ export default function CreateNewModel ({ session ) if (!result) return - const { composite } = result + const { composite, runtimeDefinition } = result const newModelIDs = Object.values(composite.modelIDs) - const models = selectedDapp.models || [] - models.push(...newModelIDs) - // console.log("models: ", newModelIDs, models) - await updateDapp( - { ...selectedDapp, models }, - session.serialize(), - currCeramicNode.id + // const models = selectedDapp.models || [] + // models.push(...newModelIDs) + // // console.log("models: ", newModelIDs, models) + // await updateDapp( + // { ...selectedDapp, models }, + // session.serialize(), + // currCeramicNode.id + // ) + // await loadDapps() + const resp = await Promise.all( + newModelIDs.map(async mdoelStreamId => { + return await createDappModels({ + data: { mdoelStreamId, gqlSchema, composite, runtimeDefinition }, + dapp: selectedDapp, + did: session.serialize() + }) + }) ) - await loadDapps() + console.log(resp) + await loadDappModels() closeModal() } catch (error) { const err = error as AxiosError @@ -71,15 +83,7 @@ export default function CreateNewModel ({ } finally { setSubmitting(false) } - }, [ - currCeramicNode, - closeModal, - gqlSchema.code, - loadDapps, - selectedDapp, - session, - submitting - ]) + }, [submitting, selectedDapp, session, gqlSchema, currCeramicNode, closeModal]) return ( @@ -188,3 +192,6 @@ const CreateBox = styled.div` } } ` +function loadDappModels () { + throw new Error('Function not implemented.') +} diff --git a/packages/client/dashboard/src/components/model/MergeModal.tsx b/packages/client/dashboard/src/components/model/MergeModal.tsx index cc6e6657..e1f4a669 100644 --- a/packages/client/dashboard/src/components/model/MergeModal.tsx +++ b/packages/client/dashboard/src/components/model/MergeModal.tsx @@ -8,7 +8,7 @@ import styled from 'styled-components' import { queryModelGraphql } from '../../api/model' import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../../constants' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { ClientDApp, DappComposite, ModelStream, Network } from '../../types.d' +import { ClientDApp, DappCompositeDto, ModelStream, Network } from '../../types.d' export default function MergeModal({ closeModal, @@ -17,7 +17,7 @@ export default function MergeModal({ }: { closeModal: () => void dappModels: ModelStream[] - composites: DappComposite[] + composites: DappCompositeDto[] }) { const [loading, setLoading] = useState(false) const { selectedDapp } = useSelectedDapp() @@ -81,7 +81,7 @@ export default function MergeModal({ .map((compositeId) => { return composites.find((item) => item.id + '' === compositeId) }) - .filter((item): item is DappComposite => !!item) + .filter((item): item is DappCompositeDto => !!item) const compositeData = data.map(async (item) => { return await Composite.fromJSON({ diff --git a/packages/client/dashboard/src/components/model/ModelList.tsx b/packages/client/dashboard/src/components/model/ModelList.tsx index 68aeb820..52abaa9a 100644 --- a/packages/client/dashboard/src/components/model/ModelList.tsx +++ b/packages/client/dashboard/src/components/model/ModelList.tsx @@ -10,7 +10,7 @@ import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useIsOwner from '../../hooks/useIsOwner' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { CeramicStatus, DappComposite, ModelStream, Network } from '../../types.d' +import { CeramicStatus, DappCompositeDto, ModelStream, Network } from '../../types.d' import { shortPubKey } from '../../utils/shortPubKey' import CopyTint from '../common/CopyTint' import MergeIcon from '../icons/MergeIcon' @@ -21,6 +21,7 @@ import CreateCompositeModal from './CreateCompositeModal' import CreateNewModel from './CreateNewModel' import FavoriteModel from './FavoriteModal' import MergeModal from './MergeModal' +import { getCompositeDefaultSchema } from '../../utils/composedb-types/schemas' export default function ModelList ({ editable, @@ -31,8 +32,8 @@ export default function ModelList ({ }: { selectModel: ModelStream | undefined setSelectModel: (m: ModelStream | undefined) => void - selectComposite: DappComposite | undefined - setSelectComposite: (composite: DappComposite | undefined) => void + selectComposite: DappCompositeDto | undefined + setSelectComposite: (composite: DappCompositeDto | undefined) => void editable?: boolean }) { @@ -43,7 +44,7 @@ export default function ModelList ({ const navigate = useNavigate() const [loading, setLoading] = useState(false) const [dappModels, setDappModels] = useState() - const [composites, setComposites] = useState([]) + const [composites, setComposites] = useState([]) const location = useLocation() const dapp = useMemo(() => { @@ -102,11 +103,12 @@ export default function ModelList ({ session.serialize() ) await loadDapps() + setSelectModel(undefined) } catch (error) { console.error(error) } }, - [loadDapps, selectedDapp, session] + [loadDapps, selectedDapp, session, setSelectModel] ) const delDappComposite = useCallback( @@ -116,15 +118,16 @@ export default function ModelList ({ try { await deleteDappComposites({ compositeId: id, - didSession: session.serialize(), + did: session.serialize(), dapp: selectedDapp }) await loadDappComposites() + setSelectComposite(undefined) } catch (error) { console.error(error) } }, - [selectedDapp, session, loadDappComposites] + [session, selectedDapp, loadDappComposites, setSelectComposite] ) const isFirstRenderRef = useRef(true) @@ -292,9 +295,9 @@ function DappCompositeList ({ selectComposite, setSelectedComposite }: { - composites: DappComposite[] - selectComposite: DappComposite | undefined - setSelectedComposite: (composite: DappComposite) => void + composites: DappCompositeDto[] + selectComposite: DappCompositeDto | undefined + setSelectedComposite: (composite: DappCompositeDto) => void removeAction: (id: number) => Promise editable?: boolean }) { @@ -495,7 +498,7 @@ function CreateComposite ({ )} diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index 2e9f1550..1b2e2bff 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -84,19 +84,19 @@ export default function Nav({ appId }: { appId: string }) { })}
- + {({ isActive }) => (
- Explore Models + Explore
)}
- +
{(filterStar && ) || } - Favorite Models + Favorite
diff --git a/packages/client/dashboard/src/constants/index.ts b/packages/client/dashboard/src/constants/index.ts index eb502244..c30ffe5f 100644 --- a/packages/client/dashboard/src/constants/index.ts +++ b/packages/client/dashboard/src/constants/index.ts @@ -29,4 +29,6 @@ export const WALLET_CONNECT_PROJECT_ID = 'c652d0148879353d7e965d7f6f361e59' export const CERAMIC_NODE_SERVICE_API_URL = process.env.CERAMIC_NODE_SERVICE_API_URL || 'https://ceramic-node-service-test-3rnbvla4lq-df.a.run.app/ceramic-api'; -export const CERAMIC_NODE_SERVICE_WSS_URL = process.env.CERAMIC_NODE_SERVICE_WSS_URL || 'wss://ceramic-node-service-test-3rnbvla4lq-df.a.run.app'; \ No newline at end of file +export const CERAMIC_NODE_SERVICE_WSS_URL = process.env.CERAMIC_NODE_SERVICE_WSS_URL || 'wss://ceramic-node-service-test-3rnbvla4lq-df.a.run.app'; + +export const PAGE_SIZE = 50 diff --git a/packages/client/dashboard/src/container/DappDataStatistic.tsx b/packages/client/dashboard/src/container/DappDataStatistic.tsx index f7b26ab5..740d1e06 100644 --- a/packages/client/dashboard/src/container/DappDataStatistic.tsx +++ b/packages/client/dashboard/src/container/DappDataStatistic.tsx @@ -2,12 +2,12 @@ import { useLocation, useOutletContext } from 'react-router-dom' import CompositeDefinition from '../components/model/CompositeDefinition' import Instance from '../components/model/ModelInstance' import useSelectedDapp from '../hooks/useSelectedDapp' -import { DappComposite, ModelStream, Network } from '../types.d' +import { DappCompositeDto, ModelStream, Network } from '../types.d' export default function DappDataStatistic() { const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream - selectComposite: DappComposite + selectComposite: DappCompositeDto }>() const { selectedDapp } = useSelectedDapp() const location = useLocation() diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappModelEditor.tsx index ab15d128..0e9dbcfa 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappModelEditor.tsx @@ -2,12 +2,12 @@ import { useOutletContext } from 'react-router-dom' import styled from 'styled-components' import CompositeDefinition from '../components/model/CompositeDefinition' import Definition from '../components/model/Definition' -import { DappComposite, ModelStream } from '../types.d' +import { DappCompositeDto, ModelStream } from '../types.d' export default function DappModelEditor() { const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream - selectComposite: DappComposite + selectComposite: DappCompositeDto }>() if (selectModel) { diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index 8dc0685b..fbce0d25 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -2,12 +2,12 @@ import { useOutletContext } from 'react-router-dom' import CompositePlaygroundGraphiQL from '../components/model/CompositePlaygroundGraphiQL' import PlaygroundGraphiQL from '../components/model/Playground' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { DappComposite, ModelStream } from '../types.d' +import { DappCompositeDto, ModelStream } from '../types.d' export default function DappModelPlayground () { const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream - selectComposite: DappComposite + selectComposite: DappCompositeDto }>() const { currCeramicNode } = useCeramicNodeCtx() if (selectModel) { diff --git a/packages/client/dashboard/src/container/DappModelSdk.tsx b/packages/client/dashboard/src/container/DappModelSdk.tsx index 2400f1d7..a4c63ea6 100644 --- a/packages/client/dashboard/src/container/DappModelSdk.tsx +++ b/packages/client/dashboard/src/container/DappModelSdk.tsx @@ -1,12 +1,12 @@ import { useOutletContext } from 'react-router-dom' import styled from 'styled-components' import ModelSDK from '../components/model/ModelSDK' -import { DappComposite, ModelStream } from '../types.d' +import { DappCompositeDto, ModelStream } from '../types.d' export default function DappModelSdk() { const { selectModel } = useOutletContext<{ selectModel: ModelStream - selectComposite: DappComposite + selectComposite: DappCompositeDto }>() if (selectModel) { diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx new file mode 100644 index 00000000..fc266952 --- /dev/null +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -0,0 +1,440 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import dayjs from 'dayjs' +import { useCallback, useEffect, useRef, useState } from 'react' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' +import InfiniteScroll from 'react-infinite-scroll-component' +import { useSearchParams } from 'react-router-dom' +import styled from 'styled-components' +import { updateDapp } from '../api/dapp' +import { PAGE_SIZE } from '../constants' +import { ImgOrName } from '../components/common/ImgOrName' +import Search from '../components/common/Search' +import { TableBox, TableContainer } from '../components/common/TableBox' +import CheckCircleIcon from '../components/icons/CheckCircleIcon' +import PlusCircleIcon from '../components/icons/PlusCircleIcon' +import NoCeramicNodeModal from '../components/node/NoCeramicNodeModal' +import { S3_SCAN_URL } from '../constants' +import { useAppCtx } from '../context/AppCtx' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { CeramicStatus, DappCompositeDto, Network } from '../types.d' +import { shortPubKey } from '../utils/shortPubKey' +import { bindingDappComposites, getComposites } from '../api/composite' +import { Dapps } from './ExploreModel' +import CreateCompositeModal from '../components/model/CreateCompositeModal' +import LayoutIcon from '../components/icons/LayoutIcon' + +export default function ExploreComposite () { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [searchParams, setSearchParams] = useSearchParams() + const { s3ModelCollection, selectedDapp } = useSelectedDapp() + const { currCeramicNode } = useCeramicNodeCtx() + const session = useSession() + const [composites, setComposites] = useState>([]) + // const [starModels, setStarModels] = useState>([]) + const [hasMore, setHasMore] = useState(true) + const searchText = useRef('') + const pageNum = useRef(1) + // const [personalCollections, setPersonalCollections] = useState< + // PersonalCollection[] + // >([]) + // const fetchPersonalCollections = useCallback(async () => { + // if (!session) return + // s3ModelCollection.authComposeClient(session) + // try { + // const personal = await s3ModelCollection.queryPersonalCollections({ + // first: 500 + // }) + // if (personal.errors) throw new Error(personal.errors[0].message) + // const collected = personal.data?.viewer.modelCollectionList + + // if (collected) { + // setPersonalCollections( + // collected?.edges + // .filter(item => item.node && item.node.revoke === false) + // .map(item => { + // return { + // modelId: item.node.modelID, + // id: item.node.id!, + // revoke: !!item.node.revoke + // } + // }) + // ) + // } + // } catch (error) { + // console.error('error -----', error) + // } + // }, [s3ModelCollection, session]) + + // const fetchStarModels = useCallback(async () => { + // const ids = personalCollections + // .filter(item => item.revoke === false) + // .map(item => { + // return item.modelId + // }) + // if (ids.length === 0) { + // setStarModels([]) + // return + // } + + // try { + // const resp = await getStarModels({ + // network: (selectedDapp?.network as Network) || Network.TESTNET, + // ids + // }) + // if (resp.data.code !== 0) { + // throw new Error(resp.data.msg) + // } + + // const list = resp.data.data + // setStarModels([...list]) + // } catch (error) { + // console.error(error) + // } + // }, [personalCollections, selectedDapp?.network]) + + const fetchComposites = useCallback(async () => { + setComposites([]) + setHasMore(true) + const resp = await getComposites({ + name: searchText.current, + network: (selectedDapp?.network as Network) || Network.TESTNET + }) + const list = resp.data.data + setComposites(list) + setHasMore(list.length >= PAGE_SIZE) + pageNum.current = 1 + }, [selectedDapp?.network]) + + const fetchMoreComposites = useCallback( + async (pageNumber: number) => { + const resp = await getComposites({ + name: searchText.current, + pageNumber, + network: (selectedDapp?.network as Network) || Network.TESTNET + }) + const list = resp.data.data + setHasMore(list.length >= PAGE_SIZE) + setComposites([...composites, ...list]) + }, + [composites, selectedDapp?.network] + ) + + useEffect(() => { + fetchComposites() + // fetchPersonalCollections() + }, [fetchComposites]) + + // useEffect(() => { + // fetchStarModels().catch(err => { + // setStarModels([]) + // console.error(err) + // }) + // }, [fetchStarModels]) + + // const filterStar = useMemo(() => { + // return searchParams.get('filterStar') || '' + // }, [searchParams]) + + // const lists = useMemo(() => { + // if (!filterStar) return models + // return starModels + // }, [filterStar, models, starModels]) + const lists = composites + return ( + +
+ {/*
ComposeDB Models
*/} + +
+ { + searchText.current = text + setComposites([]) + fetchComposites() + }} + placeholder={'Search by model name'} + /> +
+
+ { + pageNum.current += 1 + fetchMoreComposites(pageNum.current) + console.log('fetch more') + }} + hasMore={hasMore} + loader={Loading...} + > + + + + + Composite Name + Stream ID + Release Date + Dapps + + + + + + {lists.map((item, idx) => { + return ( + + +
{item.name}
+ + +
{item.streamId || '-'}
+ + +
+ {dayjs(item.createdAt).format('YYYY-MM-DD HH:mm:ss') || + '-'} +
+ + + + + + {/* */} + dapp.id === selectedDapp?.id + ) !== -1 + } + ceramicNodeId={ + currCeramicNode && + currCeramicNode.status === CeramicStatus.RUNNING + ? currCeramicNode?.id + : undefined + } + /> + + + ) + })} + +
+
+
+ {!hasMore && no more data} +
+ ) +} + +function Actions ({ + composite, + hasIndexed, + ceramicNodeId +}: { + composite: DappCompositeDto + hasIndexed: boolean + ceramicNodeId?: number +}) { + const session = useSession() + + const { loadDapps } = useAppCtx() + const { selectedDapp } = useSelectedDapp() + const [adding, setAdding] = useState(false) + + const bindComposite = useCallback(async () => { + if (!session || !selectedDapp) return + if (!ceramicNodeId) return + if (!hasIndexed) { + bindingDappComposites({ + compositeId: composite.id, + dapp: selectedDapp, + did: session.serialize() + }).catch(console.error) + } + try { + setAdding(true) + const composites = selectedDapp.composites || [] + composites.push(composite) + await updateDapp( + { ...selectedDapp, composites }, + session.serialize(), + ceramicNodeId + ) + await loadDapps() + } catch (err) { + console.error(err) + } finally { + setAdding(false) + } + }, [session, selectedDapp, ceramicNodeId, hasIndexed, composite, loadDapps]) + return ( + + + + + + + {({ close }) => ( + + )} + + + + + {adding ? ( + + ) : ( + <> + {hasIndexed ? ( + + ) : ceramicNodeId ? ( + + ) : ( + + + + + + {({ close }) => } + + + + + )} + + )} + + ) +} + +const OpsBox = styled.div` + display: flex; + align-items: center; + gap: -5px; + img { + width: 17px; + } +` + +const ExploreModelContainer = styled.div` + margin-top: 25px; + margin-bottom: 25px; + .no-more { + padding: 20px; + text-align: center; + color: gray; + } + + .mobile-models-box { + margin-bottom: 20px; + } + + .title-box { + display: flex; + align-items: center; + justify-content: end; + margin-bottom: 20px; + .tools { + display: flex; + align-items: center; + gap: 15px; + + > button { + border-radius: 100px; + background: #14171a; + font-size: 14px; + line-height: 20px; + text-align: center; + font-weight: 400; + color: #a0aec0; + text-transform: capitalize; + background: #ffffff; + font-weight: 500; + color: #14171a; + cursor: pointer; + border: none; + outline: none; + /* width: 100px; */ + padding: 0 15px; + height: 36px; + + &.star-btn { + width: 52px; + height: 40px; + + background: #1a1e23; + border: 1px solid #39424c; + border-radius: 100px; + display: inline-flex; + align-items: center; + justify-items: center; + } + } + } + } + + .title { + > span { + font-size: 22px; + font-weight: 700; + line-height: 40px; + } + + /* padding: 0 0 20px 0; */ + position: sticky; + background-color: #14171a; + top: 0; + z-index: 100; + + display: flex; + justify-content: space-between; + align-items: center; + font-weight: 700; + font-size: 24px; + line-height: 28px; + font-style: italic; + + color: #ffffff; + } + + .react-aria-Button { + font-size: 18px; + } +` + +const Loading = styled.div` + padding: 20px; + text-align: center; + color: gray; +` diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 7dfcd0cf..6dda821e 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -12,8 +12,8 @@ import InfiniteScroll from 'react-infinite-scroll-component' import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' import { updateDapp } from '../api/dapp' +import { PAGE_SIZE } from '../constants' import { - PAGE_SIZE, getModelStreamList, getStarModels, startIndexModel @@ -151,7 +151,7 @@ export default function ExploreModel () { return (
-
ComposeDB Models
+ {/*
ComposeDB Models
*/}
{ const data = [...dapps] if (data.length > 3) @@ -550,7 +550,7 @@ const ExploreModelContainer = styled.div` .title-box { display: flex; align-items: center; - justify-content: space-between; + justify-content: end; margin-bottom: 20px; .tools { display: flex; diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index a25da7dd..25a21771 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -28,9 +28,65 @@ export enum AppType { OTHER = 'Other', } +export type DappCompositeDto = { + id: number; + dappId: number; + name: string; + composite: string; + graphql: string; + streamId: string; + runtimeDefinition: string; + dapps: DappDto[]; + createdAt: number; + lastModifiedAt: number; +} + +// export type DappComposite = { +// id: number +// name: string +// dappId: number +// graphql: string +// composite: string +// runtimeDefinition: string +// createdAt: number +// lastModifiedAt: number +// } + +export type DappModelDto = { + id: number; + dappId: number; + mdoelStreamId: string; + composite: string; + graphql: string; + runtimeDefinition: string; + createdAt: number; + lastModifiedAt: number; +} + +export type DappDto = { + id: number; + name: string; + description: string; + stage: string; + type: string; + network: Network; + icon: string; + url: string; + socialLinks: SocialLink[]; + tags: string[]; + models: string[]; + composites: DappCompositeDto[]; + schemas: string[]; + modelDetails: any[]; + ceramicId?: number; + schemaDetails: any[]; + createdAt: number; + lastModifiedAt: number; +} + export type ClientDApp = { id?: number - modelId?: string + // modelId?: string icon?: string name: string network: string @@ -41,6 +97,7 @@ export type ClientDApp = { socialLinks?: { platform: string; url: string }[] tags?: string[] models?: string[] + composites?: DappCompositeDto[]; createdAt?: number lastModifiedAt?: number } @@ -73,7 +130,7 @@ export type CeramicRequestDto = { } export enum CeramicDBType { - SQLITE ='sqlite', + SQLITE = 'sqlite', PGSQL = 'postgres', } @@ -174,14 +231,3 @@ export type ModelMid = { createdAt: number updatedAt: number } - -export type DappComposite = { - id: number - name: string - dappId: number - graphql: string - composite: string - runtimeDefinition: string - createdAt: number - lastModifiedAt: number -} \ No newline at end of file diff --git a/packages/client/dashboard/src/utils/composedb-types/schemas.ts b/packages/client/dashboard/src/utils/composedb-types/schemas.ts index 024eb4ae..9a2a31a2 100644 --- a/packages/client/dashboard/src/utils/composedb-types/schemas.ts +++ b/packages/client/dashboard/src/utils/composedb-types/schemas.ts @@ -1,3 +1,4 @@ +import { ModelStream } from '../../types' import { typeDefinitions } from './typeDefinitions' export const schemas = { @@ -6,3 +7,22 @@ export const schemas = { }`, library: typeDefinitions, } + +const TINT_WORD = `# Edit the model's relation based on your business needs. +# See Example below +# https://composedb.js.org/docs/0.4.x/guides/data-modeling/relations-container-of-items + +` + +export const getCompositeDefaultSchema = (dappModels: ModelStream[]) => { + return TINT_WORD + + dappModels + .map((item) => { + return ` + type ${item.stream_content.name} @loadModel(id: "${item.stream_id}") { + id: ID! + } + ` + }) + .join('\n') +} \ No newline at end of file diff --git a/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts b/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts index 0ac39b08..42497db8 100644 --- a/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts +++ b/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts @@ -1,6 +1,7 @@ import { CeramicApi } from '@ceramicnetwork/common' import { CeramicClient } from '@ceramicnetwork/http-client' import { Composite } from '@composedb/devtools' +import { RuntimeCompositeDefinition } from '@composedb/types' import { EthereumWebAuth, getAccountId } from '@didtools/pkh-ethereum' import { DIDSession } from 'did-session' import { DID } from 'dids' @@ -63,7 +64,7 @@ export async function createCompositeFromBrowser( } //1 Create My Composite - let myComposite + let myComposite: Composite try { console.log('Creating the composite...') myComposite = await Composite.create({ @@ -95,7 +96,7 @@ export async function createCompositeFromBrowser( } //3 Compile My Composite - let myRuntimeDefinition + let myRuntimeDefinition: RuntimeCompositeDefinition try { console.log('Compiling the composite...') myRuntimeDefinition = myComposite.toRuntime() From cf25397c5e54670cb7bfc1704af2232004a0b67b Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 24 Jan 2024 20:27:55 +0800 Subject: [PATCH 085/127] CheckCircleIcon style warning fix --- .../client/dashboard/src/components/icons/CheckCircleIcon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx b/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx index d585a088..e9b88661 100644 --- a/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx +++ b/packages/client/dashboard/src/components/icons/CheckCircleIcon.tsx @@ -7,7 +7,7 @@ export default function CheckCircleIcon({ bgc = '#00b171' }: { bgc?: string }) { fill="none" xmlns="http://www.w3.org/2000/svg" > - + Date: Thu, 25 Jan 2024 02:02:52 +0800 Subject: [PATCH 086/127] publish composite --- .../client/dashboard/src/api/composite.ts | 15 +- .../src/api/compositeSDK/S3CompositeModel.ts | 164 ++++++++++++ .../dashboard/src/api/compositeSDK/graphql.ts | 233 ++++++++++++++++++ .../src/api/compositeSDK/runtime-composite.ts | 60 +++++ .../components/model/CompositeDefinition.tsx | 2 + .../src/components/model/CompositePublish.tsx | 87 +++++++ .../components/model/CreateCompositeModal.tsx | 10 +- .../src/components/model/sdkTemplate.ts | 2 +- packages/client/dashboard/src/types.d.ts | 9 +- 9 files changed, 569 insertions(+), 13 deletions(-) create mode 100644 packages/client/dashboard/src/api/compositeSDK/S3CompositeModel.ts create mode 100644 packages/client/dashboard/src/api/compositeSDK/graphql.ts create mode 100644 packages/client/dashboard/src/api/compositeSDK/runtime-composite.ts create mode 100644 packages/client/dashboard/src/components/model/CompositePublish.tsx diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index 2653a2fb..4869ccab 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -6,6 +6,7 @@ import { ApiResp } from '.' import { APP_API_URL } from '../constants' import { ClientDApp, + CompositeInput, DappCompositeDto, Network, } from '../types.d' @@ -36,7 +37,7 @@ export function createDappComposites({ }: { did: string dapp: ClientDApp - data: { name: string, gqlSchema: PassedSchema, composite: Composite, runtimeDefinition: RuntimeCompositeDefinition } + data: CompositeInput }) { let host = APP_API_URL return axios({ @@ -45,7 +46,7 @@ export function createDappComposites({ headers: { 'did-session': did, }, - data: { graphql: data.gqlSchema.code, name: data.name, composite: data.composite, runtimeDefinition: data.runtimeDefinition }, + data, }) } @@ -141,12 +142,10 @@ export function postComposite({ did, id, data, - name, }: { did: string - id: string - data: string - name: string + id: number + data: CompositeInput }) { let host = APP_API_URL return axios({ @@ -155,7 +154,7 @@ export function postComposite({ headers: { 'did-session': did, }, - data: { graphql: data, name }, + data, }) } @@ -175,5 +174,3 @@ export function deleteComposite({ }, }) } - -export { PAGE_SIZE } diff --git a/packages/client/dashboard/src/api/compositeSDK/S3CompositeModel.ts b/packages/client/dashboard/src/api/compositeSDK/S3CompositeModel.ts new file mode 100644 index 00000000..e603c693 --- /dev/null +++ b/packages/client/dashboard/src/api/compositeSDK/S3CompositeModel.ts @@ -0,0 +1,164 @@ +/** + * How to use this model: + * + * export const CERAMIC_TESTNET_HOST = "https://gcp-ceramic-testnet-dev.s3.xyz"; + * const compositeModel = new S3CompositeModel(CERAMIC_TESTNET_HOST); + * + * // auth with didSession + * compositeModel.authComposeClient(didSession); + * + * // createNew + * const resp = await compositeModel.createComposite({...}); + * + * // update + * const resp = await compositeModel.updateComposite({...}); + * + * // queryList + * const resp = await compositeModel.queryCompositeIndex({first: 100, after: ""}); + * + * // queryWithId + * const resp = await compositeModel.queryCompositeWithId("..."); + * + */ + +import { ComposeClient } from "@composedb/client"; +import { RuntimeCompositeDefinition } from "@composedb/types"; +import { DIDSession } from "did-session"; +import type { CeramicApi } from "@ceramicnetwork/common"; +import { DID } from "dids"; +import { Page } from "@ceramicnetwork/common"; + +import { definition } from "./runtime-composite"; + +import { + Composite, + CreateCompositeInput, + CreateCompositePayload, + UpdateCompositeInput, + UpdateCompositePayload, + Scalars, +} from "./graphql"; + +export class S3CompositeModel { + composeClient: ComposeClient; + + constructor(ceramic: CeramicApi | string) { + this.composeClient = new ComposeClient({ + ceramic: ceramic, + definition: definition as unknown as RuntimeCompositeDefinition, + }); + } + + public authComposeClient(session: DIDSession) { + if (!session || (session.hasSession && session.isExpired)) { + throw new Error("Please login with wallet first!"); + } + this.composeClient.setDID(session.did); + } + + public resetComposeClient() { + const did = new DID(); + this.composeClient.setDID(did); + } + + async createComposite(input: CreateCompositeInput) { + const mutation = ` + mutation createComposite($input: CreateCompositeInput!) { + createComposite(input: $input) { + document { + id + } + } + } + `; + const resp = await this.composeClient.executeQuery<{ + createComposite: CreateCompositePayload; + }>(mutation, { + input: { + content: { + ...input.content, + }, + }, + }); + return resp; + } + + async updateComposite(input: UpdateCompositeInput) { + const mutation = ` + mutation($input: UpdateCompositeInput!) { + updateComposite(input: $input) { + document { + id + } + } + } + `; + const resp = await this.composeClient.executeQuery<{ + updateComposite: UpdateCompositePayload; + }>(mutation, { + input: { + id: input.id, + content: { + ...input.content, + }, + }, + }); + + return resp; + } + + async queryCompositeIndex({ + first = 100, + after = "", + }: { + first: number; + after?: string; + }) { + const query = ` + query { + compositeIndex(first: ${first}, after: "${after}") { + edges { + node { + id + # other fields + } + } + pageInfo { + hasNextPage + hasPreviousPage + endCursor + startCursor + } + } + } + `; + + const resp = await this.composeClient.executeQuery<{ + compositeIndex: Page; + }>(query); + + return resp; + } + + async queryCompositeWithId(id: Scalars["ID"]["input"]) { + const query = ` + query($id: ID!) { + node(id: $id) { + ... on Composite { + id + # other fields + } + } + } + `; + + const resp = await this.composeClient.executeQuery<{ + node: Composite; + }>(query, { + id, + }); + + return resp; + } +} + diff --git a/packages/client/dashboard/src/api/compositeSDK/graphql.ts b/packages/client/dashboard/src/api/compositeSDK/graphql.ts new file mode 100644 index 00000000..c8937e46 --- /dev/null +++ b/packages/client/dashboard/src/api/compositeSDK/graphql.ts @@ -0,0 +1,233 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + /** A Ceramic Commit ID */ + CeramicCommitID: { input: any; output: any; } + /** A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar. */ + DateTime: { input: any; output: any; } +}; + +export type CeramicAccount = Node & { + __typename?: 'CeramicAccount'; + compositeList?: Maybe; + compositeListCount: Scalars['Int']['output']; + /** Globally unique identifier of the account (DID string) */ + id: Scalars['ID']['output']; + /** Whether the Ceramic instance is currently authenticated with this account or not */ + isViewer: Scalars['Boolean']['output']; +}; + + +export type CeramicAccountCompositeListArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + +export type Composite = Node & { + __typename?: 'Composite'; + createAt?: Maybe; + /** Account controlling the document */ + creator: CeramicAccount; + description?: Maybe; + encodedDefinition: Scalars['String']['output']; + id: Scalars['ID']['output']; + modifiedAt?: Maybe; + name: Scalars['String']['output']; + revoke?: Maybe; + schema: Scalars['String']['output']; + /** Current version of the document */ + version: Scalars['CeramicCommitID']['output']; +}; + +/** A connection to a list of items. */ +export type CompositeConnection = { + __typename?: 'CompositeConnection'; + /** A list of edges. */ + edges?: Maybe>>; + /** Information to aid in pagination. */ + pageInfo: PageInfo; +}; + +/** An edge in a connection. */ +export type CompositeEdge = { + __typename?: 'CompositeEdge'; + /** A cursor for use in pagination */ + cursor: Scalars['String']['output']; + /** The item at the end of the edge */ + node?: Maybe; +}; + +export type CompositeInput = { + createAt?: InputMaybe; + description?: InputMaybe; + encodedDefinition: Scalars['String']['input']; + modifiedAt?: InputMaybe; + name: Scalars['String']['input']; + revoke?: InputMaybe; + schema: Scalars['String']['input']; +}; + +export type CreateCompositeInput = { + clientMutationId?: InputMaybe; + content: CompositeInput; +}; + +export type CreateCompositePayload = { + __typename?: 'CreateCompositePayload'; + clientMutationId?: Maybe; + document: Composite; + /** Fetches an object given its ID */ + node?: Maybe; + /** Account currently authenticated on the Ceramic instance, if set */ + viewer?: Maybe; +}; + + +export type CreateCompositePayloadNodeArgs = { + id: Scalars['ID']['input']; +}; + +export type Mutation = { + __typename?: 'Mutation'; + createComposite?: Maybe; + updateComposite?: Maybe; +}; + + +export type MutationCreateCompositeArgs = { + input: CreateCompositeInput; +}; + + +export type MutationUpdateCompositeArgs = { + input: UpdateCompositeInput; +}; + +/** An object with an ID */ +export type Node = { + /** The id of the object. */ + id: Scalars['ID']['output']; +}; + +/** Information about pagination in a connection. */ +export type PageInfo = { + __typename?: 'PageInfo'; + /** When paginating forwards, the cursor to continue. */ + endCursor?: Maybe; + /** When paginating forwards, are there more items? */ + hasNextPage: Scalars['Boolean']['output']; + /** When paginating backwards, are there more items? */ + hasPreviousPage: Scalars['Boolean']['output']; + /** When paginating backwards, the cursor to continue. */ + startCursor?: Maybe; +}; + +export type PartialCompositeInput = { + createAt?: InputMaybe; + description?: InputMaybe; + encodedDefinition?: InputMaybe; + modifiedAt?: InputMaybe; + name?: InputMaybe; + revoke?: InputMaybe; + schema?: InputMaybe; +}; + +export type Query = { + __typename?: 'Query'; + compositeCount: Scalars['Int']['output']; + compositeIndex?: Maybe; + /** Fetches an object given its ID */ + node?: Maybe; + /** Fetches objects given their IDs */ + nodes: Array>; + /** Account currently authenticated on the Ceramic instance, if set */ + viewer?: Maybe; +}; + + +export type QueryCompositeIndexArgs = { + after?: InputMaybe; + before?: InputMaybe; + first?: InputMaybe; + last?: InputMaybe; +}; + + +export type QueryNodeArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryNodesArgs = { + ids: Array; +}; + +export type UpdateCompositeInput = { + clientMutationId?: InputMaybe; + content: PartialCompositeInput; + id: Scalars['ID']['input']; + options?: InputMaybe; +}; + +export type UpdateCompositePayload = { + __typename?: 'UpdateCompositePayload'; + clientMutationId?: Maybe; + document: Composite; + /** Fetches an object given its ID */ + node?: Maybe; + /** Account currently authenticated on the Ceramic instance, if set */ + viewer?: Maybe; +}; + + +export type UpdateCompositePayloadNodeArgs = { + id: Scalars['ID']['input']; +}; + +export type UpdateOptionsInput = { + /** Fully replace the document contents instead of performing a shallow merge */ + replace?: InputMaybe; + /** Only perform mutation if the document matches the provided version */ + version?: InputMaybe; +}; + +export type GetCompositeQueryVariables = Exact<{ + id: Scalars['ID']['input']; +}>; + + +export type GetCompositeQuery = { __typename?: 'Query', node?: { __typename?: 'CeramicAccount', id: string } | { __typename?: 'Composite', id: string } | null }; + +export type CreateCompositeMutationVariables = Exact<{ + input: CreateCompositeInput; +}>; + + +export type CreateCompositeMutation = { __typename?: 'Mutation', createComposite?: { __typename?: 'CreateCompositePayload', document: { __typename?: 'Composite', id: string } } | null }; + +export type UpdateCompositeMutationVariables = Exact<{ + input: UpdateCompositeInput; +}>; + + +export type UpdateCompositeMutation = { __typename?: 'Mutation', updateComposite?: { __typename?: 'UpdateCompositePayload', document: { __typename?: 'Composite', id: string } } | null }; + + +export const GetCompositeDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetComposite"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"InlineFragment","typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Composite"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; +export const CreateCompositeDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateComposite"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateCompositeInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createComposite"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"document"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; +export const UpdateCompositeDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateComposite"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateCompositeInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateComposite"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"document"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/packages/client/dashboard/src/api/compositeSDK/runtime-composite.ts b/packages/client/dashboard/src/api/compositeSDK/runtime-composite.ts new file mode 100644 index 00000000..7063fb5a --- /dev/null +++ b/packages/client/dashboard/src/api/compositeSDK/runtime-composite.ts @@ -0,0 +1,60 @@ +// This is an auto-generated file, do not edit manually + +export const definition = { + "models": { + "Composite": { + "id": "kjzl6hvfrbw6c9kigzo7cylhkiageuvjslfvj8gdouhqoo5n2iny4ny5i3lfh56", + "accountRelation": { + "type": "list" + } + } + }, + "objects": { + "Composite": { + "name": { + "type": "string", + "required": true + }, + "revoke": { + "type": "boolean", + "required": false + }, + "schema": { + "type": "string", + "required": true + }, + "createAt": { + "type": "datetime", + "required": false + }, + "modifiedAt": { + "type": "datetime", + "required": false + }, + "description": { + "type": "string", + "required": false + }, + "encodedDefinition": { + "type": "string", + "required": true + }, + "creator": { + "type": "view", + "viewType": "documentAccount" + }, + "version": { + "type": "view", + "viewType": "documentVersion" + } + } + }, + "enums": {}, + "accountData": { + "compositeList": { + "type": "connection", + "name": "Composite" + } + } +} + \ No newline at end of file diff --git a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx index 56fe3665..eda9798c 100644 --- a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx +++ b/packages/client/dashboard/src/components/model/CompositeDefinition.tsx @@ -4,6 +4,7 @@ import styled from 'styled-components' import { DappCompositeDto } from '../../types' import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' +import CompositePublish from './CompositePublish' export default function CompositeDefinition({ composite, @@ -26,6 +27,7 @@ export default function CompositeDefinition({
{composite.name} +
{ + if (!session) { + toast.error('Please login first') + return + } + if (!composite) { + toast.error('Please create composite first') + return + } + const compositeInput: CompositeInput = { + name: composite.name, + // description: composite.description, + schema: composite.graphql, + encodedDefinition: composite.composite, + createAt: new Date().toISOString() + } + console.log('compositeInput', compositeInput) + setPublishing(true) + const s3Composite = new S3CompositeModel(CERAMIC_TESTNET_HOST) + s3Composite.authComposeClient(session) + const stream = await s3Composite.createComposite({ + content: compositeInput + }) + console.log(stream) + const streamId = stream?.data?.createComposite?.document?.id + if (!streamId) { + toast.error('Publish failed') + return + } else { + toast.success('Publish success') + const newCompositeData = { ...composite, streamId } + postComposite({ + did: session.serialize(), + id: composite.id, + data: newCompositeData + }) + } + setPublishing(false) + }, [composite, session]) + + return ( + + {composite.streamId ? ( +
Published
+ ) : publishing ? ( + + ) : ( + + )} +
+ ) +} +const PublishBox = styled.div` + button { + cursor: pointer; + padding: 0 15px; + width: 100px; + height: 36px; + + border-radius: 10px; + font-size: 14px; + line-height: 20px; + text-align: center; + background: #fff; + font-weight: 700; + color: #000; + } +` diff --git a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx index 620bc25f..2b3e974e 100644 --- a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx @@ -50,9 +50,15 @@ export default function CreateCompositeModal ({ ) if (!result) return const { composite, runtimeDefinition } = result - + + const newCompositeData = { + graphql: gqlSchema.code, + name, + composite:JSON.stringify(composite), + runtimeDefinition:JSON.stringify(runtimeDefinition), + } const resp = await createDappComposites({ - data: { name, gqlSchema, composite, runtimeDefinition }, + data: newCompositeData, dapp: selectedDapp, did: session.serialize() }) diff --git a/packages/client/dashboard/src/components/model/sdkTemplate.ts b/packages/client/dashboard/src/components/model/sdkTemplate.ts index 03e0c5e9..445113f1 100644 --- a/packages/client/dashboard/src/components/model/sdkTemplate.ts +++ b/packages/client/dashboard/src/components/model/sdkTemplate.ts @@ -45,7 +45,7 @@ export class S3<%= modelName %>Model { constructor(ceramic: CeramicApi | string) { this.composeClient = new ComposeClient({ ceramic: ceramic, - definition: definition as RuntimeCompositeDefinition, + definition: definition as unknown as RuntimeCompositeDefinition, }); } diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 25a21771..29df55a4 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -30,7 +30,7 @@ export enum AppType { export type DappCompositeDto = { id: number; - dappId: number; + dappId?: number; name: string; composite: string; graphql: string; @@ -41,6 +41,13 @@ export type DappCompositeDto = { lastModifiedAt: number; } +export type CompositeInput = { + name: string; + composite: string; + graphql: string; + streamId?: string; + runtimeDefinition?: string; +} // export type DappComposite = { // id: number // name: string From ccc22e24d31416b7847d7ca287465c8b8c4e46e7 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 25 Jan 2024 02:19:03 +0800 Subject: [PATCH 087/127] publish composite state updata --- .../src/components/model/CompositePublish.tsx | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositePublish.tsx b/packages/client/dashboard/src/components/model/CompositePublish.tsx index 604d3927..7c246e0f 100644 --- a/packages/client/dashboard/src/components/model/CompositePublish.tsx +++ b/packages/client/dashboard/src/components/model/CompositePublish.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react' +import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' import { DappCompositeDto } from '../../types' import { toast } from 'react-toastify' @@ -13,8 +13,19 @@ export default function CompositePublish ({ }: { composite: DappCompositeDto }) { + + const [published, setPublished] = useState(false) const [publishing, setPublishing] = useState(false) const session = useSession() + + useEffect(() => { + if (composite.streamId) { + setPublished(true) + }else{ + setPublished(false) + } + }, [composite.streamId]) + const publish = useCallback(async () => { if (!session) { toast.error('Please login first') @@ -50,6 +61,8 @@ export default function CompositePublish ({ did: session.serialize(), id: composite.id, data: newCompositeData + }).then(() => { + setPublished(true) }) } setPublishing(false) @@ -57,7 +70,7 @@ export default function CompositePublish ({ return ( - {composite.streamId ? ( + {published ? (
Published
) : publishing ? ( + @@ -286,8 +306,8 @@ function Actions ({ )} From 6bd9bfacc5fb184fff9709cba3b54f06769e44e1 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 25 Jan 2024 04:07:22 +0800 Subject: [PATCH 089/127] update new composite action --- .../src/components/model/ModelList.tsx | 215 +++++++++--------- 1 file changed, 112 insertions(+), 103 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ModelList.tsx b/packages/client/dashboard/src/components/model/ModelList.tsx index 52abaa9a..c1edacdb 100644 --- a/packages/client/dashboard/src/components/model/ModelList.tsx +++ b/packages/client/dashboard/src/components/model/ModelList.tsx @@ -1,7 +1,17 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { Button, Dialog, DialogTrigger, Menu, MenuItem, MenuTrigger, Modal, ModalOverlay, Popover } from 'react-aria-components' -import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' +import { + Button, + Dialog, + DialogTrigger, + Menu, + MenuItem, + MenuTrigger, + Modal, + ModalOverlay, + Popover +} from 'react-aria-components' +import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' import { deleteDappComposites, getDappComposites } from '../../api/composite' import { updateDapp } from '../../api/dapp' @@ -10,7 +20,12 @@ import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useIsOwner from '../../hooks/useIsOwner' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { CeramicStatus, DappCompositeDto, ModelStream, Network } from '../../types.d' +import { + CeramicStatus, + DappCompositeDto, + ModelStream, + Network +} from '../../types.d' import { shortPubKey } from '../../utils/shortPubKey' import CopyTint from '../common/CopyTint' import MergeIcon from '../icons/MergeIcon' @@ -23,6 +38,16 @@ import FavoriteModel from './FavoriteModal' import MergeModal from './MergeModal' import { getCompositeDefaultSchema } from '../../utils/composedb-types/schemas' +enum OPEN_MODAL { + NONE, + CREATE_NEW_MODEL, + ADD_FROM_ALL_MODELS, + ADD_FROM_FAVORITE_MODELS, + CREATE_NEW_COMPOSITE, + ADD_FROM_ALL_COMPOSITES, + ADD_FROM_FAVORITE_COMPOSITES +} + export default function ModelList ({ editable, selectComposite, @@ -159,6 +184,7 @@ export default function ModelList ({ const isMetrics = location.pathname.endsWith('statistic') const isSdk = location.pathname.endsWith('sdk') + const [openModal, setOpenModal] = useState(OPEN_MODAL.NONE) if (loading) { return ( @@ -173,8 +199,6 @@ export default function ModelList ({

Models

- - {editable && isOwner && (!currCeramicNode || @@ -200,15 +224,15 @@ export default function ModelList ({ { if (id === 'explore') { - navigate(`/dapp/${appId}/explore`) + navigate(`/dapp/${appId}/explore/model`) return } if (id === 'favorite') { - document.getElementById('add-from-favorite')?.click() + setOpenModal(OPEN_MODAL.ADD_FROM_FAVORITE_MODELS) return } if (id === 'create') { - document.getElementById('create-new')?.click() + setOpenModal(OPEN_MODAL.CREATE_NEW_MODEL) return } }} @@ -244,12 +268,48 @@ export default function ModelList ({ <>

Composites

- {editable && isOwner && ( - - )} + {editable && + isOwner && + (!currCeramicNode || + currCeramicNode.status !== CeramicStatus.RUNNING ? ( + + + + + + {({ close }) => ( + + )} + + + + + ) : ( + + + + { + if (id === 'explore') { + navigate(`/dapp/${appId}/explore/composite`) + return + } + if (id === 'create') { + setOpenModal(OPEN_MODAL.CREATE_NEW_COMPOSITE) + return + } + }} + > + Explore Composites + Create New Composites + + + + ))}
)} + setOpenModal(OPEN_MODAL.NONE)} + > + {({ close }) => } + + setOpenModal(OPEN_MODAL.NONE)} + > + + {({ close }) => ( + + )} + + + setOpenModal(OPEN_MODAL.NONE)} + > + {({ close }) => } + {editable && isOwner && ( @@ -322,11 +408,11 @@ function DappCompositeList ({ >
{item.name}
{editable && ( - { + { await removeAction(item.id) }} - streamId={item.id + ''} + id={item.id + ''} /> )}
@@ -374,9 +460,9 @@ function DappModelList ({ >
{item.stream_content.name}
{editable && ( - )}
@@ -402,12 +488,12 @@ function DappModelList ({ ) } -function ModelListItemTrash ({ - streamId, - removeModelAction +function RemoveButton ({ + id, + removeAction }: { - streamId: string - removeModelAction: (modelId: string) => Promise + id: string + removeAction: (id: string) => Promise }) { const [removing, setRemoving] = useState(false) if (removing) { @@ -422,7 +508,7 @@ function ModelListItemTrash ({ onClick={async e => { e.stopPropagation() setRemoving(true) - await removeModelAction(streamId) + await removeAction(id) setRemoving(false) }} > @@ -431,83 +517,6 @@ function ModelListItemTrash ({ ) } -function Favorite () { - return ( - - - - - {({ close }) => } - - - - ) -} - -function CreateNew () { - const [searchParams] = useSearchParams() - useEffect(() => { - if (searchParams.get('create-new') === 'true') { - document.getElementById('create-new')?.click() - } - }, [searchParams]) - return ( - - - - - - {({ close }) => } - - - - - ) -} - -function CreateComposite ({ - loadDappComposites, - dappModels -}: { - loadDappComposites: () => Promise - dappModels: ModelStream[] -}) { - return ( - - - - - - {({ close }) => ( - - )} - - - - - ) -} - const ListBox = styled.div` background: #1b1e23; border: 1px solid #39424c; From bd1edfd746fdd312dbaf4c9d1f31c1a8c1676514 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 26 Jan 2024 10:59:46 +0800 Subject: [PATCH 090/127] update getComposites axios params --- packages/client/dashboard/src/api/composite.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index d9f4a132..f50f4115 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -112,7 +112,7 @@ export function getComposites({ return axios({ url: host + `/dapps/composites`, method: 'GET', - data: { + params: { pageSize, pageNumber, published, From 3d8b90aad63bb14cf21a593c1e39feb86ecba3bd Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 26 Jan 2024 15:29:29 +0800 Subject: [PATCH 091/127] fix some code about models --- packages/client/dashboard/src/api/model.ts | 6 ++--- .../src/components/model/FavoriteModal.tsx | 4 +-- .../src/components/model/ModelList.tsx | 25 ++++++++++++++----- .../src/container/ExploreComposite.tsx | 2 +- .../dashboard/src/container/ExploreModel.tsx | 4 +-- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index 0894e001..6153df3b 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -6,7 +6,7 @@ import { ApiResp } from '.' import { APP_API_URL, PAGE_SIZE } from '../constants' import { ClientDApp, - DappCompositeDto, + DappModelDto, GraphqlGenType, GraphqlGenTypeServer, ModeCreateResult, @@ -22,7 +22,7 @@ export function getDappModels({ }: { dapp: ClientDApp did?: string -}): AxiosPromise> { +}): AxiosPromise> { let host = APP_API_URL return axios({ @@ -134,7 +134,7 @@ export function createModel( }) } -export function getStarModels({ +export function getModelsInfoByIds({ network, ids, }: { diff --git a/packages/client/dashboard/src/components/model/FavoriteModal.tsx b/packages/client/dashboard/src/components/model/FavoriteModal.tsx index 03b0a1b6..90d92ff1 100644 --- a/packages/client/dashboard/src/components/model/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/model/FavoriteModal.tsx @@ -3,7 +3,7 @@ import dayjs from 'dayjs' import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' import { updateDapp } from '../../api/dapp' -import { getStarModels, startIndexModel } from '../../api/model' +import { getModelsInfoByIds, startIndexModel } from '../../api/model' import { S3_SCAN_URL } from '../../constants' import { PersonalCollection, useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' @@ -84,7 +84,7 @@ function ModelList() { } try { - const resp = await getStarModels({ + const resp = await getModelsInfoByIds({ network: (selectedDapp?.network as Network) || Network.TESTNET, ids, }) diff --git a/packages/client/dashboard/src/components/model/ModelList.tsx b/packages/client/dashboard/src/components/model/ModelList.tsx index c1edacdb..51920b32 100644 --- a/packages/client/dashboard/src/components/model/ModelList.tsx +++ b/packages/client/dashboard/src/components/model/ModelList.tsx @@ -15,7 +15,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styled from 'styled-components' import { deleteDappComposites, getDappComposites } from '../../api/composite' import { updateDapp } from '../../api/dapp' -import { getStarModels } from '../../api/model' +import { getDappModels, getModelsInfoByIds } from '../../api/model' import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useIsOwner from '../../hooks/useIsOwner' @@ -69,7 +69,7 @@ export default function ModelList ({ const navigate = useNavigate() const [loading, setLoading] = useState(false) const [dappModels, setDappModels] = useState() - const [composites, setComposites] = useState([]) + const [dappComposites, setDappComposites] = useState([]) const location = useLocation() const dapp = useMemo(() => { @@ -85,7 +85,7 @@ export default function ModelList ({ } try { - const resp = await getStarModels({ + const resp = await getModelsInfoByIds({ network: dapp.network as Network, ids: dapp.models || [] }) @@ -101,6 +101,19 @@ export default function ModelList ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [dapp]) + // const loadDappModels = useCallback(async () => { + // if (!dapp) return + // try { + // const resp = await getDappModels({ + // dapp + // }) + // if (resp.data.code !== 0) throw new Error(resp.data.msg) + // setDappModels(resp.data.data) + // } catch (error) { + // console.error(error) + // } + // }, [dapp]) + const loadDappComposites = useCallback(async () => { if (!dapp) return try { @@ -108,7 +121,7 @@ export default function ModelList ({ dapp }) if (resp.data.code !== 0) throw new Error(resp.data.msg) - setComposites(resp.data.data) + setDappComposites(resp.data.data) } catch (error) { console.error(error) } @@ -313,7 +326,7 @@ export default function ModelList ({
( )} diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx index aed19587..277fb21a 100644 --- a/packages/client/dashboard/src/container/ExploreComposite.tsx +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -84,7 +84,7 @@ export default function ExploreComposite () { // } // try { - // const resp = await getStarModels({ + // const resp = await getModelsInfoByIds({ // network: (selectedDapp?.network as Network) || Network.TESTNET, // ids // }) diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 6dda821e..9f9fd10c 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -15,7 +15,7 @@ import { updateDapp } from '../api/dapp' import { PAGE_SIZE } from '../constants' import { getModelStreamList, - getStarModels, + getModelsInfoByIds, startIndexModel } from '../api/model' import { ImgOrName } from '../components/common/ImgOrName' @@ -87,7 +87,7 @@ export default function ExploreModel () { } try { - const resp = await getStarModels({ + const resp = await getModelsInfoByIds({ network: (selectedDapp?.network as Network) || Network.TESTNET, ids }) From b805e9ccb8c6e10a6eddfe9bfb59d962a5da21c8 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 26 Jan 2024 16:46:11 +0800 Subject: [PATCH 092/127] fix model editor structure --- ...siteDefinition.tsx => CompositeEditor.tsx} | 57 ++--- .../src/components/model/Definition.tsx | 195 ------------------ .../src/components/model/ModelTabs.tsx | 4 +- .../src/container/DappDataStatistic.tsx | 17 +- .../src/container/DappModelEditor.tsx | 122 +++++++++-- .../dashboard/src/hooks/useSelectedDapp.ts | 1 - packages/client/dashboard/src/types.d.ts | 2 +- 7 files changed, 141 insertions(+), 257 deletions(-) rename packages/client/dashboard/src/components/model/{CompositeDefinition.tsx => CompositeEditor.tsx} (75%) delete mode 100644 packages/client/dashboard/src/components/model/Definition.tsx diff --git a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx similarity index 75% rename from packages/client/dashboard/src/components/model/CompositeDefinition.tsx rename to packages/client/dashboard/src/components/model/CompositeEditor.tsx index eda9798c..3cf93446 100644 --- a/packages/client/dashboard/src/components/model/CompositeDefinition.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -1,34 +1,43 @@ +import { Composite } from '@composedb/devtools' import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import styled from 'styled-components' -import { DappCompositeDto } from '../../types' import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' -import CompositePublish from './CompositePublish' -export default function CompositeDefinition({ - composite, +export default function CompositeEditor({ + schema, + encodedDefinition, }: { - composite: DappCompositeDto + schema?: string + encodedDefinition: string }) { const [gqlSchema, setGqlSchema] = useState({ - code: composite.graphql, + code: schema || '', libraries: schemas.library, }) + const runtimeDefinition = useMemo(() => { + if (!encodedDefinition) { + return null + } + try { + const composite = Composite.from(JSON.parse(encodedDefinition)) + return composite.toRuntime() + } catch (error) { + return null + } + }, [encodedDefinition]) + useEffect(() => { setGqlSchema({ - code: composite.graphql, + code: schema || '', libraries: schemas.library, }) - }, [composite]) + }, [schema]) return ( - -
- {composite.name} - -
+ { @@ -38,33 +47,29 @@ export default function CompositeDefinition({ /> - {composite.composite && ( + {encodedDefinition && ( )} - {composite.runtimeDefinition && ( + {runtimeDefinition && ( )} -
+ ) } -const DefinitionBox = styled.div` +const Box = styled.div` .title { display: flex; align-items: center; diff --git a/packages/client/dashboard/src/components/model/Definition.tsx b/packages/client/dashboard/src/components/model/Definition.tsx deleted file mode 100644 index 356894bc..00000000 --- a/packages/client/dashboard/src/components/model/Definition.tsx +++ /dev/null @@ -1,195 +0,0 @@ -import { AxiosError } from 'axios' -import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { useCallback, useEffect, useState } from 'react' -import styled from 'styled-components' -import { queryModelGraphql } from '../../api/model' -import useSelectedDapp from '../../hooks/useSelectedDapp' -import { ModeQueryResult, Network } from '../../types.d' -import { schemas } from '../../utils/composedb-types/schemas' -import CodeDownload from './CodeDownload' - -export default function Definition({ streamId }: { streamId: string }) { - const [modelData, setModelData] = useState() - const [gqlSchema, setGqlSchema] = useState({ - code: schemas.code, - }) - const [errMsg, setErrMsg] = useState('') - const { selectedDapp } = useSelectedDapp() - const [loading, setLoading] = useState(false) - - const fetchModelGraphql = useCallback( - async (streamId: string) => { - try { - setLoading(true) - setErrMsg('') - const resp = await queryModelGraphql( - streamId, - (selectedDapp?.network as Network) || Network.TESTNET - ) - const { data } = resp.data - setModelData(data) - if (data.graphqlSchemaDefinition) { - setGqlSchema({ - code: data.graphqlSchemaDefinition, - libraries: schemas.library, - }) - } else { - setGqlSchema({ - code: data.graphqlSchema, - }) - } - } catch (error) { - const err = error as AxiosError - setErrMsg((err.response?.data as any).message || err.message) - } finally { - setLoading(false) - } - }, - [selectedDapp] - ) - - useEffect(() => { - if (!streamId) return - fetchModelGraphql(streamId) - }, [fetchModelGraphql, streamId]) - - if (loading) { - return ( -
- Loading... -
- ) - } - - if (errMsg) { - return ( -
-
- {errMsg} -
- ) - } - - return ( -
- - { - setGqlSchema(props) - }} - schema={gqlSchema} - /> - - - {modelData?.composite && ( - - )} - {modelData?.runtimeDefinition && ( - - )} - -
- ) -} - -const EditorBox = styled.div` - height: calc(100vh - 300px); - max-height: 800px; - background: #14171a; - border: 1px solid #39424c; - border-radius: 20px; - overflow: hidden; - width: inherit; - * { - box-sizing: border-box; - } -` - -const ResultBox = styled.div` - display: grid; - grid-template-columns: 1fr 1fr; - gap: 20px; - margin-top: 20px; - > div { - background: #1b1e23; - border: 1px solid #39424c; - border-radius: 20px; - overflow: hidden; - } - div { - box-sizing: border-box; - background-color: #1a1a1c; - .title { - padding: 10px; - display: flex; - align-items: center; - justify-content: space-between; - margin: 0; - font-weight: 700; - font-size: 24px; - line-height: 28px; - font-style: italic; - color: #ffffff; - - button { - background: inherit; - } - - h3 { - margin: 0; - padding: 0; - font-weight: 700; - font-size: 20px; - line-height: 24px; - } - } - } - .result-text { - word-wrap: break-word; - color: #718096; - overflow: scroll; - width: 100%; - margin-top: 0; - > div { - width: fit-content; - } - } - - button { - cursor: pointer; - border: none; - outline: none; - /* width: 100px; */ - padding: 0 15px; - height: 36px; - - border-radius: 100px; - background: #14171a; - font-size: 14px; - line-height: 20px; - text-align: center; - font-weight: 400; - color: #a0aec0; - text-transform: capitalize; - background: #718096; - font-weight: 500; - color: #14171a; - } -` - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` diff --git a/packages/client/dashboard/src/components/model/ModelTabs.tsx b/packages/client/dashboard/src/components/model/ModelTabs.tsx index 11106f20..4daec5b0 100644 --- a/packages/client/dashboard/src/components/model/ModelTabs.tsx +++ b/packages/client/dashboard/src/components/model/ModelTabs.tsx @@ -7,7 +7,7 @@ * @Description: */ import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' -import Definition from './Definition' +// import Definition from './Definition' import ModelSDK from './ModelSDK' export default function ModelTabs({ @@ -27,7 +27,7 @@ export default function ModelTabs({
- + {/* */} diff --git a/packages/client/dashboard/src/container/DappDataStatistic.tsx b/packages/client/dashboard/src/container/DappDataStatistic.tsx index 740d1e06..6baddbd2 100644 --- a/packages/client/dashboard/src/container/DappDataStatistic.tsx +++ b/packages/client/dashboard/src/container/DappDataStatistic.tsx @@ -1,17 +1,13 @@ -import { useLocation, useOutletContext } from 'react-router-dom' -import CompositeDefinition from '../components/model/CompositeDefinition' +import { useOutletContext } from 'react-router-dom' import Instance from '../components/model/ModelInstance' import useSelectedDapp from '../hooks/useSelectedDapp' -import { DappCompositeDto, ModelStream, Network } from '../types.d' +import { ModelStream, Network } from '../types.d' export default function DappDataStatistic() { - const { selectModel, selectComposite } = useOutletContext<{ + const { selectModel } = useOutletContext<{ selectModel: ModelStream - selectComposite: DappCompositeDto }>() const { selectedDapp } = useSelectedDapp() - const location = useLocation() - const isMetrics = location.pathname.endsWith('statistic') if (selectModel) { return ( @@ -25,12 +21,5 @@ export default function DappDataStatistic() {
) } - if (selectComposite && !isMetrics) { - return ( -
- -
- ) - } return null } diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappModelEditor.tsx index 0e9dbcfa..96ddb89d 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappModelEditor.tsx @@ -1,41 +1,127 @@ +import { AxiosError } from 'axios' +import { useCallback, useEffect, useState } from 'react' import { useOutletContext } from 'react-router-dom' import styled from 'styled-components' -import CompositeDefinition from '../components/model/CompositeDefinition' -import Definition from '../components/model/Definition' -import { DappCompositeDto, ModelStream } from '../types.d' +import { queryModelGraphql } from '../api/model' +import CompositeEditor from '../components/model/CompositeEditor' +import CompositePublish from '../components/model/CompositePublish' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { + DappCompositeDto, + ModeQueryResult, + ModelStream, + Network +} from '../types.d' +import { schemas } from '../utils/composedb-types/schemas' -export default function DappModelEditor() { +export default function DappModelEditor () { + const { selectedDapp } = useSelectedDapp() const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream selectComposite: DappCompositeDto }>() if (selectModel) { - const name = selectModel.stream_content.name - const modelId = selectModel.stream_id - return ( -
- -
- {name} + +
+ {selectModel.stream_content?.name}
- - -
+ + ) } if (selectComposite) { return ( -
- -
+ +
+ {selectComposite.name} + +
+ +
) } return null } -const EditorContainer = styled.div` +function ModelEditor ({ + streamId, + network +}: { + streamId: string + network: Network | undefined +}) { + const [modelData, setModelData] = useState() + const [gqlSchema, setGqlSchema] = useState(schemas.code) + const [errMsg, setErrMsg] = useState('') + const [loading, setLoading] = useState(false) + + const fetchModelGraphql = useCallback( + async (streamId: string, network: Network) => { + try { + setLoading(true) + setErrMsg('') + const resp = await queryModelGraphql( + streamId, + network || Network.TESTNET + ) + const { data } = resp.data + setModelData(data) + if (data.graphqlSchemaDefinition) { + setGqlSchema(data.graphqlSchemaDefinition) + } else { + setGqlSchema(schemas.code) + } + } catch (error) { + const err = error as AxiosError + setErrMsg((err.response?.data as any).message || err.message) + } finally { + setLoading(false) + } + }, + [] + ) + + useEffect(() => { + if (!streamId || !network) return + fetchModelGraphql(streamId, network) + }, [fetchModelGraphql, streamId, network]) + + if (loading) { + return ( +
+ Loading... +
+ ) + } + + if (errMsg) { + return ( +
+
+ {errMsg} +
+ ) + } + return ( + + ) +} + +const Loading = styled.div` + padding: 20px; + text-align: center; + color: gray; +` + +const Box = styled.div` display: flex; flex-direction: column; gap: 20px; diff --git a/packages/client/dashboard/src/hooks/useSelectedDapp.ts b/packages/client/dashboard/src/hooks/useSelectedDapp.ts index 30d2b4a7..dbd2df42 100644 --- a/packages/client/dashboard/src/hooks/useSelectedDapp.ts +++ b/packages/client/dashboard/src/hooks/useSelectedDapp.ts @@ -33,7 +33,6 @@ export default function useSelectedDapp() { appId, selectedDapp, selectDapps, - s3ModelCollection, } } diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index 29df55a4..c979d920 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -96,7 +96,7 @@ export type ClientDApp = { // modelId?: string icon?: string name: string - network: string + network: Network type?: string stage?: string url?: string From 89843a5b4598690022b0ea7ba5b2bde003acd5f2 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 26 Jan 2024 17:58:29 +0800 Subject: [PATCH 093/127] fix model playground structure --- .../model/CompositePlaygroundGraphiQL.tsx | 17 +- .../src/components/model/Playground.tsx | 195 ------------------ .../src/container/DappModelPlayground.tsx | 113 +++++++++- 3 files changed, 115 insertions(+), 210 deletions(-) delete mode 100644 packages/client/dashboard/src/components/model/Playground.tsx diff --git a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx index c427e690..6c401cc2 100644 --- a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx @@ -33,7 +33,7 @@ export type YogaGraphiQLProps = Omit< Partial> & { title?: string additionalHeaders?: LoadFromUrlOptions['headers'] - definition: string + definition: RuntimeCompositeDefinition ceramicNodeURL: string | undefined } @@ -67,18 +67,19 @@ export default function CompositePlaygroundGraphiQL( ): React.ReactElement { const { definition, ceramicNodeURL } = props - const updateQuery = useCallback(async () => { - const data = JSON.parse(definition) - if (!data) return - const modelName = Object.keys(data.models)[0] - const objValues: any[] = Object.values(data.objects) + const updateQuery = useCallback(async () => { + if (!definition) return + const modelName = Object.keys(definition.models)[0] + const objValues: any[] = Object.values(definition.objects) const modelProperties = Object.entries(objValues[0]) const defaultQuery = createGraphqlDefaultQuery(modelName, modelProperties) setQuery(initialQuery + defaultQuery) }, [definition]) - console.log('definition', definition, ceramicNodeURL) + + // console.log('definition', definition, ceramicNodeURL) + const { composeClient, composeClientAuthenticated } = - useComposeClient(JSON.parse(definition) as RuntimeCompositeDefinition, ceramicNodeURL) + useComposeClient(definition, ceramicNodeURL) useEffect(() => { localStorage.setItem('graphiql:theme', 'dark') diff --git a/packages/client/dashboard/src/components/model/Playground.tsx b/packages/client/dashboard/src/components/model/Playground.tsx deleted file mode 100644 index 5c0f4dda..00000000 --- a/packages/client/dashboard/src/components/model/Playground.tsx +++ /dev/null @@ -1,195 +0,0 @@ -import { RuntimeCompositeDefinition } from '@composedb/types' -import { useExplorerPlugin } from '@graphiql/plugin-explorer' -import { Fetcher, FetcherOpts, FetcherParams } from '@graphiql/toolkit' -import { LoadFromUrlOptions } from '@graphql-tools/url-loader' -import { AxiosError } from 'axios' -import { - GraphiQL, - GraphiQLInterface, - GraphiQLProps, - GraphiQLProvider, -} from 'graphiql' -import 'json-bigint-patch' -import React, { useCallback, useEffect, useMemo, useState } from 'react' -import styled from 'styled-components' -import { useUrlSearchParams } from 'use-url-search-params' -import { queryModelGraphql } from '../../api/model' -import { useComposeClient } from '../../hooks/useComposeClient' -import useSelectedDapp from '../../hooks/useSelectedDapp' -import { Network } from '../../types.d' -import { createGraphqlDefaultQuery } from '../../utils/createDefaultQuery' - -const type = { - query: String, -} - -export type YogaGraphiQLProps = Omit< - GraphiQLProps, - | 'fetcher' - | 'isHeadersEditorEnabled' - | 'defaultEditorToolsVisibility' - | 'onToggleDocs' - | 'toolbar' - | 'onSchemaChange' - | 'query' - | 'onEditQuery' -> & - Partial> & { - title?: string - additionalHeaders?: LoadFromUrlOptions['headers'] - streamId: string - ceramicNodeURL: string | undefined - } - -const initialQuery = /* GraphQL */ ` - # - # Welcome to S3 GraphiQL - # - - # An example GraphQL query might look like: - # - # { - # field(arg: "value") { - # subField - # } - # } - # - # Keyboard shortcuts: - # - # Prettify Query: Shift-Ctrl-P (or press the prettify button above) - # - # Merge Query: Shift-Ctrl-M (or press the merge button above) - # - # Run Query: Ctrl-Enter (or press the play button above) - # - # Auto Complete: Ctrl-Space (or just start typing) - # -` - -export default function PlaygroundGraphiQL( - props: YogaGraphiQLProps -): React.ReactElement { - const { streamId, ceramicNodeURL } = props - // const { network } = useCeramicCtx() - // const [modelData, setModelData] = useState(); - const { selectedDapp } = useSelectedDapp() - - const [definition, setDefinition] = useState() - - const [errMsg, setErrMsg] = useState('') - - const [loading, setLoading] = useState(false) - const fetchModelGraphql = useCallback(async () => { - if (!streamId || !selectedDapp) return - try { - setLoading(true) - const resp = await queryModelGraphql( - streamId, - selectedDapp.network as Network - ) - const { data } = resp.data - setDefinition(data.runtimeDefinition) - - const definition = data.runtimeDefinition as unknown as RuntimeCompositeDefinition - const modelName = Object.keys(definition.models)[0] - const objValues: any[] = Object.values(definition.objects) - const modelProperties = Object.entries(objValues[0]) - const defaultQuery = createGraphqlDefaultQuery(modelName, modelProperties) - setQuery(initialQuery + defaultQuery) - } catch (error) { - const err = error as AxiosError - setErrMsg((err.response?.data as any).message || err.message) - } finally { - setLoading(false) - } - }, [streamId, selectedDapp]) - - const { composeClient, composeClientAuthenticated } = - useComposeClient(definition, ceramicNodeURL) - - useEffect(() => { - localStorage.setItem('graphiql:theme', 'dark') - fetchModelGraphql() - }, [fetchModelGraphql]) - - const fetcher: Fetcher = useMemo(() => { - return function fetcher(graphQLParams: FetcherParams, opts?: FetcherOpts) { - return composeClient ? composeClient.executeQuery( - graphQLParams.query, - graphQLParams.variables - ) - : - Promise.reject('composeClient is NOT ready yet!') - } - }, [composeClient]) - - const [params, setParams] = useUrlSearchParams( - { - query: props.defaultQuery || initialQuery, - }, - type, - false - ) - - const [query, setQuery] = useState(params.query?.toString()) - const explorerPlugin = useExplorerPlugin({ - query: query as string, - onEdit: setQuery, - showAttribution: true, - }) - - if (loading) { - return Loading - } - - if (errMsg) { - return {errMsg} - } - - return ( - - - - setParams({ - query, - }) - } - > - -
- {composeClientAuthenticated &&
Writable
} -
-
-
-
-
- ) -} - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` - -const GraphiqlContainer = styled.div` - border-radius: 20px; - overflow: hidden; - height: calc(100vh - 200px); - > div { - height: 100%; - .graphiql-container { - height: 100%; - width: 100%; - } - } -` diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index fbce0d25..3c4d2c6b 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -1,8 +1,17 @@ +import { AxiosError } from 'axios' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useOutletContext } from 'react-router-dom' +import styled from 'styled-components' +import { queryModelGraphql } from '../api/model' import CompositePlaygroundGraphiQL from '../components/model/CompositePlaygroundGraphiQL' -import PlaygroundGraphiQL from '../components/model/Playground' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import { DappCompositeDto, ModelStream } from '../types.d' +import { + DappCompositeDto, + ModeQueryResult, + ModelStream, + Network +} from '../types.d' +import useSelectedDapp from '../hooks/useSelectedDapp' export default function DappModelPlayground () { const { selectModel, selectComposite } = useOutletContext<{ @@ -10,12 +19,14 @@ export default function DappModelPlayground () { selectComposite: DappCompositeDto }>() const { currCeramicNode } = useCeramicNodeCtx() + const { selectedDapp } = useSelectedDapp() if (selectModel) { return (
-
) @@ -23,12 +34,100 @@ export default function DappModelPlayground () { if (selectComposite) { return (
-
) } return null } + +function ModelPlayground ({ + streamId, + network, + ceramicNodeURL +}: { + streamId: string + network: Network | undefined + ceramicNodeURL: string | undefined +}) { + const [modelData, setModelData] = useState() + const [errMsg, setErrMsg] = useState('') + const [loading, setLoading] = useState(false) + + const fetchModelGraphql = useCallback( + async (streamId: string, network: Network) => { + try { + setLoading(true) + setErrMsg('') + const resp = await queryModelGraphql( + streamId, + network || Network.TESTNET + ) + console.log('data', resp) + setModelData(resp.data.data) + } catch (error) { + const err = error as AxiosError + setErrMsg((err.response?.data as any).message || err.message) + } finally { + setLoading(false) + } + }, + [] + ) + + useEffect(() => { + if (!streamId || !network) return + fetchModelGraphql(streamId, network) + }, [fetchModelGraphql, streamId, network]) + + if (loading) { + return ( +
+ Loading... +
+ ) + } + + if (errMsg) { + return ( +
+
+ {errMsg} +
+ ) + } + + if (modelData?.runtimeDefinition && ceramicNodeURL) + return ( + + ) + return null +} +const Loading = styled.div` + padding: 20px; + text-align: center; + color: gray; +` +function CompositePlayground ({ + composite, + ceramicNodeURL +}: { + composite: DappCompositeDto + ceramicNodeURL: string | undefined +}) { + const runtimeDefinition = useMemo(() => { + return JSON.parse(composite.runtimeDefinition) + }, [composite.id]) + return ( + + ) +} From 858e99066dc12988616a21890a12549409a2750c Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 26 Jan 2024 18:11:36 +0800 Subject: [PATCH 094/127] disable fav composite --- packages/client/dashboard/src/App.tsx | 28 +++++++++++++------ .../client/dashboard/src/api/composite.ts | 3 -- .../src/container/DappModelPlayground.tsx | 2 +- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index ee309d65..9f0e6413 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -1,5 +1,12 @@ import { useEffect, useState } from 'react' -import { NavLink, Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom' +import { + NavLink, + Outlet, + Route, + Routes, + useLocation, + useParams +} from 'react-router-dom' import styled from 'styled-components' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -141,7 +148,6 @@ function DappLayout () { ) } - const AppContainer = styled.div` display: flex; margin-top: 60px; @@ -228,6 +234,7 @@ const EditorLayoutContainer = styled.div` ` function ExploreLayout () { + const { pathname } = useLocation() return (
@@ -238,13 +245,16 @@ function ExploreLayout () {
)} - - {({ isActive }) => ( -
- Composites -
- )} -
+ + {!pathname.includes('favorite') && ( + + {({ isActive }) => ( +
+ Composites +
+ )} +
+ )}
diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index f50f4115..cf3e6c19 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -1,7 +1,4 @@ -import { Composite } from '@composedb/devtools' -import { RuntimeCompositeDefinition } from '@composedb/types' import axios, { AxiosPromise } from 'axios' -import { PassedSchema } from 'graphql-editor/lib/Models/Types' import { ApiResp } from '.' import { APP_API_URL } from '../constants' import { diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappModelPlayground.tsx index 3c4d2c6b..217fcb9a 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappModelPlayground.tsx @@ -123,7 +123,7 @@ function CompositePlayground ({ }) { const runtimeDefinition = useMemo(() => { return JSON.parse(composite.runtimeDefinition) - }, [composite.id]) + }, [composite.runtimeDefinition]) return ( Date: Mon, 29 Jan 2024 16:52:59 +0800 Subject: [PATCH 095/127] fix runtime def issue --- .../src/components/model/CompositeEditor.tsx | 57 +++++++++++-------- ...positeFromBrowser.ts => composeDBUtils.ts} | 25 ++++++++ 2 files changed, 57 insertions(+), 25 deletions(-) rename packages/client/dashboard/src/utils/{createCompositeFromBrowser.ts => composeDBUtils.ts} (84%) diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index 3cf93446..d3819063 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -1,38 +1,45 @@ -import { Composite } from '@composedb/devtools' +import { RuntimeCompositeDefinition } from '@composedb/types' import { GraphQLEditor, PassedSchema } from 'graphql-editor' -import { useEffect, useMemo, useState } from 'react' +import { useEffect, useState } from 'react' import styled from 'styled-components' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import { getRuntimeDefinitionFromEncodedComposite } from '../../utils/composeDBUtils' import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' -export default function CompositeEditor({ +export default function CompositeEditor ({ schema, - encodedDefinition, + encodedDefinition }: { schema?: string encodedDefinition: string }) { + const { currCeramicNode } = useCeramicNodeCtx() const [gqlSchema, setGqlSchema] = useState({ code: schema || '', - libraries: schemas.library, + libraries: schemas.library }) - const runtimeDefinition = useMemo(() => { - if (!encodedDefinition) { - return null - } - try { - const composite = Composite.from(JSON.parse(encodedDefinition)) - return composite.toRuntime() - } catch (error) { - return null - } - }, [encodedDefinition]) + const [runtimeDefinition, setRuntimeDefinition] = useState(null) + + useEffect(() => { + if (!encodedDefinition) return + if (!currCeramicNode?.serviceUrl) return + getRuntimeDefinitionFromEncodedComposite( + encodedDefinition, + currCeramicNode?.serviceUrl + ).then( + (result)=>{ + setRuntimeDefinition(result) + } + ) + }, [currCeramicNode?.serviceUrl, encodedDefinition]) + useEffect(() => { setGqlSchema({ code: schema || '', - libraries: schemas.library, + libraries: schemas.library }) }, [schema]) @@ -40,7 +47,7 @@ export default function CompositeEditor({ { + setSchema={props => { setGqlSchema(props) }} schema={gqlSchema} @@ -49,18 +56,18 @@ export default function CompositeEditor({ {encodedDefinition && ( )} {runtimeDefinition && ( )} diff --git a/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts b/packages/client/dashboard/src/utils/composeDBUtils.ts similarity index 84% rename from packages/client/dashboard/src/utils/createCompositeFromBrowser.ts rename to packages/client/dashboard/src/utils/composeDBUtils.ts index 42497db8..29b49e2b 100644 --- a/packages/client/dashboard/src/utils/createCompositeFromBrowser.ts +++ b/packages/client/dashboard/src/utils/composeDBUtils.ts @@ -108,4 +108,29 @@ export async function createCompositeFromBrowser( } return { composite: myComposite, runtimeDefinition: myRuntimeDefinition } +} + + +export async function getRuntimeDefinitionFromEncodedComposite( + encodedDefinition: string, + myCeramicNode: string = '', +) { + if (!encodedDefinition) { + return null + } + try { + const ceramic = new CeramicClient(myCeramicNode) + const composite = await Composite.fromJSON( + { + definition: JSON.parse(JSON.stringify(encodedDefinition)), + ceramic, + }) + // console.log('encoded definition: ', encodedDefinition) + // console.log('composite: ', composite) + // console.log('runtime definition:', composite.toRuntime()) + return composite.toRuntime() + } catch (error) { + console.log('get runtime error', error) + return null + } } \ No newline at end of file From ef6cf8b7f21a3c2db0a91a157af66138415260c1 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 17:08:32 +0800 Subject: [PATCH 096/127] start index while add composite --- .../client/dashboard/src/api/composite.ts | 2 +- packages/client/dashboard/src/api/model.ts | 19 +++++++++++++++++++ .../components/model/CreateCompositeModal.tsx | 11 +++++++++-- .../src/components/model/CreateNewModel.tsx | 2 +- .../src/container/DappModelEditor.tsx | 2 +- .../src/container/ExploreComposite.tsx | 19 ++++++++++++++++++- 6 files changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/client/dashboard/src/api/composite.ts b/packages/client/dashboard/src/api/composite.ts index cf3e6c19..77027bd2 100644 --- a/packages/client/dashboard/src/api/composite.ts +++ b/packages/client/dashboard/src/api/composite.ts @@ -102,7 +102,7 @@ export function getComposites({ pageSize?: number pageNumber?: number network?: Network - published?:boolean + published?: boolean }): AxiosPromise> { let host = APP_API_URL diff --git a/packages/client/dashboard/src/api/model.ts b/packages/client/dashboard/src/api/model.ts index 6153df3b..ed162f22 100644 --- a/packages/client/dashboard/src/api/model.ts +++ b/packages/client/dashboard/src/api/model.ts @@ -230,6 +230,25 @@ export function startIndexModel({ }) } +export function startIndexModels({ + modelIds, + network, + didSession, +}:{ + didSession: string, + modelIds: string[], + network: Network }) { + if (!modelIds || modelIds.length===0) return Promise.reject() + const resp = Promise.all(modelIds.map((modelId: string) => { + return startIndexModel({ + modelId, + network, + didSession + }) + })) + return resp +} + export function getStreamsCountWithModels({ network, modelStreamIds, diff --git a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx index 2b3e974e..cb035682 100644 --- a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx @@ -5,11 +5,11 @@ import { useCallback, useState } from 'react' import styled from 'styled-components' import { createDappComposites } from '../../api/composite' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { ModelStream } from '../../types.d' import { schemas } from '../../utils/composedb-types/schemas' import CloseIcon from '../icons/CloseIcon' -import { createCompositeFromBrowser } from '../../utils/createCompositeFromBrowser' +import { createCompositeFromBrowser } from '../../utils/composeDBUtils' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import { startIndexModels } from '../../api/model' export default function CreateCompositeModal ({ closeModal, @@ -65,6 +65,13 @@ export default function CreateCompositeModal ({ if (resp.data.code !== 0) { throw new Error(resp.data.msg) } + const modelIds = composite.modelIDs + await startIndexModels({ + modelIds, + network: selectedDapp.network, + didSession: session.serialize() + }).catch(console.error) + if (loadDappComposites) await loadDappComposites() closeModal() } catch (error) { diff --git a/packages/client/dashboard/src/components/model/CreateNewModel.tsx b/packages/client/dashboard/src/components/model/CreateNewModel.tsx index 5c8f2cae..0a534fae 100644 --- a/packages/client/dashboard/src/components/model/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewModel.tsx @@ -8,7 +8,7 @@ import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useSelectedDapp from '../../hooks/useSelectedDapp' import { schemas } from '../../utils/composedb-types/schemas' -import { createCompositeFromBrowser } from '../../utils/createCompositeFromBrowser' +import { createCompositeFromBrowser } from '../../utils/composeDBUtils' import CloseIcon from '../icons/CloseIcon' import { createDappModels } from '../../api/model' diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappModelEditor.tsx index 96ddb89d..36e37957 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappModelEditor.tsx @@ -40,7 +40,7 @@ export default function DappModelEditor () {
) diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx index 277fb21a..768100b1 100644 --- a/packages/client/dashboard/src/container/ExploreComposite.tsx +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -29,6 +29,7 @@ import { bindingDappComposites, getComposites } from '../api/composite' import { Dapps } from './ExploreModel' import CreateCompositeModal from '../components/model/CreateCompositeModal' import LayoutIcon from '../components/icons/LayoutIcon' +import { startIndexModels } from '../api/model' export default function ExploreComposite () { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -274,7 +275,23 @@ function Actions ({ compositeId: composite.id, dapp: selectedDapp, did: session.serialize() - }).catch(console.error) + }) + .then( + () => { + const models = JSON.parse(composite.composite).models + console.log(Object.keys(models)) + const modelIds = Object.keys(models) + startIndexModels({ + modelIds, + network: selectedDapp.network, + didSession: session.serialize() + }).catch(console.error) + }, + err => { + console.error(err) + } + ) + .catch(console.error) } try { setAdding(true) From 71e9683fd6de0b3d746e3508a45452f4534fd0db Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 17:19:02 +0800 Subject: [PATCH 097/127] fix json format issue --- .../client/dashboard/src/components/model/CompositeEditor.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index d3819063..96ca07ab 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -59,7 +59,7 @@ export default function CompositeEditor ({ title='Composite Encoded Definition' downloadContent={JSON.stringify(encodedDefinition)} downloadFileName='composite.json' - content={JSON.stringify(encodedDefinition)} + content={JSON.stringify(encodedDefinition,null,2)} /> )} {runtimeDefinition && ( @@ -68,7 +68,7 @@ export default function CompositeEditor ({ downloadContent={`// This is an auto-generated file, do not edit manually export const definition = ${JSON.stringify(runtimeDefinition)}`} downloadFileName='runtime-composite.js' - content={JSON.stringify(runtimeDefinition)} + content={JSON.stringify(runtimeDefinition,null,2)} /> )} From 0ce70c1b5efb46478bf68ec88064606a264ac781 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 17:20:45 +0800 Subject: [PATCH 098/127] fix json format issue --- .../client/dashboard/src/components/model/CompositeEditor.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index 96ca07ab..77c68cac 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -113,8 +113,8 @@ const EditorBox = styled.div` ` const ResultBox = styled.div` - display: grid; - grid-template-columns: 1fr 1fr; + display: flex; + flex-direction: column; gap: 20px; margin-top: 20px; > div { From 5c6e2129207feda00bae216445cd3c4f17e8d2b0 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 18:04:05 +0800 Subject: [PATCH 099/127] rename dapp models and composites component --- packages/client/dashboard/src/App.tsx | 4 +- .../src/components/model/ModelList.tsx | 653 ------------------ 2 files changed, 2 insertions(+), 655 deletions(-) delete mode 100644 packages/client/dashboard/src/components/model/ModelList.tsx diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 9f0e6413..d4cf6f9e 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -36,7 +36,7 @@ import NoMatch from './container/NoMatch' import Header from './components/nav/Header' import Nav from './components/nav/Nav' -import ModelList from './components/model/ModelList' +import DappModelAndComposites from './components/model/DappModelAndComposites' import ExploreComposite from './container/ExploreComposite' dayjs.extend(relativeTime) @@ -182,7 +182,7 @@ function ModelEditorLayout () { return ( - { setSelectModel(data) diff --git a/packages/client/dashboard/src/components/model/ModelList.tsx b/packages/client/dashboard/src/components/model/ModelList.tsx deleted file mode 100644 index 51920b32..00000000 --- a/packages/client/dashboard/src/components/model/ModelList.tsx +++ /dev/null @@ -1,653 +0,0 @@ -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { - Button, - Dialog, - DialogTrigger, - Menu, - MenuItem, - MenuTrigger, - Modal, - ModalOverlay, - Popover -} from 'react-aria-components' -import { useLocation, useNavigate } from 'react-router-dom' -import styled from 'styled-components' -import { deleteDappComposites, getDappComposites } from '../../api/composite' -import { updateDapp } from '../../api/dapp' -import { getDappModels, getModelsInfoByIds } from '../../api/model' -import { useAppCtx } from '../../context/AppCtx' -import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' -import useIsOwner from '../../hooks/useIsOwner' -import useSelectedDapp from '../../hooks/useSelectedDapp' -import { - CeramicStatus, - DappCompositeDto, - ModelStream, - Network -} from '../../types.d' -import { shortPubKey } from '../../utils/shortPubKey' -import CopyTint from '../common/CopyTint' -import MergeIcon from '../icons/MergeIcon' -import PlusIcon from '../icons/PlusIcon' -import TrashIcon from '../icons/TrashIcon' -import NoCeramicNodeModal from '../node/NoCeramicNodeModal' -import CreateCompositeModal from './CreateCompositeModal' -import CreateNewModel from './CreateNewModel' -import FavoriteModel from './FavoriteModal' -import MergeModal from './MergeModal' -import { getCompositeDefaultSchema } from '../../utils/composedb-types/schemas' - -enum OPEN_MODAL { - NONE, - CREATE_NEW_MODEL, - ADD_FROM_ALL_MODELS, - ADD_FROM_FAVORITE_MODELS, - CREATE_NEW_COMPOSITE, - ADD_FROM_ALL_COMPOSITES, - ADD_FROM_FAVORITE_COMPOSITES -} - -export default function ModelList ({ - editable, - selectComposite, - setSelectComposite, - selectModel, - setSelectModel -}: { - selectModel: ModelStream | undefined - setSelectModel: (m: ModelStream | undefined) => void - selectComposite: DappCompositeDto | undefined - setSelectComposite: (composite: DappCompositeDto | undefined) => void - - editable?: boolean -}) { - const session = useSession() - const { loadDapps, currDapp } = useAppCtx() - const { appId, selectedDapp } = useSelectedDapp() - const { currCeramicNode } = useCeramicNodeCtx() - const navigate = useNavigate() - const [loading, setLoading] = useState(false) - const [dappModels, setDappModels] = useState() - const [dappComposites, setDappComposites] = useState([]) - const location = useLocation() - - const dapp = useMemo(() => { - return selectedDapp || currDapp - }, [selectedDapp, currDapp]) - - const { isOwner } = useIsOwner() - - const loadModelsInfo = useCallback(async () => { - if (dapp?.models?.length === 0 || !dapp) { - setDappModels([]) - return - } - - try { - const resp = await getModelsInfoByIds({ - network: dapp.network as Network, - ids: dapp.models || [] - }) - - const list = resp.data.data - setDappModels(list) - if (list.length > 0) { - setSelectModel(list[0]) - } - } catch (error) { - console.error(error) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dapp]) - - // const loadDappModels = useCallback(async () => { - // if (!dapp) return - // try { - // const resp = await getDappModels({ - // dapp - // }) - // if (resp.data.code !== 0) throw new Error(resp.data.msg) - // setDappModels(resp.data.data) - // } catch (error) { - // console.error(error) - // } - // }, [dapp]) - - const loadDappComposites = useCallback(async () => { - if (!dapp) return - try { - const resp = await getDappComposites({ - dapp - }) - if (resp.data.code !== 0) throw new Error(resp.data.msg) - setDappComposites(resp.data.data) - } catch (error) { - console.error(error) - } - }, [dapp]) - - const removeModelFromDapp = useCallback( - async (modelId: string) => { - if (!session) return - if (!selectedDapp) return - - try { - const newModels = - selectedDapp?.models?.filter(id => id !== modelId) || [] - - await updateDapp( - { ...selectedDapp, models: newModels }, - session.serialize() - ) - await loadDapps() - setSelectModel(undefined) - } catch (error) { - console.error(error) - } - }, - [loadDapps, selectedDapp, session, setSelectModel] - ) - - const delDappComposite = useCallback( - async (id: number) => { - if (!session) return - if (!selectedDapp) return - try { - await deleteDappComposites({ - compositeId: id, - did: session.serialize(), - dapp: selectedDapp - }) - await loadDappComposites() - setSelectComposite(undefined) - } catch (error) { - console.error(error) - } - }, - [session, selectedDapp, loadDappComposites, setSelectComposite] - ) - - const isFirstRenderRef = useRef(true) - const [mounted, setMounted] = useState(false) - - useEffect(() => { - setMounted(true) - }, []) - - useEffect(() => { - if (!mounted) return - if (isFirstRenderRef.current) { - isFirstRenderRef.current = false - setLoading(true) - } - - Promise.all([loadDappComposites(), loadModelsInfo()]).finally(() => - setLoading(false) - ) - }, [loadModelsInfo, loadDappComposites, mounted]) - - useEffect(() => { - setSelectModel(undefined) - setDappModels(undefined) - setSelectComposite(undefined) - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [appId]) - - const isMetrics = location.pathname.endsWith('statistic') - const isSdk = location.pathname.endsWith('sdk') - - const [openModal, setOpenModal] = useState(OPEN_MODAL.NONE) - if (loading) { - return ( - -
- -
-
- ) - } - - return ( - -
-

Models

- {editable && - isOwner && - (!currCeramicNode || - currCeramicNode.status !== CeramicStatus.RUNNING ? ( - - - - - - {({ close }) => } - - - - - ) : ( - - - - { - if (id === 'explore') { - navigate(`/dapp/${appId}/explore/model`) - return - } - if (id === 'favorite') { - setOpenModal(OPEN_MODAL.ADD_FROM_FAVORITE_MODELS) - return - } - if (id === 'create') { - setOpenModal(OPEN_MODAL.CREATE_NEW_MODEL) - return - } - }} - > - Explore Models - Add From Favorite - Create New Model - - - - ))} -
- - { - setSelectModel(model) - }} - removeModelAction={async (id: string) => { - await removeModelFromDapp(id) - if (id === selectModel?.stream_id) { - setSelectModel(undefined) - setDappModels(undefined) - setSelectModel(undefined) - } - }} - /> - - {!(isMetrics || isSdk) && ( - <> -
-

Composites

- {editable && - isOwner && - (!currCeramicNode || - currCeramicNode.status !== CeramicStatus.RUNNING ? ( - - - - - - {({ close }) => ( - - )} - - - - - ) : ( - - - - { - if (id === 'explore') { - navigate(`/dapp/${appId}/explore/composite`) - return - } - if (id === 'create') { - setOpenModal(OPEN_MODAL.CREATE_NEW_COMPOSITE) - return - } - }} - > - Explore Composites - Create New Composites - - - - ))} -
- - - - )} - setOpenModal(OPEN_MODAL.NONE)} - > - {({ close }) => } - - setOpenModal(OPEN_MODAL.NONE)} - > - - {({ close }) => ( - - )} - - - setOpenModal(OPEN_MODAL.NONE)} - > - {({ close }) => } - - {editable && isOwner && ( - - - - - - - {({ close }) => ( - - )} - - - - - - )} -
- ) -} - -function DappCompositeList ({ - composites, - removeAction, - editable, - selectComposite, - setSelectedComposite -}: { - composites: DappCompositeDto[] - selectComposite: DappCompositeDto | undefined - setSelectedComposite: (composite: DappCompositeDto) => void - removeAction: (id: number) => Promise - editable?: boolean -}) { - if (composites.length === 0) { - return ( - -

This Dapp has no composites available yet.

-
- ) - } - return ( - - {composites?.map(item => { - const active = selectComposite?.id === item.id - return ( -
-
{ - setSelectedComposite(item) - }} - > -
{item.name}
- {editable && ( - { - await removeAction(item.id) - }} - id={item.id + ''} - /> - )} -
-
- ) - })} -
- ) -} - -function DappModelList ({ - selected, - setSelected, - dappModels, - selectAction, - removeModelAction, - editable -}: { - selected?: ModelStream - setSelected: (ms: ModelStream) => void - dappModels: ModelStream[] - selectAction: (model: ModelStream) => void - removeModelAction: (modelId: string) => Promise - editable?: boolean -}) { - if (dappModels.length === 0) { - return ( - -

There is no model in this dapp.

-
- ) - } - return ( - - {dappModels?.map(item => { - const active = selected?.stream_id === item.stream_id - return ( -
-
{ - selectAction(item) - setSelected(item) - }} - > -
{item.stream_content.name}
- {editable && ( - - )} -
- {active && ( - <> -
-
-

ID: {shortPubKey(selected.stream_id, { len: 7 })}

-
- -
-
-

{selected.stream_content.description}

-

- Streams: {selected.useCount} -

- - )} -
- ) - })} -
- ) -} - -function RemoveButton ({ - id, - removeAction -}: { - id: string - removeAction: (id: string) => Promise -}) { - const [removing, setRemoving] = useState(false) - if (removing) { - return ( -
- {' '} -
- ) - } - return ( - - ) -} - -const ListBox = styled.div` - background: #1b1e23; - border: 1px solid #39424c; - border-radius: 20px; - padding: 20px; - display: flex; - flex-direction: column; - align-items: flex-start; - padding: 20px; - gap: 20px; - width: 261px; - min-width: 261px; - box-sizing: border-box; - height: fit-content; - > div { - width: 100%; - } - .title { - height: 42px; - display: flex; - align-items: center; - justify-content: space-between; - > h3 { - font-style: italic; - font-weight: 700; - font-size: 20px; - line-height: 24px; - margin: 0; - color: #ffffff; - } - } - .loading { - width: 100%; - text-align: center; - } -` - -const DappModelsListBox = styled.div` - display: flex; - flex-direction: column; - gap: 20px; - overflow: scroll; - > div { - padding: 10px 16px; - box-sizing: border-box; - border: 1px solid #39424c; - border-radius: 12px; - cursor: pointer; - } - - div.title { - > div { - cursor: pointer; - max-width: 80%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; - } - - div.active { - background: rgba(113, 128, 150, 0.3); - border: 1px solid #718096; - border-radius: 12px; - - .id-copy { - display: flex; - align-items: center; - justify-content: space-between; - - > p { - margin: 0; - } - } - } - - hr { - border-color: rgba(255, 255, 255, 0.2); - margin-top: 10px; - } - - p { - color: #718096; - > span { - color: #ffffff; - font-size: 16px; - font-family: Rubik; - font-style: normal; - font-weight: 500; - line-height: normal; - } - } - - .removing { - > img { - width: 20px; - } - } -` - -const MergeBox = styled.div` - .merge-btn { - width: 100%; - background: #718096; - color: #ffffff; - padding: 12px 24px; - border-radius: 12px; - font-weight: 700; - font-size: 16px; - - display: flex; - align-items: center; - justify-content: center; - gap: 10px; - } -` From a4ba42042bed1b9ba88d247267d20a10ab8c9bf9 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 18:04:17 +0800 Subject: [PATCH 100/127] rename dapp models and composites component --- .../model/DappModelAndComposites.tsx | 653 ++++++++++++++++++ 1 file changed, 653 insertions(+) create mode 100644 packages/client/dashboard/src/components/model/DappModelAndComposites.tsx diff --git a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx new file mode 100644 index 00000000..b5d4b8ef --- /dev/null +++ b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx @@ -0,0 +1,653 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { + Button, + Dialog, + DialogTrigger, + Menu, + MenuItem, + MenuTrigger, + Modal, + ModalOverlay, + Popover +} from 'react-aria-components' +import { useLocation, useNavigate } from 'react-router-dom' +import styled from 'styled-components' +import { deleteDappComposites, getDappComposites } from '../../api/composite' +import { updateDapp } from '../../api/dapp' +import { getModelsInfoByIds } from '../../api/model' +import { useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useIsOwner from '../../hooks/useIsOwner' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { + CeramicStatus, + DappCompositeDto, + ModelStream, + Network +} from '../../types' +import { getCompositeDefaultSchema } from '../../utils/composedb-types/schemas' +import { shortPubKey } from '../../utils/shortPubKey' +import CopyTint from '../common/CopyTint' +import MergeIcon from '../icons/MergeIcon' +import PlusIcon from '../icons/PlusIcon' +import TrashIcon from '../icons/TrashIcon' +import NoCeramicNodeModal from '../node/NoCeramicNodeModal' +import CreateCompositeModal from './CreateCompositeModal' +import CreateNewModel from './CreateNewModel' +import FavoriteModel from './FavoriteModal' +import MergeModal from './MergeModal' + +enum OPEN_MODAL { + NONE, + CREATE_NEW_MODEL, + ADD_FROM_ALL_MODELS, + ADD_FROM_FAVORITE_MODELS, + CREATE_NEW_COMPOSITE, + ADD_FROM_ALL_COMPOSITES, + ADD_FROM_FAVORITE_COMPOSITES +} + +export default function DappModelAndComposites ({ + editable, + selectComposite, + setSelectComposite, + selectModel, + setSelectModel +}: { + selectModel: ModelStream | undefined + setSelectModel: (m: ModelStream | undefined) => void + selectComposite: DappCompositeDto | undefined + setSelectComposite: (composite: DappCompositeDto | undefined) => void + + editable?: boolean +}) { + const session = useSession() + const { loadDapps, currDapp } = useAppCtx() + const { appId, selectedDapp } = useSelectedDapp() + const { currCeramicNode } = useCeramicNodeCtx() + const navigate = useNavigate() + const [loading, setLoading] = useState(false) + const [dappModels, setDappModels] = useState() + const [dappComposites, setDappComposites] = useState([]) + const location = useLocation() + + const dapp = useMemo(() => { + return selectedDapp || currDapp + }, [selectedDapp, currDapp]) + + const { isOwner } = useIsOwner() + + const loadModelsInfo = useCallback(async () => { + if (dapp?.models?.length === 0 || !dapp) { + setDappModels([]) + return + } + + try { + const resp = await getModelsInfoByIds({ + network: dapp.network as Network, + ids: dapp.models || [] + }) + + const list = resp.data.data + setDappModels(list) + if (list.length > 0) { + setSelectModel(list[0]) + } + } catch (error) { + console.error(error) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [dapp]) + + // const loadDappModels = useCallback(async () => { + // if (!dapp) return + // try { + // const resp = await getDappModels({ + // dapp + // }) + // if (resp.data.code !== 0) throw new Error(resp.data.msg) + // setDappModels(resp.data.data) + // } catch (error) { + // console.error(error) + // } + // }, [dapp]) + + const loadDappComposites = useCallback(async () => { + if (!dapp) return + try { + const resp = await getDappComposites({ + dapp + }) + if (resp.data.code !== 0) throw new Error(resp.data.msg) + setDappComposites(resp.data.data) + } catch (error) { + console.error(error) + } + }, [dapp]) + + const removeModelFromDapp = useCallback( + async (modelId: string) => { + if (!session) return + if (!selectedDapp) return + + try { + const newModels = + selectedDapp?.models?.filter(id => id !== modelId) || [] + + await updateDapp( + { ...selectedDapp, models: newModels }, + session.serialize() + ) + await loadDapps() + setSelectModel(undefined) + } catch (error) { + console.error(error) + } + }, + [loadDapps, selectedDapp, session, setSelectModel] + ) + + const delDappComposite = useCallback( + async (id: number) => { + if (!session) return + if (!selectedDapp) return + try { + await deleteDappComposites({ + compositeId: id, + did: session.serialize(), + dapp: selectedDapp + }) + await loadDappComposites() + setSelectComposite(undefined) + } catch (error) { + console.error(error) + } + }, + [session, selectedDapp, loadDappComposites, setSelectComposite] + ) + + const isFirstRenderRef = useRef(true) + const [mounted, setMounted] = useState(false) + + useEffect(() => { + setMounted(true) + }, []) + + useEffect(() => { + if (!mounted) return + if (isFirstRenderRef.current) { + isFirstRenderRef.current = false + setLoading(true) + } + + Promise.all([loadDappComposites(), loadModelsInfo()]).finally(() => + setLoading(false) + ) + }, [loadModelsInfo, loadDappComposites, mounted]) + + useEffect(() => { + setSelectModel(undefined) + setDappModels(undefined) + setSelectComposite(undefined) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [appId]) + + const isMetrics = location.pathname.endsWith('statistic') + const isSdk = location.pathname.endsWith('sdk') + + const [openModal, setOpenModal] = useState(OPEN_MODAL.NONE) + if (loading) { + return ( + +
+ +
+
+ ) + } + + return ( + +
+

Models

+ {editable && + isOwner && + (!currCeramicNode || + currCeramicNode.status !== CeramicStatus.RUNNING ? ( + + + + + + {({ close }) => } + + + + + ) : ( + + + + { + if (id === 'explore') { + navigate(`/dapp/${appId}/explore/model`) + return + } + if (id === 'favorite') { + setOpenModal(OPEN_MODAL.ADD_FROM_FAVORITE_MODELS) + return + } + if (id === 'create') { + setOpenModal(OPEN_MODAL.CREATE_NEW_MODEL) + return + } + }} + > + Explore Models + Add From Favorite + Create New Model + + + + ))} +
+ + { + setSelectModel(model) + }} + removeModelAction={async (id: string) => { + await removeModelFromDapp(id) + if (id === selectModel?.stream_id) { + setSelectModel(undefined) + setDappModels(undefined) + setSelectModel(undefined) + } + }} + /> + + {!(isMetrics || isSdk) && ( + <> +
+

Composites

+ {editable && + isOwner && + (!currCeramicNode || + currCeramicNode.status !== CeramicStatus.RUNNING ? ( + + + + + + {({ close }) => ( + + )} + + + + + ) : ( + + + + { + if (id === 'explore') { + navigate(`/dapp/${appId}/explore/composite`) + return + } + if (id === 'create') { + setOpenModal(OPEN_MODAL.CREATE_NEW_COMPOSITE) + return + } + }} + > + Explore Composites + Create New Composites + + + + ))} +
+ + + + )} + setOpenModal(OPEN_MODAL.NONE)} + > + {({ close }) => } + + setOpenModal(OPEN_MODAL.NONE)} + > + + {({ close }) => ( + + )} + + + setOpenModal(OPEN_MODAL.NONE)} + > + {({ close }) => } + + {editable && isOwner && ( + + + + + + + {({ close }) => ( + + )} + + + + + + )} +
+ ) +} + +function DappCompositeList ({ + composites, + removeAction, + editable, + selectComposite, + setSelectedComposite +}: { + composites: DappCompositeDto[] + selectComposite: DappCompositeDto | undefined + setSelectedComposite: (composite: DappCompositeDto) => void + removeAction: (id: number) => Promise + editable?: boolean +}) { + if (composites.length === 0) { + return ( + +

This Dapp has no composites available yet.

+
+ ) + } + return ( + + {composites?.map(item => { + const active = selectComposite?.id === item.id + return ( +
+
{ + setSelectedComposite(item) + }} + > +
{item.name}
+ {editable && ( + { + await removeAction(item.id) + }} + id={item.id + ''} + /> + )} +
+
+ ) + })} +
+ ) +} + +function DappModelList ({ + selected, + setSelected, + dappModels, + selectAction, + removeModelAction, + editable +}: { + selected?: ModelStream + setSelected: (ms: ModelStream) => void + dappModels: ModelStream[] + selectAction: (model: ModelStream) => void + removeModelAction: (modelId: string) => Promise + editable?: boolean +}) { + if (dappModels.length === 0) { + return ( + +

There is no model in this dapp.

+
+ ) + } + return ( + + {dappModels?.map(item => { + const active = selected?.stream_id === item.stream_id + return ( +
+
{ + selectAction(item) + setSelected(item) + }} + > +
{item.stream_content.name}
+ {editable && ( + + )} +
+ {active && ( + <> +
+
+

ID: {shortPubKey(selected.stream_id, { len: 7 })}

+
+ +
+
+

{selected.stream_content.description}

+

+ Streams: {selected.useCount} +

+ + )} +
+ ) + })} +
+ ) +} + +function RemoveButton ({ + id, + removeAction +}: { + id: string + removeAction: (id: string) => Promise +}) { + const [removing, setRemoving] = useState(false) + if (removing) { + return ( +
+ {' '} +
+ ) + } + return ( + + ) +} + +const Box = styled.div` + background: #1b1e23; + border: 1px solid #39424c; + border-radius: 20px; + padding: 20px; + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 20px; + gap: 20px; + width: 261px; + min-width: 261px; + box-sizing: border-box; + height: fit-content; + > div { + width: 100%; + } + .title { + height: 42px; + display: flex; + align-items: center; + justify-content: space-between; + > h3 { + font-style: italic; + font-weight: 700; + font-size: 20px; + line-height: 24px; + margin: 0; + color: #ffffff; + } + } + .loading { + width: 100%; + text-align: center; + } +` + +const DappModelsListBox = styled.div` + display: flex; + flex-direction: column; + gap: 20px; + overflow: scroll; + > div { + padding: 10px 16px; + box-sizing: border-box; + border: 1px solid #39424c; + border-radius: 12px; + cursor: pointer; + } + + div.title { + > div { + cursor: pointer; + max-width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + } + + div.active { + background: rgba(113, 128, 150, 0.3); + border: 1px solid #718096; + border-radius: 12px; + + .id-copy { + display: flex; + align-items: center; + justify-content: space-between; + + > p { + margin: 0; + } + } + } + + hr { + border-color: rgba(255, 255, 255, 0.2); + margin-top: 10px; + } + + p { + color: #718096; + > span { + color: #ffffff; + font-size: 16px; + font-family: Rubik; + font-style: normal; + font-weight: 500; + line-height: normal; + } + } + + .removing { + > img { + width: 20px; + } + } +` + +const MergeBox = styled.div` + .merge-btn { + width: 100%; + background: #718096; + color: #ffffff; + padding: 12px 24px; + border-radius: 12px; + font-weight: 700; + font-size: 16px; + + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + } +` From 85b3db7590b15ce0c6d53c75e95eb4bbd0c8f3da Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 18:41:52 +0800 Subject: [PATCH 101/127] extract explore model list component --- .../model/DappModelAndComposites.tsx | 2 +- .../src/components/model/ExploreModelList.tsx | 523 +++++++++++++++++ .../src/components/model/FavoriteModal.tsx | 260 +-------- .../dashboard/src/components/nav/Nav.tsx | 2 +- .../src/container/ExploreComposite.tsx | 2 +- .../dashboard/src/container/ExploreModel.tsx | 526 +----------------- 6 files changed, 537 insertions(+), 778 deletions(-) create mode 100644 packages/client/dashboard/src/components/model/ExploreModelList.tsx diff --git a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx index b5d4b8ef..208f115b 100644 --- a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx +++ b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx @@ -25,7 +25,7 @@ import { DappCompositeDto, ModelStream, Network -} from '../../types' +} from '../../types.d' import { getCompositeDefaultSchema } from '../../utils/composedb-types/schemas' import { shortPubKey } from '../../utils/shortPubKey' import CopyTint from '../common/CopyTint' diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx new file mode 100644 index 00000000..a5ad9fef --- /dev/null +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -0,0 +1,523 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import dayjs from 'dayjs' +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' +import InfiniteScroll from 'react-infinite-scroll-component' +import styled from 'styled-components' +import { updateDapp } from '../../api/dapp' +import { PAGE_SIZE } from '../../constants' +import { + getModelStreamList, + getModelsInfoByIds, + startIndexModel +} from '../../api/model' +import { ImgOrName } from '../../components/common/ImgOrName' +import { TableBox, TableContainer } from '../../components/common/TableBox' +import CheckCircleIcon from '../../components/icons/CheckCircleIcon' +import PlusCircleIcon from '../../components/icons/PlusCircleIcon' +import StarGoldIcon from '../../components/icons/StarGoldIcon' +import StarIcon from '../../components/icons/StarIcon' +import NoCeramicNodeModal from '../../components/node/NoCeramicNodeModal' +import { S3_SCAN_URL } from '../../constants' +import { PersonalCollection, useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { CeramicStatus, ClientDApp, ModelStream, Network } from '../../types.d' +import { shortPubKey } from '../../utils/shortPubKey' + +export default function ModelList ({ + searchText, + filterStar +}: { + searchText?: string + filterStar?: boolean +}) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { s3ModelCollection, selectedDapp } = useSelectedDapp() + const { currCeramicNode } = useCeramicNodeCtx() + const session = useSession() + const [models, setModels] = useState>([]) + const [starModels, setStarModels] = useState>([]) + const [hasMore, setHasMore] = useState(true) + const pageNum = useRef(1) + const [personalCollections, setPersonalCollections] = useState< + PersonalCollection[] + >([]) + const fetchPersonalCollections = useCallback(async () => { + if (!session) return + s3ModelCollection.authComposeClient(session) + try { + const personal = await s3ModelCollection.queryPersonalCollections({ + first: 500 + }) + if (personal.errors) throw new Error(personal.errors[0].message) + const collected = personal.data?.viewer.modelCollectionList + + if (collected) { + setPersonalCollections( + collected?.edges + .filter(item => item.node && item.node.revoke === false) + .map(item => { + return { + modelId: item.node.modelID, + id: item.node.id!, + revoke: !!item.node.revoke + } + }) + ) + } + } catch (error) { + console.error('error -----', error) + } + }, [s3ModelCollection, session]) + + const fetchStarModels = useCallback(async () => { + const ids = personalCollections + .filter(item => item.revoke === false) + .map(item => { + return item.modelId + }) + if (ids.length === 0) { + setStarModels([]) + return + } + + try { + const resp = await getModelsInfoByIds({ + network: (selectedDapp?.network as Network) || Network.TESTNET, + ids + }) + if (resp.data.code !== 0) { + throw new Error(resp.data.msg) + } + + const list = resp.data.data + setStarModels([...list]) + } catch (error) { + console.error(error) + } + }, [personalCollections, selectedDapp?.network]) + + const fetchModel = useCallback(async () => { + setModels([]) + setHasMore(true) + const resp = await getModelStreamList({ + name: searchText, + network: (selectedDapp?.network as Network) || Network.TESTNET + }) + const list = resp.data.data + setModels(list) + setHasMore(list.length >= PAGE_SIZE) + pageNum.current = 1 + }, [selectedDapp?.network]) + + const fetchMoreModel = useCallback( + async (pageNumber: number) => { + const resp = await getModelStreamList({ + pageNumber + }) + const list = resp.data.data + setHasMore(list.length >= PAGE_SIZE) + setModels([...models, ...list]) + }, + [models] + ) + + useEffect(() => { + fetchModel() + fetchPersonalCollections() + }, [fetchModel, fetchPersonalCollections]) + + useEffect(() => { + fetchStarModels().catch(err => { + setStarModels([]) + console.error(err) + }) + }, [fetchStarModels]) + + const lists = useMemo(() => { + if (!filterStar) return models + return starModels + }, [filterStar, models, starModels]) + + return ( + <> + { + pageNum.current += 1 + fetchMoreModel(pageNum.current) + console.log('fetch more') + }} + hasMore={filterStar ? false : hasMore} + loader={Loading...} + > + + + + + Model Name + Description + ID + Usage Count + 7 Days Usage + Release Date + Dapps + + + + + + {lists.map((item, idx) => { + const hasStarItem = personalCollections.find( + starItem => starItem.modelId === item.stream_id + ) + return ( + + + + + +
{item.stream_content.description}
+ + + + + + + + {item.recentlyUseCount || '-'} + +
+ {(item.last_anchored_at && + dayjs(item.created_at).format( + 'YYYY-MM-DD HH:mm:ss' + )) || + '-'} +
+ + + + + + {/* */} + + + + ) + })} + +
+
+
+ {!filterStar && !hasMore && no more data} + + ) +} + +export function Dapps ({ dapps }: { dapps: ClientDApp[] }) { + const apps = useMemo(() => { + const data = [...dapps] + if (data.length > 3) + return { data: data.slice(0, 3), left: data.length - 3 } + return { data, left: 0 } + }, [dapps]) + + return ( + + {apps.data.length > 0 + ? apps.data.map((item, idx) => { + return ( + + + + ) + }) + : 'None'} + {apps.left > 0 && {apps.left}+} + + ) +} + +const DappBox = styled.div` + display: flex; + gap: 5px; + overflow: hidden; + color: #fff; + font-family: Rubik; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: normal; + a { + > span { + color: #fff; + width: 36px; + height: 36px; + border-radius: 10px; + border: 1px solid #718096; + display: inline-flex; + align-items: center; + justify-content: center; + overflow: hidden; + &.name { + font-size: 20px; + font-weight: 500; + } + &.left { + border: none; + color: #fff; + justify-content: start; + font-family: Rubik; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: normal; + } + > img { + width: 100%; + height: 100%; + object-fit: cover; + flex-shrink: 0; + } + } + } +` + +function Actions ({ + hasStarItem, + fetchPersonal, + stream_id, + hasIndexed, + ceramicNodeId +}: { + hasIndexed: boolean + stream_id: string + hasStarItem: + | { + modelId: string + id: string + revoke: boolean + } + | undefined + fetchPersonal: () => void + ceramicNodeId?: number +}) { + const session = useSession() + const { s3ModelCollection } = useSelectedDapp() + const [staring, setStaring] = useState(false) + + const { loadDapps } = useAppCtx() + const { selectedDapp } = useSelectedDapp() + const [adding, setAdding] = useState(false) + const addModelToDapp = useCallback( + async (modelId: string) => { + if (!session || !selectedDapp) return + if (!ceramicNodeId) return + if (!hasIndexed) { + startIndexModel({ + modelId, + network: selectedDapp.network as Network, + didSession: session.serialize() + }).catch(console.error) + } + try { + setAdding(true) + const models = selectedDapp.models || [] + models.push(modelId) + await updateDapp( + { ...selectedDapp, models }, + session.serialize(), + ceramicNodeId + ) + await loadDapps() + } catch (err) { + console.error(err) + } finally { + setAdding(false) + } + }, + [loadDapps, selectedDapp, session, setAdding, hasIndexed, ceramicNodeId] + ) + + const collectModel = useCallback( + async (modelId: string, id?: string, revoke?: boolean) => { + if (staring) return + try { + if (!session) return + s3ModelCollection.authComposeClient(session) + setStaring(true) + if (id) { + const resp = await s3ModelCollection.updateCollection(id, { + revoke: !revoke + }) + if (resp.errors) { + throw new Error(resp.errors[0].message) + } + } else { + const resp = await s3ModelCollection.createCollection({ + modelID: modelId, + revoke: false + }) + if (resp.errors) { + throw new Error(resp.errors[0].message) + } + } + await fetchPersonal() + } catch (error) { + console.error(error) + } finally { + setStaring(false) + } + }, + [session, s3ModelCollection, fetchPersonal, staring] + ) + + const modelId = stream_id + + return ( + + {(staring && ( + + )) || ( + + )} + + {adding ? ( + + ) : ( + <> + {selectedDapp?.models?.includes(modelId) ? ( + + ) : ceramicNodeId ? ( + + ) : ( + + + + + + {({ close }) => } + + + + + )} + + )} + + ) +} + +const OpsBox = styled.div` + display: flex; + align-items: center; + gap: 5px; + + img { + width: 17px; + } +` +const Loading = styled.div` + padding: 20px; + text-align: center; + color: gray; +` diff --git a/packages/client/dashboard/src/components/model/FavoriteModal.tsx b/packages/client/dashboard/src/components/model/FavoriteModal.tsx index 90d92ff1..c5cb9b72 100644 --- a/packages/client/dashboard/src/components/model/FavoriteModal.tsx +++ b/packages/client/dashboard/src/components/model/FavoriteModal.tsx @@ -1,20 +1,6 @@ -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import dayjs from 'dayjs' -import { useCallback, useEffect, useState } from 'react' import styled from 'styled-components' -import { updateDapp } from '../../api/dapp' -import { getModelsInfoByIds, startIndexModel } from '../../api/model' -import { S3_SCAN_URL } from '../../constants' -import { PersonalCollection, useAppCtx } from '../../context/AppCtx' -import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' -import useSelectedDapp from '../../hooks/useSelectedDapp' -import { CeramicStatus, ModelStream, Network } from '../../types.d' -import { shortPubKey } from '../../utils/shortPubKey' -import { TableBox, TableContainer } from '../common/TableBox' -import CheckCircleIcon from '../icons/CheckCircleIcon' import CloseIcon from '../icons/CloseIcon' -import PlusCircleIcon from '../icons/PlusCircleIcon' -import StarGoldIcon from '../icons/StarGoldIcon' +import ModelList from './ExploreModelList' export default function FavoriteModal({ closeModal, @@ -30,243 +16,12 @@ export default function FavoriteModal({
- +
) } -function ModelList() { - const { s3ModelCollection, selectedDapp } = useSelectedDapp() - const session = useSession() - const { currCeramicNode } = useCeramicNodeCtx() - const [starModels, setStarModels] = useState>([]) - const [personalCollections, setPersonalCollections] = useState< - PersonalCollection[] - >([]) - const fetchPersonalCollections = useCallback(async () => { - if (!session) return - s3ModelCollection.authComposeClient(session) - try { - const personal = await s3ModelCollection.queryPersonalCollections({ - first: 500, - }) - if (personal.errors) throw new Error(personal.errors[0].message) - const collected = personal.data?.viewer.modelCollectionList - - if (collected) { - setPersonalCollections( - collected?.edges - .filter((item) => item.node && item.node.revoke === false) - .map((item) => { - return { - modelId: item.node.modelID, - id: item.node.id!, - revoke: !!item.node.revoke, - } - }) - ) - } - } catch (error) { - console.error(error) - } - }, [s3ModelCollection, session]) - - const fetchStarModels = useCallback(async () => { - const ids = personalCollections - .filter((item) => item.revoke === false) - .map((item) => { - return item.modelId - }) - if (ids.length === 0) { - setStarModels([]) - return - } - - try { - const resp = await getModelsInfoByIds({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - ids, - }) - if (resp.data.code !== 0) { - throw new Error(resp.data.msg) - } - - const list = resp.data.data - setStarModels([...list]) - } catch (error) { - console.error(error) - } - }, [personalCollections, selectedDapp?.network]) - - useEffect(() => { - fetchPersonalCollections() - }, [fetchPersonalCollections]) - - useEffect(() => { - fetchStarModels().catch(console.error) - }, [fetchStarModels]) - - return ( - - - - - - Model Name - Description - ID - Usage Count - Release Date - - - - - {starModels.map((item, idx) => { - return ( - - - - - -
- {item.stream_content.description} -
- - - - - - - - -
- {(item.last_anchored_at && - dayjs(item.created_at).format('YYYY-MM-DD HH:mm:ss')) || - '-'} -
- - - - - - - ) - })} - -
-
-
- ) -} - -export function OpsBtns({ - modelId, - hasIndexed, - ceramicNodeId, -}: { - modelId: string - hasIndexed: boolean - ceramicNodeId?: number -}) { - const { loadDapps } = useAppCtx() - const session = useSession() - const { selectedDapp } = useSelectedDapp() - const [adding, setAdding] = useState(false) - const addToModelList = useCallback( - async (modelId: string) => { - if (!session || !selectedDapp) return - if (!hasIndexed) { - startIndexModel({ - modelId, - network: selectedDapp.network as Network, - didSession: session.serialize(), - }).catch(console.error) - } - if (!ceramicNodeId) return - try { - setAdding(true) - const models = selectedDapp.models || [] - models.push(modelId) - await updateDapp({ ...selectedDapp, models }, session.serialize(),ceramicNodeId) - await loadDapps() - } catch (err) { - console.error(err) - } finally { - setAdding(false) - } - }, - [ceramicNodeId, hasIndexed, loadDapps, selectedDapp, session] - ) - return ( -
- - {adding ? ( - - ) : ( - <> - {selectedDapp?.models?.includes(modelId) ? ( - - ) : ( - - )} - - )} -
- ) -} - const FavoriteBox = styled.div` display: flex; flex-direction: column; @@ -295,14 +50,3 @@ const FavoriteBox = styled.div` } } ` - -const ListBox = styled.div` - .btns { - display: flex; - align-items: center; - - .loading { - width: 20px; - } - } -` diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index 1b2e2bff..33a8f7c3 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -93,7 +93,7 @@ export default function Nav({ appId }: { appId: string }) { )} - +
{(filterStar && ) || } Favorite diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx index 768100b1..c5968f9c 100644 --- a/packages/client/dashboard/src/container/ExploreComposite.tsx +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -26,7 +26,7 @@ import useSelectedDapp from '../hooks/useSelectedDapp' import { CeramicStatus, DappCompositeDto, Network } from '../types.d' import { shortPubKey } from '../utils/shortPubKey' import { bindingDappComposites, getComposites } from '../api/composite' -import { Dapps } from './ExploreModel' +import { Dapps } from '../components/model/ExploreModelList' import CreateCompositeModal from '../components/model/CreateCompositeModal' import LayoutIcon from '../components/icons/LayoutIcon' import { startIndexModels } from '../api/model' diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 9f9fd10c..0179e6a4 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -1,153 +1,17 @@ -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import dayjs from 'dayjs' -import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { - Button, - Dialog, - DialogTrigger, - Modal, - ModalOverlay -} from 'react-aria-components' -import InfiniteScroll from 'react-infinite-scroll-component' +import { useMemo, useState } from 'react' import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' -import { updateDapp } from '../api/dapp' -import { PAGE_SIZE } from '../constants' -import { - getModelStreamList, - getModelsInfoByIds, - startIndexModel -} from '../api/model' -import { ImgOrName } from '../components/common/ImgOrName' import Search from '../components/common/Search' -import { TableBox, TableContainer } from '../components/common/TableBox' -import CheckCircleIcon from '../components/icons/CheckCircleIcon' -import PlusCircleIcon from '../components/icons/PlusCircleIcon' -import StarGoldIcon from '../components/icons/StarGoldIcon' -import StarIcon from '../components/icons/StarIcon' -import NoCeramicNodeModal from '../components/node/NoCeramicNodeModal' -import { S3_SCAN_URL } from '../constants' -import { PersonalCollection, useAppCtx } from '../context/AppCtx' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { CeramicStatus, ClientDApp, ModelStream, Network } from '../types.d' -import { shortPubKey } from '../utils/shortPubKey' +import ModelList from '../components/model/ExploreModelList' export default function ExploreModel () { - // eslint-disable-next-line @typescript-eslint/no-unused-vars const [searchParams, setSearchParams] = useSearchParams() - const { s3ModelCollection, selectedDapp } = useSelectedDapp() - const { currCeramicNode } = useCeramicNodeCtx() - const session = useSession() - const [models, setModels] = useState>([]) - const [starModels, setStarModels] = useState>([]) - const [hasMore, setHasMore] = useState(true) - const searchText = useRef('') - const pageNum = useRef(1) - const [personalCollections, setPersonalCollections] = useState< - PersonalCollection[] - >([]) - const fetchPersonalCollections = useCallback(async () => { - if (!session) return - s3ModelCollection.authComposeClient(session) - try { - const personal = await s3ModelCollection.queryPersonalCollections({ - first: 500 - }) - if (personal.errors) throw new Error(personal.errors[0].message) - const collected = personal.data?.viewer.modelCollectionList - - if (collected) { - setPersonalCollections( - collected?.edges - .filter(item => item.node && item.node.revoke === false) - .map(item => { - return { - modelId: item.node.modelID, - id: item.node.id!, - revoke: !!item.node.revoke - } - }) - ) - } - } catch (error) { - console.error('error -----', error) - } - }, [s3ModelCollection, session]) - - const fetchStarModels = useCallback(async () => { - const ids = personalCollections - .filter(item => item.revoke === false) - .map(item => { - return item.modelId - }) - if (ids.length === 0) { - setStarModels([]) - return - } - - try { - const resp = await getModelsInfoByIds({ - network: (selectedDapp?.network as Network) || Network.TESTNET, - ids - }) - if (resp.data.code !== 0) { - throw new Error(resp.data.msg) - } - - const list = resp.data.data - setStarModels([...list]) - } catch (error) { - console.error(error) - } - }, [personalCollections, selectedDapp?.network]) - - const fetchModel = useCallback(async () => { - setModels([]) - setHasMore(true) - const resp = await getModelStreamList({ - name: searchText.current, - network: (selectedDapp?.network as Network) || Network.TESTNET - }) - const list = resp.data.data - setModels(list) - setHasMore(list.length >= PAGE_SIZE) - pageNum.current = 1 - }, [selectedDapp?.network]) - - const fetchMoreModel = useCallback( - async (pageNumber: number) => { - const resp = await getModelStreamList({ - pageNumber - }) - const list = resp.data.data - setHasMore(list.length >= PAGE_SIZE) - setModels([...models, ...list]) - }, - [models] - ) - - useEffect(() => { - fetchModel() - fetchPersonalCollections() - }, [fetchModel, fetchPersonalCollections]) - - useEffect(() => { - fetchStarModels().catch(err => { - setStarModels([]) - console.error(err) - }) - }, [fetchStarModels]) - const filterStar = useMemo(() => { - return searchParams.get('filterStar') || '' + return searchParams.get('filterStar') === 'true' }, [searchParams]) - - const lists = useMemo(() => { - if (!filterStar) return models - return starModels - }, [filterStar, models, starModels]) - + const [searchText, setSearchText] = useState( + searchParams.get('searchText') || '' + ) return (
@@ -155,385 +19,19 @@ export default function ExploreModel () {
{ - searchText.current = text - setModels([]) - fetchModel() + setSearchText(text) }} placeholder={'Search by model name'} />
- { - pageNum.current += 1 - fetchMoreModel(pageNum.current) - console.log('fetch more') - }} - hasMore={filterStar ? false : hasMore} - loader={Loading...} - > - - - - - Model Name - Description - ID - Usage Count - 7 Days Usage - Release Date - Dapps - - - - - - {lists.map((item, idx) => { - const hasStarItem = personalCollections.find( - starItem => starItem.modelId === item.stream_id - ) - return ( - - - - - -
{item.stream_content.description}
- - - - - - - - {item.recentlyUseCount || '-'} - -
- {(item.last_anchored_at && - dayjs(item.created_at).format( - 'YYYY-MM-DD HH:mm:ss' - )) || - '-'} -
- - - - - - {/* */} - - - - ) - })} - -
-
-
- {!filterStar && !hasMore && no more data} +
) } -export function Dapps ({ dapps }: { dapps: ClientDApp[] }) { - const apps = useMemo(() => { - const data = [...dapps] - if (data.length > 3) - return { data: data.slice(0, 3), left: data.length - 3 } - return { data, left: 0 } - }, [dapps]) - - return ( - - {apps.data.length > 0 - ? apps.data.map((item, idx) => { - return ( - - - - ) - }) - : 'None'} - {apps.left > 0 && {apps.left}+} - - ) -} - -const DappBox = styled.div` - display: flex; - gap: 5px; - overflow: hidden; - color: #fff; - font-family: Rubik; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: normal; - a { - > span { - color: #fff; - width: 36px; - height: 36px; - border-radius: 10px; - border: 1px solid #718096; - display: inline-flex; - align-items: center; - justify-content: center; - overflow: hidden; - &.name { - font-size: 20px; - font-weight: 500; - } - &.left { - border: none; - color: #fff; - justify-content: start; - font-family: Rubik; - font-size: 12px; - font-style: normal; - font-weight: 400; - line-height: normal; - } - > img { - width: 100%; - height: 100%; - object-fit: cover; - flex-shrink: 0; - } - } - } -` - -function ModelStarItem ({ - hasStarItem, - fetchPersonal, - stream_id, - hasIndexed, - ceramicNodeId -}: { - hasIndexed: boolean - stream_id: string - hasStarItem: - | { - modelId: string - id: string - revoke: boolean - } - | undefined - fetchPersonal: () => void - ceramicNodeId?: number -}) { - const session = useSession() - const { s3ModelCollection } = useSelectedDapp() - const [staring, setStaring] = useState(false) - - const { loadDapps } = useAppCtx() - const { selectedDapp } = useSelectedDapp() - const [adding, setAdding] = useState(false) - const addToModelList = useCallback( - async (modelId: string) => { - if (!session || !selectedDapp) return - if (!ceramicNodeId) return - if (!hasIndexed) { - startIndexModel({ - modelId, - network: selectedDapp.network as Network, - didSession: session.serialize() - }).catch(console.error) - } - try { - setAdding(true) - const models = selectedDapp.models || [] - models.push(modelId) - await updateDapp( - { ...selectedDapp, models }, - session.serialize(), - ceramicNodeId - ) - await loadDapps() - } catch (err) { - console.error(err) - } finally { - setAdding(false) - } - }, - [loadDapps, selectedDapp, session, setAdding, hasIndexed, ceramicNodeId] - ) - - const starModelAction = useCallback( - async (modelId: string, id?: string, revoke?: boolean) => { - if (staring) return - try { - if (!session) return - s3ModelCollection.authComposeClient(session) - setStaring(true) - if (id) { - const resp = await s3ModelCollection.updateCollection(id, { - revoke: !revoke - }) - if (resp.errors) { - throw new Error(resp.errors[0].message) - } - } else { - const resp = await s3ModelCollection.createCollection({ - modelID: modelId, - revoke: false - }) - if (resp.errors) { - throw new Error(resp.errors[0].message) - } - } - await fetchPersonal() - } catch (error) { - console.error(error) - } finally { - setStaring(false) - } - }, - [session, s3ModelCollection, fetchPersonal, staring] - ) - - const modelId = stream_id - - return ( - - {(staring && ( - - )) || ( - - )} - - {adding ? ( - - ) : ( - <> - {selectedDapp?.models?.includes(modelId) ? ( - - ) : ceramicNodeId ? ( - - ) : ( - - - - - - {({ close }) => } - - - - - )} - - )} - - ) -} - -const OpsBox = styled.div` - display: flex; - align-items: center; - gap: 5px; - - img { - width: 17px; - } -` - const ExploreModelContainer = styled.div` margin-top: 25px; margin-bottom: 25px; @@ -619,9 +117,3 @@ const ExploreModelContainer = styled.div` font-size: 18px; } ` - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` From 8f52468c88d805fc851ab6e35613162d3e6bdca7 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 18:46:29 +0800 Subject: [PATCH 102/127] extract explore model list component --- .../dashboard/src/components/model/ExploreModelList.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index a5ad9fef..98ca3ec3 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -108,25 +108,27 @@ export default function ModelList ({ setModels([]) setHasMore(true) const resp = await getModelStreamList({ - name: searchText, + name: searchText || '', network: (selectedDapp?.network as Network) || Network.TESTNET }) const list = resp.data.data setModels(list) setHasMore(list.length >= PAGE_SIZE) pageNum.current = 1 - }, [selectedDapp?.network]) + }, [searchText, selectedDapp?.network]) const fetchMoreModel = useCallback( async (pageNumber: number) => { const resp = await getModelStreamList({ + name: searchText || '', + network: (selectedDapp?.network as Network) || Network.TESTNET, pageNumber }) const list = resp.data.data setHasMore(list.length >= PAGE_SIZE) setModels([...models, ...list]) }, - [models] + [models, searchText, selectedDapp?.network] ) useEffect(() => { From 67fe66edd760ec941ff0f9cf0769b4d4b6891a47 Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 19:00:09 +0800 Subject: [PATCH 103/127] extract explore composite list component --- .../src/components/model/ExploreModelList.tsx | 14 +- .../src/container/ExploreComposite.tsx | 379 +----------------- .../dashboard/src/container/ExploreModel.tsx | 2 +- 3 files changed, 17 insertions(+), 378 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 98ca3ec3..0d3ece96 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -17,13 +17,13 @@ import { getModelsInfoByIds, startIndexModel } from '../../api/model' -import { ImgOrName } from '../../components/common/ImgOrName' -import { TableBox, TableContainer } from '../../components/common/TableBox' -import CheckCircleIcon from '../../components/icons/CheckCircleIcon' -import PlusCircleIcon from '../../components/icons/PlusCircleIcon' -import StarGoldIcon from '../../components/icons/StarGoldIcon' -import StarIcon from '../../components/icons/StarIcon' -import NoCeramicNodeModal from '../../components/node/NoCeramicNodeModal' +import { ImgOrName } from '../common/ImgOrName' +import { TableBox, TableContainer } from '../common/TableBox' +import CheckCircleIcon from '../icons/CheckCircleIcon' +import PlusCircleIcon from '../icons/PlusCircleIcon' +import StarGoldIcon from '../icons/StarGoldIcon' +import StarIcon from '../icons/StarIcon' +import NoCeramicNodeModal from '../node/NoCeramicNodeModal' import { S3_SCAN_URL } from '../../constants' import { PersonalCollection, useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx index c5968f9c..19632cb1 100644 --- a/packages/client/dashboard/src/container/ExploreComposite.tsx +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -1,153 +1,14 @@ -import { useSession } from '@us3r-network/auth-with-rainbowkit' -import dayjs from 'dayjs' -import { useCallback, useEffect, useRef, useState } from 'react' -import { - Button, - Dialog, - DialogTrigger, - Modal, - ModalOverlay -} from 'react-aria-components' -import InfiniteScroll from 'react-infinite-scroll-component' +import { useState } from 'react' import { useSearchParams } from 'react-router-dom' import styled from 'styled-components' -import { updateDapp } from '../api/dapp' -import { PAGE_SIZE } from '../constants' -import { ImgOrName } from '../components/common/ImgOrName' import Search from '../components/common/Search' -import { TableBox, TableContainer } from '../components/common/TableBox' -import CheckCircleIcon from '../components/icons/CheckCircleIcon' -import PlusCircleIcon from '../components/icons/PlusCircleIcon' -import NoCeramicNodeModal from '../components/node/NoCeramicNodeModal' -import { S3_SCAN_URL } from '../constants' -import { useAppCtx } from '../context/AppCtx' -import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { CeramicStatus, DappCompositeDto, Network } from '../types.d' -import { shortPubKey } from '../utils/shortPubKey' -import { bindingDappComposites, getComposites } from '../api/composite' -import { Dapps } from '../components/model/ExploreModelList' -import CreateCompositeModal from '../components/model/CreateCompositeModal' -import LayoutIcon from '../components/icons/LayoutIcon' -import { startIndexModels } from '../api/model' +import { CompositeList } from '../components/model/ExploreCompositeList' export default function ExploreComposite () { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [searchParams, setSearchParams] = useSearchParams() - const { s3ModelCollection, selectedDapp } = useSelectedDapp() - const { currCeramicNode } = useCeramicNodeCtx() - const session = useSession() - const [composites, setComposites] = useState>([]) - // const [starModels, setStarModels] = useState>([]) - const [hasMore, setHasMore] = useState(true) - const searchText = useRef('') - const pageNum = useRef(1) - // const [personalCollections, setPersonalCollections] = useState< - // PersonalCollection[] - // >([]) - // const fetchPersonalCollections = useCallback(async () => { - // if (!session) return - // s3ModelCollection.authComposeClient(session) - // try { - // const personal = await s3ModelCollection.queryPersonalCollections({ - // first: 500 - // }) - // if (personal.errors) throw new Error(personal.errors[0].message) - // const collected = personal.data?.viewer.modelCollectionList - - // if (collected) { - // setPersonalCollections( - // collected?.edges - // .filter(item => item.node && item.node.revoke === false) - // .map(item => { - // return { - // modelId: item.node.modelID, - // id: item.node.id!, - // revoke: !!item.node.revoke - // } - // }) - // ) - // } - // } catch (error) { - // console.error('error -----', error) - // } - // }, [s3ModelCollection, session]) - - // const fetchStarModels = useCallback(async () => { - // const ids = personalCollections - // .filter(item => item.revoke === false) - // .map(item => { - // return item.modelId - // }) - // if (ids.length === 0) { - // setStarModels([]) - // return - // } - - // try { - // const resp = await getModelsInfoByIds({ - // network: (selectedDapp?.network as Network) || Network.TESTNET, - // ids - // }) - // if (resp.data.code !== 0) { - // throw new Error(resp.data.msg) - // } - - // const list = resp.data.data - // setStarModels([...list]) - // } catch (error) { - // console.error(error) - // } - // }, [personalCollections, selectedDapp?.network]) - - const fetchComposites = useCallback(async () => { - setComposites([]) - setHasMore(true) - const resp = await getComposites({ - name: searchText.current, - network: (selectedDapp?.network as Network) || Network.TESTNET - }) - const list = resp.data.data - setComposites(list) - setHasMore(list.length >= PAGE_SIZE) - pageNum.current = 1 - }, [selectedDapp?.network]) - - const fetchMoreComposites = useCallback( - async (pageNumber: number) => { - const resp = await getComposites({ - name: searchText.current, - pageNumber, - network: (selectedDapp?.network as Network) || Network.TESTNET - }) - const list = resp.data.data - setHasMore(list.length >= PAGE_SIZE) - setComposites([...composites, ...list]) - }, - [composites, selectedDapp?.network] + const [searchParams] = useSearchParams() + const [searchText, setSearchText] = useState( + searchParams.get('searchText') || '' ) - - useEffect(() => { - fetchComposites() - // fetchPersonalCollections() - }, [fetchComposites]) - - // useEffect(() => { - // fetchStarModels().catch(err => { - // setStarModels([]) - // console.error(err) - // }) - // }, [fetchStarModels]) - - // const filterStar = useMemo(() => { - // return searchParams.get('filterStar') || '' - // }, [searchParams]) - - // const lists = useMemo(() => { - // if (!filterStar) return models - // return starModels - // }, [filterStar, models, starModels]) - const lists = composites return (
@@ -155,235 +16,19 @@ export default function ExploreComposite () {
{ - searchText.current = text - setComposites([]) - fetchComposites() + setSearchText(text) }} - placeholder={'Search by model name'} + placeholder={'Search by name'} />
- { - pageNum.current += 1 - fetchMoreComposites(pageNum.current) - console.log('fetch more') - }} - hasMore={hasMore} - loader={Loading...} - > - - - - - Composite Name - Stream ID - Release Date - Dapps - - - - - - {lists.map((item, idx) => { - return ( - - -
{item.name}
- - -
- {item.streamId ? ( - - {shortPubKey(item.streamId, { - len: 8, - split: '-' - })} - - ) : ( - '-' - )} -
- - -
- {dayjs(item.createdAt).format('YYYY-MM-DD HH:mm:ss') || - '-'} -
- - - - - - {/* */} - dapp.id === selectedDapp?.id - ) !== -1 - } - ceramicNodeId={ - currCeramicNode && - currCeramicNode.status === CeramicStatus.RUNNING - ? currCeramicNode?.id - : undefined - } - /> - - - ) - })} - -
-
-
- {!hasMore && no more data} +
) } -function Actions ({ - composite, - hasIndexed, - ceramicNodeId -}: { - composite: DappCompositeDto - hasIndexed: boolean - ceramicNodeId?: number -}) { - const session = useSession() - - const { loadDapps } = useAppCtx() - const { selectedDapp } = useSelectedDapp() - const [adding, setAdding] = useState(false) - - const bindComposite = useCallback(async () => { - if (!session || !selectedDapp) return - if (!ceramicNodeId) return - if (!hasIndexed) { - bindingDappComposites({ - compositeId: composite.id, - dapp: selectedDapp, - did: session.serialize() - }) - .then( - () => { - const models = JSON.parse(composite.composite).models - console.log(Object.keys(models)) - const modelIds = Object.keys(models) - startIndexModels({ - modelIds, - network: selectedDapp.network, - didSession: session.serialize() - }).catch(console.error) - }, - err => { - console.error(err) - } - ) - .catch(console.error) - } - try { - setAdding(true) - const composites = selectedDapp.composites || [] - composites.push(composite) - await updateDapp( - { ...selectedDapp, composites }, - session.serialize(), - ceramicNodeId - ) - await loadDapps() - } catch (err) { - console.error(err) - } finally { - setAdding(false) - } - }, [session, selectedDapp, ceramicNodeId, hasIndexed, composite, loadDapps]) - return ( - - - - - - - {({ close }) => ( - - )} - - - - - {adding ? ( - - ) : ( - <> - {hasIndexed ? ( - - ) : ceramicNodeId ? ( - - ) : ( - - - - - - {({ close }) => } - - - - - )} - - )} - - ) -} - -const OpsBox = styled.div` - display: flex; - align-items: center; - gap: -5px; - img { - width: 17px; - } -` - const ExploreModelContainer = styled.div` margin-top: 25px; margin-bottom: 25px; @@ -469,9 +114,3 @@ const ExploreModelContainer = styled.div` font-size: 18px; } ` - -const Loading = styled.div` - padding: 20px; - text-align: center; - color: gray; -` diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 0179e6a4..47389326 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -5,7 +5,7 @@ import Search from '../components/common/Search' import ModelList from '../components/model/ExploreModelList' export default function ExploreModel () { - const [searchParams, setSearchParams] = useSearchParams() + const [searchParams] = useSearchParams() const filterStar = useMemo(() => { return searchParams.get('filterStar') === 'true' }, [searchParams]) From 54d631caef963a2fafeb47baebc81f9f3092a99c Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 29 Jan 2024 19:00:18 +0800 Subject: [PATCH 104/127] extract explore composite list component --- .../components/model/ExploreCompositeList.tsx | 297 ++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 packages/client/dashboard/src/components/model/ExploreCompositeList.tsx diff --git a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx new file mode 100644 index 00000000..8a9dc0ae --- /dev/null +++ b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx @@ -0,0 +1,297 @@ +import { useSession } from '@us3r-network/auth-with-rainbowkit' +import dayjs from 'dayjs' +import { useCallback, useEffect, useRef, useState } from 'react' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' +import InfiniteScroll from 'react-infinite-scroll-component' +import styled from 'styled-components' +import { bindingDappComposites, getComposites } from '../../api/composite' +import { updateDapp } from '../../api/dapp' +import { startIndexModels } from '../../api/model' +import { PAGE_SIZE, S3_SCAN_URL } from '../../constants' +import { useAppCtx } from '../../context/AppCtx' +import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' +import useSelectedDapp from '../../hooks/useSelectedDapp' +import { CeramicStatus, DappCompositeDto, Network } from '../../types.d' +import { shortPubKey } from '../../utils/shortPubKey' +import { TableBox, TableContainer } from '../common/TableBox' +import CheckCircleIcon from '../icons/CheckCircleIcon' +import LayoutIcon from '../icons/LayoutIcon' +import PlusCircleIcon from '../icons/PlusCircleIcon' +import CreateCompositeModal from '../model/CreateCompositeModal' +import { Dapps } from '../model/ExploreModelList' +import NoCeramicNodeModal from '../node/NoCeramicNodeModal' + +export function CompositeList ({ + searchText +}: { + searchText?: string +}) { + const { selectedDapp } = useSelectedDapp() + const { currCeramicNode } = useCeramicNodeCtx() + const [composites, setComposites] = useState>([]) + const [hasMore, setHasMore] = useState(true) + const pageNum = useRef(1) + const fetchComposites = useCallback(async () => { + setComposites([]) + setHasMore(true) + const resp = await getComposites({ + name: searchText, + network: (selectedDapp?.network as Network) || Network.TESTNET + }) + const list = resp.data.data + setComposites(list) + setHasMore(list.length >= PAGE_SIZE) + pageNum.current = 1 + }, [searchText, selectedDapp?.network]) + + const fetchMoreComposites = useCallback( + async (pageNumber: number) => { + const resp = await getComposites({ + name: searchText, + pageNumber, + network: (selectedDapp?.network as Network) || Network.TESTNET + }) + const list = resp.data.data + setHasMore(list.length >= PAGE_SIZE) + setComposites([...composites, ...list]) + }, + [composites, searchText, selectedDapp?.network] + ) + + useEffect(() => { + fetchComposites() + }, [fetchComposites]) + + const lists = composites + return ( + <> + { + pageNum.current += 1 + fetchMoreComposites(pageNum.current) + console.log('fetch more') + }} + hasMore={hasMore} + loader={Loading...} + > + + + + + Composite Name + Stream ID + Release Date + Dapps + + + + + + {lists.map((item, idx) => { + return ( + + +
{item.name}
+ + +
+ {item.streamId ? ( + + {shortPubKey(item.streamId, { + len: 8, + split: '-' + })} + + ) : ( + '-' + )} +
+ + +
+ {dayjs(item.createdAt).format('YYYY-MM-DD HH:mm:ss') || + '-'} +
+ + + + + + {/* */} + dapp.id === selectedDapp?.id + ) !== -1 + } + ceramicNodeId={ + currCeramicNode && + currCeramicNode.status === CeramicStatus.RUNNING + ? currCeramicNode?.id + : undefined + } + /> + + + ) + })} + +
+
+
+ {!hasMore && no more data} + + ) +} + +function Actions ({ + composite, + hasIndexed, + ceramicNodeId +}: { + composite: DappCompositeDto + hasIndexed: boolean + ceramicNodeId?: number +}) { + const session = useSession() + + const { loadDapps } = useAppCtx() + const { selectedDapp } = useSelectedDapp() + const [adding, setAdding] = useState(false) + + const bindComposite = useCallback(async () => { + if (!session || !selectedDapp) return + if (!ceramicNodeId) return + if (!hasIndexed) { + bindingDappComposites({ + compositeId: composite.id, + dapp: selectedDapp, + did: session.serialize() + }) + .then( + () => { + const models = JSON.parse(composite.composite).models + console.log(Object.keys(models)) + const modelIds = Object.keys(models) + startIndexModels({ + modelIds, + network: selectedDapp.network, + didSession: session.serialize() + }).catch(console.error) + }, + err => { + console.error(err) + } + ) + .catch(console.error) + } + try { + setAdding(true) + const composites = selectedDapp.composites || [] + composites.push(composite) + await updateDapp( + { ...selectedDapp, composites }, + session.serialize(), + ceramicNodeId + ) + await loadDapps() + } catch (err) { + console.error(err) + } finally { + setAdding(false) + } + }, [session, selectedDapp, ceramicNodeId, hasIndexed, composite, loadDapps]) + return ( + + + + + + + {({ close }) => ( + + )} + + + + + {adding ? ( + + ) : ( + <> + {hasIndexed ? ( + + ) : ceramicNodeId ? ( + + ) : ( + + + + + + {({ close }) => } + + + + + )} + + )} + + ) +} + +const OpsBox = styled.div` + display: flex; + align-items: center; + gap: -5px; + img { + width: 17px; + } +` + +const Loading = styled.div` + padding: 20px; + text-align: center; + color: gray; +` From 83d0b3eb945981a19698e3dc54966b36ed7c3ded Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 30 Jan 2024 13:02:03 +0800 Subject: [PATCH 105/127] open explore models in modal --- ...positeModal.tsx => CreateNewComposite.tsx} | 2 +- .../model/DappModelAndComposites.tsx | 119 ++++++++++++++++-- .../components/model/ExploreCompositeList.tsx | 2 +- .../src/components/model/ExploreModelList.tsx | 10 +- .../src/components/model/FavoriteModal.tsx | 52 -------- 5 files changed, 117 insertions(+), 68 deletions(-) rename packages/client/dashboard/src/components/model/{CreateCompositeModal.tsx => CreateNewComposite.tsx} (99%) delete mode 100644 packages/client/dashboard/src/components/model/FavoriteModal.tsx diff --git a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx similarity index 99% rename from packages/client/dashboard/src/components/model/CreateCompositeModal.tsx rename to packages/client/dashboard/src/components/model/CreateNewComposite.tsx index cb035682..d739c97a 100644 --- a/packages/client/dashboard/src/components/model/CreateCompositeModal.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx @@ -11,7 +11,7 @@ import { createCompositeFromBrowser } from '../../utils/composeDBUtils' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import { startIndexModels } from '../../api/model' -export default function CreateCompositeModal ({ +export default function CreateNewComposite ({ closeModal, loadDappComposites, defaultName, diff --git a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx index 208f115b..9bb7f702 100644 --- a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx +++ b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx @@ -11,7 +11,7 @@ import { ModalOverlay, Popover } from 'react-aria-components' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation } from 'react-router-dom' import styled from 'styled-components' import { deleteDappComposites, getDappComposites } from '../../api/composite' import { updateDapp } from '../../api/dapp' @@ -33,10 +33,12 @@ import MergeIcon from '../icons/MergeIcon' import PlusIcon from '../icons/PlusIcon' import TrashIcon from '../icons/TrashIcon' import NoCeramicNodeModal from '../node/NoCeramicNodeModal' -import CreateCompositeModal from './CreateCompositeModal' +import CreateNewComposite from './CreateNewComposite' import CreateNewModel from './CreateNewModel' -import FavoriteModel from './FavoriteModal' import MergeModal from './MergeModal' +import CloseIcon from '../icons/CloseIcon' +import ModelList from './ExploreModelList' +import { CompositeList } from './ExploreCompositeList' enum OPEN_MODAL { NONE, @@ -44,8 +46,8 @@ enum OPEN_MODAL { ADD_FROM_ALL_MODELS, ADD_FROM_FAVORITE_MODELS, CREATE_NEW_COMPOSITE, - ADD_FROM_ALL_COMPOSITES, - ADD_FROM_FAVORITE_COMPOSITES + ADD_FROM_ALL_COMPOSITES + // ADD_FROM_FAVORITE_COMPOSITES } export default function DappModelAndComposites ({ @@ -66,7 +68,6 @@ export default function DappModelAndComposites ({ const { loadDapps, currDapp } = useAppCtx() const { appId, selectedDapp } = useSelectedDapp() const { currCeramicNode } = useCeramicNodeCtx() - const navigate = useNavigate() const [loading, setLoading] = useState(false) const [dappModels, setDappModels] = useState() const [dappComposites, setDappComposites] = useState([]) @@ -237,7 +238,7 @@ export default function DappModelAndComposites ({ { if (id === 'explore') { - navigate(`/dapp/${appId}/explore/model`) + setOpenModal(OPEN_MODAL.ADD_FROM_ALL_MODELS) return } if (id === 'favorite') { @@ -250,7 +251,7 @@ export default function DappModelAndComposites ({ } }} > - Explore Models + Add From Popular Models Add From Favorite Create New Model @@ -308,7 +309,7 @@ export default function DappModelAndComposites ({ { if (id === 'explore') { - navigate(`/dapp/${appId}/explore/composite`) + setOpenModal(OPEN_MODAL.ADD_FROM_ALL_COMPOSITES) return } if (id === 'create') { @@ -317,7 +318,9 @@ export default function DappModelAndComposites ({ } }} > - Explore Composites + + Add From Popular Composites + Create New Composites @@ -334,19 +337,21 @@ export default function DappModelAndComposites ({ /> )} + {/* CREATE_NEW_MODEL modal */} setOpenModal(OPEN_MODAL.NONE)} > {({ close }) => } + {/* CREATE_NEW_COMPOSITE modal */} setOpenModal(OPEN_MODAL.NONE)} > {({ close }) => ( - + {/* ADD_FROM_FAVORITE_MODELS modal */} setOpenModal(OPEN_MODAL.NONE)} > - {({ close }) => } + + {({ close }) => ( + +
+

My Favorite Models

+ +
+
+ +
+
+ )} +
+
+ {/* ADD_FROM_ALL_MODELS modal */} + setOpenModal(OPEN_MODAL.NONE)} + > + + {({ close }) => ( + +
+

Popular Models

+ +
+
+ +
+
+ )} +
+
+ {/* ADD_FROM_ALL_COMPOSITES modal */} + setOpenModal(OPEN_MODAL.NONE)} + > + + {({ close }) => ( + +
+

Popular Composites

+ +
+
+ +
+
+ )} +
{editable && isOwner && ( @@ -651,3 +713,36 @@ const MergeBox = styled.div` gap: 10px; } ` +const DialogBox = styled.div` + display: flex; + flex-direction: column; + padding: 20px; + gap: 20px; + height: calc(100vh - 100px); + position: relative; + width: 1240px; + margin: 0 auto; + + background: #1b1e23; + border-radius: 20px; + + > div.title { + flex: 0 0 42px; + display: flex; + align-items: center; + justify-content: space-between; + + color: #ffffff; + > h1 { + margin: 0; + font-style: italic; + font-weight: 700; + font-size: 24px; + line-height: 28px; + } + } + > div.content { + height: 0; + flex: 1; + } +` diff --git a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx index 8a9dc0ae..367a3d74 100644 --- a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx @@ -23,7 +23,7 @@ import { TableBox, TableContainer } from '../common/TableBox' import CheckCircleIcon from '../icons/CheckCircleIcon' import LayoutIcon from '../icons/LayoutIcon' import PlusCircleIcon from '../icons/PlusCircleIcon' -import CreateCompositeModal from '../model/CreateCompositeModal' +import CreateCompositeModal from './CreateNewComposite' import { Dapps } from '../model/ExploreModelList' import NoCeramicNodeModal from '../node/NoCeramicNodeModal' diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 0d3ece96..462e2e40 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -149,7 +149,7 @@ export default function ModelList ({ }, [filterStar, models, starModels]) return ( - <> + { @@ -272,7 +272,7 @@ export default function ModelList ({ {!filterStar && !hasMore && no more data} - + ) } @@ -305,6 +305,12 @@ export function Dapps ({ dapps }: { dapps: ClientDApp[] }) { ) } +const Box = styled.div` + height: 100%; + overflow: auto; + position: relative; +` + const DappBox = styled.div` display: flex; gap: 5px; diff --git a/packages/client/dashboard/src/components/model/FavoriteModal.tsx b/packages/client/dashboard/src/components/model/FavoriteModal.tsx deleted file mode 100644 index c5cb9b72..00000000 --- a/packages/client/dashboard/src/components/model/FavoriteModal.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import styled from 'styled-components' -import CloseIcon from '../icons/CloseIcon' -import ModelList from './ExploreModelList' - -export default function FavoriteModal({ - closeModal, -}: { - closeModal: () => void -}) { - return ( - -
-

My Favorite Models

- -
-
- -
-
- ) -} - -const FavoriteBox = styled.div` - display: flex; - flex-direction: column; - padding: 20px; - gap: 20px; - min-height: calc(100vh - 300px); - position: relative; - width: 1240px; - margin: 0 auto; - - background: #1b1e23; - border-radius: 20px; - - > div.title { - display: flex; - align-items: center; - justify-content: space-between; - - color: #ffffff; - > h1 { - margin: 0; - font-style: italic; - font-weight: 700; - font-size: 24px; - line-height: 28px; - } - } -` From 58ff7a38ef829666da7e30fad0d8f1ee719fc454 Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 30 Jan 2024 17:45:25 +0800 Subject: [PATCH 106/127] adjust nav --- .../{CheckronDown.tsx => ChevronDown.tsx} | 0 .../src/components/model/CodeDownload.tsx | 2 +- .../dashboard/src/components/nav/Nav.tsx | 288 +++++++++++------- .../dashboard/src/container/DappHome.tsx | 2 +- 4 files changed, 178 insertions(+), 114 deletions(-) rename packages/client/dashboard/src/components/icons/{CheckronDown.tsx => ChevronDown.tsx} (100%) diff --git a/packages/client/dashboard/src/components/icons/CheckronDown.tsx b/packages/client/dashboard/src/components/icons/ChevronDown.tsx similarity index 100% rename from packages/client/dashboard/src/components/icons/CheckronDown.tsx rename to packages/client/dashboard/src/components/icons/ChevronDown.tsx diff --git a/packages/client/dashboard/src/components/model/CodeDownload.tsx b/packages/client/dashboard/src/components/model/CodeDownload.tsx index 51e3dd77..9b33fae5 100644 --- a/packages/client/dashboard/src/components/model/CodeDownload.tsx +++ b/packages/client/dashboard/src/components/model/CodeDownload.tsx @@ -1,7 +1,7 @@ import FileSaver from 'file-saver' import { useState } from 'react' import styled from 'styled-components' -import ChevronDown from '../icons/CheckronDown' +import ChevronDown from '../icons/ChevronDown' import DownloadIcon from '../icons/DownloadIcon' import { Code } from './ModelSDK' diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index 33a8f7c3..aa217a5d 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useState } from 'react' -import { Link, NavLink, useSearchParams } from 'react-router-dom' +import { Link, NavLink } from 'react-router-dom' import styled from 'styled-components' import { DOCS_URL } from '../../constants' import ChartIcon from '../icons/ChartIcon' @@ -12,113 +12,167 @@ import InfoIcon from '../icons/InfoIcon' import LayoutIcon from '../icons/LayoutIcon' import NodeIcon from '../icons/NodeIcon' import SdkIcon from '../icons/SdkIcon' -import StarGoldIcon from '../icons/StarGoldIcon' -import StarIcon from '../icons/StarIcon' import TerminalIcon from '../icons/TerminalIcon' +import ChevronDown from '../icons/ChevronDown' -export default function Nav({ appId }: { appId: string }) { - const [open, setOpen] = useState(true) - const [searchParams] = useSearchParams() +type NavItem = { + path?: string + name: string + icon: any + items?: NavItem[] +} - const filterStar = useMemo(() => { - return searchParams.get('filterStar') || '' - }, [searchParams]) +export default function Nav ({ appId }: { appId: string }) { + const [open, setOpen] = useState(true) + const navItems = useMemo(() => { + return [ + { + path: `/dapp/${appId}/index`, + name: 'Home', + icon: HomeIcon + }, + { + // path: `/dapp/${appId}/explore`, + name: 'Explore', + icon: ExploreIcon, + items: [ + { + path: `/dapp/${appId}/explore/model`, + name: 'Models', + icon: ExploreIcon + }, + { + path: `/dapp/${appId}/explore/composite`, + name: 'Composites', + icon: ExploreIcon + }, + { + path: `/dapp/${appId}/components`, + name: 'Components', + icon: ComponentIcon + } + ] + }, + { + // path: `/dapp/${appId}/build`, + name: 'Build', + icon: InfoIcon, + items: [ + { + path: `/dapp/${appId}/model-editor`, + name: 'Compose', + icon: LayoutIcon + }, + { + path: `/dapp/${appId}/model-playground`, + name: 'Playground', + icon: TerminalIcon + }, + { + path: `/dapp/${appId}/model-sdk`, + name: 'SDK', + icon: SdkIcon + }, + { + path: `/dapp/${appId}/statistic`, + name: 'Metrics', + icon: ChartIcon + } + ] + }, + { + path: `/dapp/${appId}/node`, + name: 'Node', + icon: NodeIcon + }, + { + path: `/dapp/${appId}/info`, + name: 'Info', + icon: InfoIcon + } + ] + }, [appId]) return (
-
-
- {[ - { - path: `/dapp/${appId}/index`, - name: 'Home', - icon: HomeIcon, - }, - { - path: `/dapp/${appId}/node`, - name: 'Node Deployment', - icon: NodeIcon, - }, - { - path: `/dapp/${appId}/model-editor`, - name: 'Model Editor', - icon: LayoutIcon, - }, - { - path: `/dapp/${appId}/model-playground`, - name: 'Model Playground', - icon: TerminalIcon, - }, - { - path: `/dapp/${appId}/model-sdk`, - name: 'Model SDK', - icon: SdkIcon, - }, - { - path: `/dapp/${appId}/statistic`, - name: 'Model Metrics', - icon: ChartIcon, - }, - { - path: `/dapp/${appId}/components`, - name: 'S3 Components', - icon: ComponentIcon, - }, - { - path: `/dapp/${appId}/info`, - name: 'Info', - icon: InfoIcon, - }, - ].map((item) => { - return ( - - {({ isActive }) => ( -
- {React.createElement(item.icon, { isActive })} - {item.name} -
- )} -
- ) - })} +
+
+ {navItems.map(item => ( + + ))}
-
- - {({ isActive }) => ( -
- - Explore -
- )} -
- - -
- {(filterStar && ) || } - Favorite +
+ +
+ + S3 Scan
- - -
+ + +
Document
-
setOpen(!open)}> + {/*
setOpen(!open)}> -
+
*/}
) } + +function NavItemRenderer ({ + item, + level = 0, +}: { + item: NavItem + level?: number +}) { + return ( + +
+ {item.path ? ( + + {({ isActive }) => ( +
+ {React.createElement(item.icon, { isActive })} + {item.name} +
+ )} +
+ ) : ( +
+ {React.createElement(item.icon)} + {item.name} +
+ )} + {item.items && ( +
+ +
+ )} +
+ {item.items && ( +
+ {item.items.map(item => ( + + ))} +
+ )} +
+ ) +} + + const NavContainer = styled.nav<{ open?: boolean }>` > div { height: calc(100vh - 60px); - width: ${(props) => (props.open ? '200px' : '57px')}; + width: ${props => (props.open ? '200px' : '57px')}; top: 60px; bottom: 0; @@ -134,44 +188,46 @@ const NavContainer = styled.nav<{ open?: boolean }>` align-items: center; justify-content: space-between; - .active .item { - background: #14171a; - color: #fff; - } - .item { - padding: 10px; - border-radius: 10px; - color: #718096; - position: relative; + .item-container { display: flex; + flex-direction: row; + justify-content: space-between; align-items: center; - gap: 10px; - margin-top: 20px; - overflow: hidden; - > span { - opacity: ${(props) => (props.open ? 1 : 0)}; - position: absolute; - left: 37px; - width: 150px; - transition: opacity 0.09s ease-in-out; - } + gap: 1px; + } + .item { + flex: 1; + padding: 10px; + border-radius: 10px; + color: #718096; + position: relative; + display: flex; + align-items: center; + gap: 10px; + overflow: hidden; + > span { + opacity: ${props => (props.open ? 1 : 0)}; + transition: opacity 0.09s ease-in-out; + } - &.active { - background: #14171a; - color: #fff; + &.active { + background: #14171a; + color: #fff; + } } - } .top { width: 100%; padding: 10px; box-sizing: border-box; - display: block; + display: flex; + flex-direction: column; + gap: 20px; } .bottom { width: 100%; - margin-bottom: 20px; + margin-bottom: 10px; padding: 10px; box-sizing: border-box; display: block; @@ -194,14 +250,22 @@ const NavContainer = styled.nav<{ open?: boolean }>` justify-content: center; cursor: pointer; transition: transform 0.1s ease-in-out; - transform: ${(props) => + transform: ${props => props.open ? `rotate(180deg)` : `rotate(0deg)`}; } } } } +` - .star { - cursor: pointer; +const NavItemBox = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + .sub { + margin-left: 24px; + display: flex; + flex-direction: column; + gap: 6px; } ` diff --git a/packages/client/dashboard/src/container/DappHome.tsx b/packages/client/dashboard/src/container/DappHome.tsx index 85b9babb..ba6a0765 100644 --- a/packages/client/dashboard/src/container/DappHome.tsx +++ b/packages/client/dashboard/src/container/DappHome.tsx @@ -6,7 +6,7 @@ import styled from 'styled-components' import Dashboard from '../components/dapp/home/Dashboard' import Header from '../components/dapp/home/Header' import CheckCircleIcon from '../components/icons/CheckCircleIcon' -import ChevronDown from '../components/icons/CheckronDown' +import ChevronDown from '../components/icons/ChevronDown' import { ChevronRightDoubleWhite } from '../components/icons/ChevronRightDouble' import DisabledIcon from '../components/icons/DisabledIcon' import LightbulbIcon from '../components/icons/LightbulbIcon' From 3f93b1cff116a77ab9562aec499b88e68f62793a Mon Sep 17 00:00:00 2001 From: bufan Date: Tue, 30 Jan 2024 18:44:15 +0800 Subject: [PATCH 107/127] change nav icons --- .../src/components/icons/CompositeIcon.tsx | 16 ++++++++++++++++ .../dashboard/src/components/icons/ModelIcon.tsx | 16 ++++++++++++++++ .../client/dashboard/src/components/nav/Nav.tsx | 6 ++++-- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 packages/client/dashboard/src/components/icons/CompositeIcon.tsx create mode 100644 packages/client/dashboard/src/components/icons/ModelIcon.tsx diff --git a/packages/client/dashboard/src/components/icons/CompositeIcon.tsx b/packages/client/dashboard/src/components/icons/CompositeIcon.tsx new file mode 100644 index 00000000..ca663929 --- /dev/null +++ b/packages/client/dashboard/src/components/icons/CompositeIcon.tsx @@ -0,0 +1,16 @@ +export default function CompositeIcon ({ isActive }: { isActive?: boolean }) { + return ( + + + + ) +} diff --git a/packages/client/dashboard/src/components/icons/ModelIcon.tsx b/packages/client/dashboard/src/components/icons/ModelIcon.tsx new file mode 100644 index 00000000..673443cb --- /dev/null +++ b/packages/client/dashboard/src/components/icons/ModelIcon.tsx @@ -0,0 +1,16 @@ +export default function ModelIcon ({ isActive }: { isActive?: boolean }) { + return ( + + + + ) +} diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index aa217a5d..1da8a20d 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -14,6 +14,8 @@ import NodeIcon from '../icons/NodeIcon' import SdkIcon from '../icons/SdkIcon' import TerminalIcon from '../icons/TerminalIcon' import ChevronDown from '../icons/ChevronDown' +import ModelIcon from '../icons/ModelIcon' +import CompositeIcon from '../icons/CompositeIcon' type NavItem = { path?: string @@ -39,12 +41,12 @@ export default function Nav ({ appId }: { appId: string }) { { path: `/dapp/${appId}/explore/model`, name: 'Models', - icon: ExploreIcon + icon: ModelIcon }, { path: `/dapp/${appId}/explore/composite`, name: 'Composites', - icon: ExploreIcon + icon: CompositeIcon }, { path: `/dapp/${appId}/components`, From 5332d5b8b28fcd89bd86db26d594d77158951d2e Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 31 Jan 2024 16:18:50 +0800 Subject: [PATCH 108/127] reconstruct nav and styles --- packages/client/dashboard/src/App.tsx | 250 ++++++++------- .../src/components/model/CompositeEditor.tsx | 5 +- .../model/CompositePlaygroundGraphiQL.tsx | 6 +- .../model/DappModelAndComposites.tsx | 2 +- .../src/components/model/ModelInstance.tsx | 4 +- .../src/components/model/ModelSDK.tsx | 4 + .../src/components/model/ModelTabs.tsx | 37 --- .../dashboard/src/components/nav/Nav.tsx | 10 +- .../dashboard/src/container/Components.tsx | 3 +- .../src/container/DappDataStatistic.tsx | 25 -- .../{DappModelEditor.tsx => DappEditor.tsx} | 53 +++- .../dashboard/src/container/DappMetrics.tsx | 32 ++ ...ModelPlayground.tsx => DappPlayground.tsx} | 39 ++- .../{DappModelSdk.tsx => DappSdk.tsx} | 26 +- .../src/container/ExploreComposite.tsx | 94 +----- .../dashboard/src/container/ExploreModel.tsx | 87 +----- packages/client/dashboard/src/index.css | 289 ------------------ packages/client/dashboard/src/index.tsx | 10 +- .../client/dashboard/src/styles/index.css | 48 +++ .../dashboard/src/styles/playground.css | 5 - .../src/styles/react-aria/button.css | 25 ++ .../src/styles/{ => react-aria}/checkbox.css | 0 .../src/styles/react-aria/dialog.css | 17 ++ .../dashboard/src/styles/react-aria/index.css | 10 + .../src/styles/{ => react-aria}/menu.css | 25 -- .../dashboard/src/styles/react-aria/modal.css | 54 ++++ .../src/styles/react-aria/popover.css | 100 ++++++ .../dashboard/src/styles/react-aria/tabs.css | 66 ++++ .../src/styles/react-aria/textfield.css | 13 + .../dashboard/src/styles/react-aria/theme.css | 118 +++++++ packages/client/dashboard/src/styles/tab.css | 153 ---------- 31 files changed, 716 insertions(+), 894 deletions(-) delete mode 100644 packages/client/dashboard/src/components/model/ModelTabs.tsx delete mode 100644 packages/client/dashboard/src/container/DappDataStatistic.tsx rename packages/client/dashboard/src/container/{DappModelEditor.tsx => DappEditor.tsx} (73%) create mode 100644 packages/client/dashboard/src/container/DappMetrics.tsx rename packages/client/dashboard/src/container/{DappModelPlayground.tsx => DappPlayground.tsx} (76%) rename packages/client/dashboard/src/container/{DappModelSdk.tsx => DappSdk.tsx} (51%) delete mode 100644 packages/client/dashboard/src/index.css create mode 100644 packages/client/dashboard/src/styles/index.css delete mode 100644 packages/client/dashboard/src/styles/playground.css create mode 100644 packages/client/dashboard/src/styles/react-aria/button.css rename packages/client/dashboard/src/styles/{ => react-aria}/checkbox.css (100%) create mode 100644 packages/client/dashboard/src/styles/react-aria/dialog.css create mode 100644 packages/client/dashboard/src/styles/react-aria/index.css rename packages/client/dashboard/src/styles/{ => react-aria}/menu.css (76%) create mode 100644 packages/client/dashboard/src/styles/react-aria/modal.css create mode 100644 packages/client/dashboard/src/styles/react-aria/popover.css create mode 100644 packages/client/dashboard/src/styles/react-aria/tabs.css create mode 100644 packages/client/dashboard/src/styles/react-aria/textfield.css create mode 100644 packages/client/dashboard/src/styles/react-aria/theme.css delete mode 100644 packages/client/dashboard/src/styles/tab.css diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index d4cf6f9e..e54a3610 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -1,4 +1,9 @@ +import { Us3rAuthWithRainbowkitProvider } from '@us3r-network/auth-with-rainbowkit' +import { ProfileStateProvider } from '@us3r-network/profile' +import dayjs from 'dayjs' +import relativeTime from 'dayjs/plugin/relativeTime' import { useEffect, useState } from 'react' +import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' import { NavLink, Outlet, @@ -7,37 +12,29 @@ import { useLocation, useParams } from 'react-router-dom' -import styled from 'styled-components' -import dayjs from 'dayjs' -import relativeTime from 'dayjs/plugin/relativeTime' -import { Us3rAuthWithRainbowkitProvider } from '@us3r-network/auth-with-rainbowkit' -import { ProfileStateProvider } from '@us3r-network/profile' import { ToastContainer } from 'react-toastify' import 'react-toastify/dist/ReactToastify.min.css' - -import { DappCompositeDto, ModelStream } from './types.d' +import styled from 'styled-components' +import DappModelAndComposites from './components/model/DappModelAndComposites' +import Header from './components/nav/Header' +import Nav from './components/nav/Nav' import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' - -import AppProvider, { useAppCtx } from './context/AppCtx' -import CeramicNodeProvider from './context/CeramicNodeCtx' - -import MyDapps from './container/MyDapps' +import CeramicNodes from './container/CeramicNodes' +import Components from './container/Components' import DappCreate from './container/DappCreate' +import DappEditor from './container/DappEditor' import DappHome from './container/DappHome' import DappInfo from './container/DappInfo' -import DappModelEditor from './container/DappModelEditor' -import DappModelPlayground from './container/DappModelPlayground' -import DappModelSdk from './container/DappModelSdk' -import DappDataStatistic from './container/DappDataStatistic' -import Components from './container/Components' -import CeramicNodes from './container/CeramicNodes' +import DappMetrics from './container/DappMetrics' +import DappPlayground from './container/DappPlayground' +import DappSdk from './container/DappSdk' +import ExploreComposite from './container/ExploreComposite' import ExploreModel from './container/ExploreModel' +import MyDapps from './container/MyDapps' import NoMatch from './container/NoMatch' - -import Header from './components/nav/Header' -import Nav from './components/nav/Nav' -import DappModelAndComposites from './components/model/DappModelAndComposites' -import ExploreComposite from './container/ExploreComposite' +import AppProvider, { useAppCtx } from './context/AppCtx' +import CeramicNodeProvider from './context/CeramicNodeCtx' +import { DappCompositeDto, ModelStream } from './types.d' dayjs.extend(relativeTime) @@ -49,23 +46,19 @@ function Routers () { } /> }> } /> - } /> - }> - } /> - } /> - } /> - } /> - - } /> }> } /> } /> + } /> - }> - } /> - } /> + }> + } /> + } /> + } /> + } /> - } /> + } /> + } /> } /> @@ -174,14 +167,31 @@ const AppContainer = styled.div` } ` -function ModelEditorLayout () { +function BuildLayout () { const [selectModel, setSelectModel] = useState() const [selectComposite, setSelectComposite] = useState() - const { pathname } = useLocation() - + const defaultKey = pathname.split('/explore/')[1] + const PAGES = [ + { + id: 'editor', + label: 'Editor' + }, + { + id: 'playground', + label: 'Playground' + }, + { + id: 'sdk', + label: 'SDK' + }, + { + id: 'metrics', + label: 'Metrics' + } + ] return ( - + { @@ -195,93 +205,99 @@ function ModelEditorLayout () { selectComposite={selectComposite} editable={pathname.includes('model-editor')} /> - - +
+ + {PAGES.map(page => ( +
+ + + +
+ ))} +
+ + {PAGES.map(page => ( + + + {page.label} + + + ))} + +
+
+
+ ) } -const EditorLayoutContainer = styled.div` - margin-top: 25px; - margin-bottom: 25px; - display: flex; - gap: 20px; - - > .list { - flex-grow: 1; - } - - .ops { - flex-grow: 1; - overflow: hidden; - } - - .playground-ops { - flex-grow: 1; - overflow: hidden; - - > div { - height: calc(100vh - 100px); - } - .graphiql-container { - height: 100%; - } - } -` - function ExploreLayout () { const { pathname } = useLocation() + const defaultExploreKey = pathname.split('/explore/')[1] + const EXPLORE_PAGES = [ + { + id: 'model', + label: 'Models' + }, + { + id: 'composite', + label: 'Composites' + }, + { + id: 'components', + label: 'Components' + } + ] return ( - -
- - {({ isActive }) => ( -
- Models -
- )} -
- - {!pathname.includes('favorite') && ( - - {({ isActive }) => ( -
- Composites -
- )} -
- )} -
-
- -
-
+ + + {EXPLORE_PAGES.map(page => ( +
+ + + +
+ ))} +
+ + {EXPLORE_PAGES.map(page => ( + + + {page.label} + + + ))} + +
+
+
) } -const ExploreLayoutContainer = styled.div` - margin-top: 25px; - margin-bottom: 25px; - - .explore-catalog { +const LayoutContainer = styled.div` + width: 100%; + margin-top: 20px; + margin-bottom: 20px; + display: flex; + gap: 20px; + .tab-list { position: absolute; - display: flex; - gap: 20px; - .item { - font-size: 24px; - font-weight: 700; - color: #718096; - > span { - transition: opacity 0.09s ease-in-out; - } - &.active { - background: #14171a; - color: #fff; - } - } + top: 0px; + right: 0px; + } + .tab-panel { + position: absolute; + width: 100%; + top: 0; + margin: 0; + padding: 0; + } + .build-content{ + flex-grow: 1; } ` diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index 77c68cac..aaa0ccf5 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -83,7 +83,7 @@ const Box = styled.div` justify-content: space-between; background-color: #14171a; margin-bottom: 20px; - + height: 100%; > div { display: flex; align-items: center; @@ -100,7 +100,6 @@ const Box = styled.div` ` const EditorBox = styled.div` - height: calc(100vh - 300px); max-height: 800px; background: #14171a; border: 1px solid #39424c; @@ -110,6 +109,7 @@ const EditorBox = styled.div` * { box-sizing: border-box; } + flex: 1; ` const ResultBox = styled.div` @@ -117,6 +117,7 @@ const ResultBox = styled.div` flex-direction: column; gap: 20px; margin-top: 20px; + flex: 0 0 100px; > div { background: #1b1e23; border: 1px solid #39424c; diff --git a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx index 6c401cc2..39b7d46b 100644 --- a/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx +++ b/packages/client/dashboard/src/components/model/CompositePlaygroundGraphiQL.tsx @@ -144,12 +144,8 @@ export default function CompositePlaygroundGraphiQL( const GraphiqlContainer = styled.div` border-radius: 20px; overflow: hidden; - height: calc(100vh - 200px); + height: 100%; > div { height: 100%; - .graphiql-container { - height: 100%; - width: 100%; - } } ` diff --git a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx index 9bb7f702..48872afc 100644 --- a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx +++ b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx @@ -195,7 +195,7 @@ export default function DappModelAndComposites ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [appId]) - const isMetrics = location.pathname.endsWith('statistic') + const isMetrics = location.pathname.endsWith('metrics') const isSdk = location.pathname.endsWith('sdk') const [openModal, setOpenModal] = useState(OPEN_MODAL.NONE) diff --git a/packages/client/dashboard/src/components/model/ModelInstance.tsx b/packages/client/dashboard/src/components/model/ModelInstance.tsx index 1b18cfe7..0fe0d383 100644 --- a/packages/client/dashboard/src/components/model/ModelInstance.tsx +++ b/packages/client/dashboard/src/components/model/ModelInstance.tsx @@ -15,7 +15,7 @@ import PlusIcon from '../icons/PlusIcon' import ModelInstanceFormModal from './ModelInstanceFormModal' import ModelStreamList from './ModelStreamList' -export default function Instance ({ +export default function ModelInstance ({ streamId, network, schema, @@ -271,7 +271,7 @@ export default function Instance ({ onSubmit={() => submitStream()} /> -

{name}

+ {/*

{name}

*/} {composeClientAuthenticated && ( { diff --git a/packages/client/dashboard/src/components/model/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx index f43a405e..00b0994a 100644 --- a/packages/client/dashboard/src/components/model/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -176,6 +176,8 @@ export function Code({ name, content }: { name: string; content: string }) { } const SDKContainer = styled.div` + width: 100%; + height: 100%; display: flex; flex-direction: column; gap: 20px; @@ -194,10 +196,12 @@ const SDKContainer = styled.div` ` const SDKBox = styled.div` + height: 100%; padding: 12px 20px 0 20px; border-radius: 20px; border: 1px solid #39424c; background: #1b1e23; + overflow: scroll; ` const CodeBox = styled.div` diff --git a/packages/client/dashboard/src/components/model/ModelTabs.tsx b/packages/client/dashboard/src/components/model/ModelTabs.tsx deleted file mode 100644 index 4daec5b0..00000000 --- a/packages/client/dashboard/src/components/model/ModelTabs.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * @Author: bufan bufan@hotmail.com - * @Date: 2023-12-15 10:06:03 - * @LastEditors: bufan bufan@hotmail.com - * @LastEditTime: 2023-12-21 14:55:14 - * @FilePath: /s3/packages/client/dashboard/src/components/ModelTabs.tsx - * @Description: - */ -import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' -// import Definition from './Definition' -import ModelSDK from './ModelSDK' - -export default function ModelTabs({ - name, - modelId, -}: { - name: string - modelId: string -}) { - return ( - -
- {name} - - Model Definition - Model SDK - -
- - {/* */} - - - - -
- ) -} diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index 1da8a20d..4d4819a0 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -49,7 +49,7 @@ export default function Nav ({ appId }: { appId: string }) { icon: CompositeIcon }, { - path: `/dapp/${appId}/components`, + path: `/dapp/${appId}/explore/components`, name: 'Components', icon: ComponentIcon } @@ -61,22 +61,22 @@ export default function Nav ({ appId }: { appId: string }) { icon: InfoIcon, items: [ { - path: `/dapp/${appId}/model-editor`, + path: `/dapp/${appId}/build/editor`, name: 'Compose', icon: LayoutIcon }, { - path: `/dapp/${appId}/model-playground`, + path: `/dapp/${appId}/build/playground`, name: 'Playground', icon: TerminalIcon }, { - path: `/dapp/${appId}/model-sdk`, + path: `/dapp/${appId}/build/sdk`, name: 'SDK', icon: SdkIcon }, { - path: `/dapp/${appId}/statistic`, + path: `/dapp/${appId}/build/metrics`, name: 'Metrics', icon: ChartIcon } diff --git a/packages/client/dashboard/src/container/Components.tsx b/packages/client/dashboard/src/container/Components.tsx index 44ddbcb4..0e160033 100644 --- a/packages/client/dashboard/src/container/Components.tsx +++ b/packages/client/dashboard/src/container/Components.tsx @@ -70,7 +70,6 @@ export default function Components() { } const Box = styled.div` - margin: 25px 0; display: flex; flex-direction: column; gap: 20px; @@ -110,7 +109,7 @@ const BannerDesc = styled.ul` font-weight: 500; font-size: 18px; - line-height: 21px; + line-height: 24px; color: #ffffff; diff --git a/packages/client/dashboard/src/container/DappDataStatistic.tsx b/packages/client/dashboard/src/container/DappDataStatistic.tsx deleted file mode 100644 index 6baddbd2..00000000 --- a/packages/client/dashboard/src/container/DappDataStatistic.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useOutletContext } from 'react-router-dom' -import Instance from '../components/model/ModelInstance' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { ModelStream, Network } from '../types.d' - -export default function DappDataStatistic() { - const { selectModel } = useOutletContext<{ - selectModel: ModelStream - }>() - const { selectedDapp } = useSelectedDapp() - - if (selectModel) { - return ( -
- -
- ) - } - return null -} diff --git a/packages/client/dashboard/src/container/DappModelEditor.tsx b/packages/client/dashboard/src/container/DappEditor.tsx similarity index 73% rename from packages/client/dashboard/src/container/DappModelEditor.tsx rename to packages/client/dashboard/src/container/DappEditor.tsx index 36e37957..6dfff747 100644 --- a/packages/client/dashboard/src/container/DappModelEditor.tsx +++ b/packages/client/dashboard/src/container/DappEditor.tsx @@ -14,7 +14,7 @@ import { } from '../types.d' import { schemas } from '../utils/composedb-types/schemas' -export default function DappModelEditor () { +export default function DappEditor () { const { selectedDapp } = useSelectedDapp() const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream @@ -23,26 +23,31 @@ export default function DappModelEditor () { if (selectModel) { return ( - -
- {selectModel.stream_content?.name} -
- -
+ +
+ {selectModel.stream_content?.name} +
+ +
) } if (selectComposite) { return ( - -
+ +
{selectComposite.name}
- - +
+ +
+
) } return null @@ -121,8 +126,26 @@ const Loading = styled.div` color: gray; ` -const Box = styled.div` +export const BuildContentBox = styled.div` display: flex; flex-direction: column; gap: 20px; + padding-top: 10px; + + .title-bar { + border-bottom: none; + position: relative; + top: 0; + display: flex; + align-items: center; + gap: 20px; + height: 30px; + > span { + font-weight: 700; + font-size: 24px; + } + } + .content-box { + height: calc(100vh - 160px); + } ` diff --git a/packages/client/dashboard/src/container/DappMetrics.tsx b/packages/client/dashboard/src/container/DappMetrics.tsx new file mode 100644 index 00000000..c64e14ce --- /dev/null +++ b/packages/client/dashboard/src/container/DappMetrics.tsx @@ -0,0 +1,32 @@ +import { useOutletContext } from 'react-router-dom' +import ModelInstance from '../components/model/ModelInstance' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { ModelStream, Network } from '../types.d' +import { BuildContentBox } from './DappEditor' + +export default function DappMetrics () { + const { selectModel } = useOutletContext<{ + selectModel: ModelStream + }>() + const { selectedDapp } = useSelectedDapp() + + if (selectModel) { + const name = selectModel.stream_content.name + return ( + +
+ {name} Streams +
+
+ +
+
+ ) + } + return null +} diff --git a/packages/client/dashboard/src/container/DappModelPlayground.tsx b/packages/client/dashboard/src/container/DappPlayground.tsx similarity index 76% rename from packages/client/dashboard/src/container/DappModelPlayground.tsx rename to packages/client/dashboard/src/container/DappPlayground.tsx index 217fcb9a..64c083e4 100644 --- a/packages/client/dashboard/src/container/DappModelPlayground.tsx +++ b/packages/client/dashboard/src/container/DappPlayground.tsx @@ -12,8 +12,9 @@ import { Network } from '../types.d' import useSelectedDapp from '../hooks/useSelectedDapp' +import { BuildContentBox } from './DappEditor' -export default function DappModelPlayground () { +export default function DappPlayground () { const { selectModel, selectComposite } = useOutletContext<{ selectModel: ModelStream selectComposite: DappCompositeDto @@ -22,23 +23,33 @@ export default function DappModelPlayground () { const { selectedDapp } = useSelectedDapp() if (selectModel) { return ( -
- -
+ +
+ {selectModel.stream_content.name} +
+
+ +
+
) } if (selectComposite) { return ( -
- -
+ +
+ {selectComposite.name} +
+
+ +
+
) } return null diff --git a/packages/client/dashboard/src/container/DappModelSdk.tsx b/packages/client/dashboard/src/container/DappSdk.tsx similarity index 51% rename from packages/client/dashboard/src/container/DappModelSdk.tsx rename to packages/client/dashboard/src/container/DappSdk.tsx index a4c63ea6..910095b0 100644 --- a/packages/client/dashboard/src/container/DappModelSdk.tsx +++ b/packages/client/dashboard/src/container/DappSdk.tsx @@ -1,9 +1,9 @@ import { useOutletContext } from 'react-router-dom' -import styled from 'styled-components' import ModelSDK from '../components/model/ModelSDK' -import { DappCompositeDto, ModelStream } from '../types.d' +import { DappCompositeDto, ModelStream } from '../types' +import { BuildContentBox } from './DappEditor' -export default function DappModelSdk() { +export default function DappSdk () { const { selectModel } = useOutletContext<{ selectModel: ModelStream selectComposite: DappCompositeDto @@ -14,22 +14,16 @@ export default function DappModelSdk() { const modelId = selectModel.stream_id return ( -
- -
- {name}SDK -
+ +
+ {name} SDK +
+
- -
+
+ ) } return null } - -const SDKContainer = styled.div` - display: flex; - flex-direction: column; - gap: 20px; -` diff --git a/packages/client/dashboard/src/container/ExploreComposite.tsx b/packages/client/dashboard/src/container/ExploreComposite.tsx index 19632cb1..1dab529c 100644 --- a/packages/client/dashboard/src/container/ExploreComposite.tsx +++ b/packages/client/dashboard/src/container/ExploreComposite.tsx @@ -1,8 +1,8 @@ import { useState } from 'react' import { useSearchParams } from 'react-router-dom' -import styled from 'styled-components' import Search from '../components/common/Search' import { CompositeList } from '../components/model/ExploreCompositeList' +import { ExploreContainer } from './ExploreModel' export default function ExploreComposite () { const [searchParams] = useSearchParams() @@ -10,10 +10,8 @@ export default function ExploreComposite () { searchParams.get('searchText') || '' ) return ( - +
- {/*
ComposeDB Models
*/} -
- + ) } - -const ExploreModelContainer = styled.div` - margin-top: 25px; - margin-bottom: 25px; - .no-more { - padding: 20px; - text-align: center; - color: gray; - } - - .mobile-models-box { - margin-bottom: 20px; - } - - .title-box { - display: flex; - align-items: center; - justify-content: end; - margin-bottom: 20px; - .tools { - display: flex; - align-items: center; - gap: 15px; - - > button { - border-radius: 100px; - background: #14171a; - font-size: 14px; - line-height: 20px; - text-align: center; - font-weight: 400; - color: #a0aec0; - text-transform: capitalize; - background: #ffffff; - font-weight: 500; - color: #14171a; - cursor: pointer; - border: none; - outline: none; - /* width: 100px; */ - padding: 0 15px; - height: 36px; - - &.star-btn { - width: 52px; - height: 40px; - - background: #1a1e23; - border: 1px solid #39424c; - border-radius: 100px; - display: inline-flex; - align-items: center; - justify-items: center; - } - } - } - } - - .title { - > span { - font-size: 22px; - font-weight: 700; - line-height: 40px; - } - - /* padding: 0 0 20px 0; */ - position: sticky; - background-color: #14171a; - top: 0; - z-index: 100; - - display: flex; - justify-content: space-between; - align-items: center; - font-weight: 700; - font-size: 24px; - line-height: 28px; - font-style: italic; - - color: #ffffff; - } - - .react-aria-Button { - font-size: 18px; - } -` diff --git a/packages/client/dashboard/src/container/ExploreModel.tsx b/packages/client/dashboard/src/container/ExploreModel.tsx index 47389326..2023a5f1 100644 --- a/packages/client/dashboard/src/container/ExploreModel.tsx +++ b/packages/client/dashboard/src/container/ExploreModel.tsx @@ -13,10 +13,8 @@ export default function ExploreModel () { searchParams.get('searchText') || '' ) return ( - +
- {/*
ComposeDB Models
*/} -
- + ) } -const ExploreModelContainer = styled.div` - margin-top: 25px; - margin-bottom: 25px; - .no-more { - padding: 20px; - text-align: center; - color: gray; - } - - .mobile-models-box { - margin-bottom: 20px; - } - +export const ExploreContainer = styled.div` .title-box { display: flex; align-items: center; - justify-content: end; + justify-content: start; margin-bottom: 20px; - .tools { - display: flex; - align-items: center; - gap: 15px; - - > button { - border-radius: 100px; - background: #14171a; - font-size: 14px; - line-height: 20px; - text-align: center; - font-weight: 400; - color: #a0aec0; - text-transform: capitalize; - background: #ffffff; - font-weight: 500; - color: #14171a; - cursor: pointer; - border: none; - outline: none; - /* width: 100px; */ - padding: 0 15px; - height: 36px; - - &.star-btn { - width: 52px; - height: 40px; - - background: #1a1e23; - border: 1px solid #39424c; - border-radius: 100px; - display: inline-flex; - align-items: center; - justify-items: center; - } - } - } - } - - .title { - > span { - font-size: 22px; - font-weight: 700; - line-height: 40px; - } - - /* padding: 0 0 20px 0; */ - position: sticky; - background-color: #14171a; - top: 0; - z-index: 100; - - display: flex; - justify-content: space-between; - align-items: center; - font-weight: 700; - font-size: 24px; - line-height: 28px; - font-style: italic; - - color: #ffffff; - } - - .react-aria-Button { - font-size: 18px; } ` diff --git a/packages/client/dashboard/src/index.css b/packages/client/dashboard/src/index.css deleted file mode 100644 index c8ae0f5a..00000000 --- a/packages/client/dashboard/src/index.css +++ /dev/null @@ -1,289 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background: #14171a; - color: #fff; -} - -html, -body, -#root { - font-family: 'Rubik'; -} - -a, -a:hover { - text-decoration: none; -} - -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; -} - -*::-webkit-scrollbar { - display: none; -} - -button { - background: none; - border: none; - outline: none; - cursor: pointer; - &:disabled { - cursor: default; - } -} - -.react-aria-ModalOverlay { - position: fixed; - top: 0; - left: 0; - width: 100vw; - z-index: 100000; - height: var(--visual-viewport-height); - background: rgba(0 0 0 / 0.5); - backdrop-filter: blur(12px); - overflow: scroll; - - &[data-entering] { - animation: fade 200ms; - } - - &[data-exiting] { - animation: fade 150ms reverse ease-in; - } -} - -.confirm-modal { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; -} - -.react-aria-Modal { - box-shadow: 0 8px 20px rgba(0 0 0 / 0.1); - border-radius: 6px; - background: var(--page-background); - border: 1px solid var(--spectrum-global-color-gray-300); - outline: none; - padding: 30px; - position: relative; - - &[data-entering] { - animation: zoom 300ms cubic-bezier(0.175, 0.885, 0.32, 1.275); - } -} - -@keyframes fade { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes zoom { - from { - transform: scale(0.8); - } - - to { - transform: scale(1); - } -} - -.react-aria-Dialog { - outline: none; - - .react-aria-Heading { - line-height: 1em; - margin-top: 0; - } - - .react-aria-Button { - margin-top: 20px; - } - - .favorite { - margin: 0; - } -} - -.react-aria-Button { - background: var(--spectrum-global-color-gray-50); - border: 1px solid var(--spectrum-global-color-gray-400); - border-radius: 4px; - color: var(--spectrum-alias-text-color); - appearance: none; - vertical-align: middle; - font-size: 1.2rem; - text-align: center; - margin: 0; - outline: none; - transition: border-color 200ms; - - &[data-hovered] { - border-color: var(--spectrum-global-color-gray-500); - } - - &[data-pressed] { - box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1); - background: var(--spectrum-global-color-gray-100); - border-color: var(--spectrum-global-color-gray-600); - } - - &[data-focus-visible] { - border-color: slateblue; - box-shadow: 0 0 0 1px slateblue; - } -} - -.react-aria-TextField { - margin-bottom: 8px; - - .react-aria-Label { - display: inline-block; - width: 5.357rem; - } - - .react-aria-Input { - font-size: 16px; - } -} - -/* Popover */ -.react-aria-Popover, -.list-popover { - background: #1b1e23; - border: 1px solid #39424c; - border-radius: 10px; - z-index: 200; - outline: none; - width: 200px; - - &[data-placement='top'] { - margin-bottom: 6px; - --origin: translateY(8px); - } - - &[data-placement='bottom'] { - margin-top: 6px; - --origin: translateY(-8px); - - & .react-aria-OverlayArrow svg { - transform: rotate(180deg); - } - } - - &[data-placement='right'] { - margin-left: 6px; - --origin: translateX(-8px); - - & .react-aria-OverlayArrow svg { - transform: rotate(90deg); - } - } - - &[data-placement='left'] { - margin-right: 6px; - --origin: translateX(8px); - - & .react-aria-OverlayArrow svg { - transform: rotate(-90deg); - } - } - - &[data-entering] { - animation: slide 200ms; - } - - &[data-exiting] { - animation: slide 200ms reverse ease-in; - } -} - -.react-aria-Popover a { - text-decoration: none; -} - -.react-aria-Popover .popover-item { - color: #718096; -} - -.react-aria-Popover .popover-item button { - font-weight: 400; - font-size: 16px; - line-height: 19px; - padding: 20px; - color: inherit; - margin: 0; - padding: 20px; - width: 100%; - height: 100%; - text-align: start; -} - -.react-aria-Popover .popover-item:hover { - color: #ffffff; - background: #14171a; - border-radius: 20px; -} - -@keyframes slide { - from { - transform: var(--origin); - opacity: 0; - } - - to { - transform: translateY(0); - opacity: 1; - } -} - -.react-aria-Dialog { - outline: none; -} - -.react-aria-Button { - background: var(--spectrum-global-color-gray-50); - border: 1px solid var(--spectrum-global-color-gray-400); - border-radius: 4px; - color: var(--spectrum-alias-text-color); - appearance: none; - vertical-align: middle; - font-size: 1.2rem; - text-align: center; - margin: 0; - outline: none; - padding: 6px; - transition: border-color 200ms; - - &[data-hovered] { - border-color: var(--spectrum-global-color-gray-500); - } - - &[data-pressed] { - box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1); - background: var(--spectrum-global-color-gray-100); - border-color: var(--spectrum-global-color-gray-600); - } - - &[data-focus-visible] { - border-color: slateblue; - box-shadow: 0 0 0 1px slateblue; - } -} - -@media (forced-colors: active) { - .react-aria-Popover {} -} \ No newline at end of file diff --git a/packages/client/dashboard/src/index.tsx b/packages/client/dashboard/src/index.tsx index 26d7472d..42975897 100644 --- a/packages/client/dashboard/src/index.tsx +++ b/packages/client/dashboard/src/index.tsx @@ -1,19 +1,15 @@ import React from 'react' import ReactDOM from 'react-dom/client' import { BrowserRouter } from 'react-router-dom' - import App from './App' import reportWebVitals from './reportWebVitals' -import './index.css' -import './styles/tab.css' -import './styles/playground.css' -import './styles/menu.css' -import './styles/checkbox.css' -import './styles/prism-vsc-dark-plus.css' +import './styles/index.css' +import './styles/react-aria/index.css' import '@graphiql/plugin-explorer/dist/style.css' import 'graphiql/graphiql.css' +import './styles/prism-vsc-dark-plus.css' const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement) root.render( diff --git a/packages/client/dashboard/src/styles/index.css b/packages/client/dashboard/src/styles/index.css new file mode 100644 index 00000000..0fe8edad --- /dev/null +++ b/packages/client/dashboard/src/styles/index.css @@ -0,0 +1,48 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: #14171a; + color: #fff; +} + +html, +body, +#root { + font-family: 'Rubik'; +} + +a, +a:hover { + text-decoration: none; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +*::-webkit-scrollbar { + display: none; +} + +button { + background: none; + border: none; + outline: none; + cursor: pointer; + &:disabled { + cursor: default; + } +} + +.confirm-modal { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; +} diff --git a/packages/client/dashboard/src/styles/playground.css b/packages/client/dashboard/src/styles/playground.css deleted file mode 100644 index a7c7b818..00000000 --- a/packages/client/dashboard/src/styles/playground.css +++ /dev/null @@ -1,5 +0,0 @@ -.graphiql-container { - height: 100%; - width: 100%; - } - \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/react-aria/button.css b/packages/client/dashboard/src/styles/react-aria/button.css new file mode 100644 index 00000000..386f105b --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/button.css @@ -0,0 +1,25 @@ +.react-aria-Button { + background: var(--spectrum-global-color-gray-50); + border: 1px solid var(--spectrum-global-color-gray-400); + color: var(--spectrum-alias-text-color); + border-radius: 4px; + appearance: none; + vertical-align: middle; + font-size: 1.2rem; + text-align: center; + margin: 0; + outline: none; + padding: 0.286rem 0.857rem; + + &[data-pressed] { + box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1); + background: var(--spectrum-global-color-gray-100); + border-color: var(--spectrum-global-color-gray-500); + } + + &[data-focus-visible] { + border-color: #14171a; + box-shadow: 0 0 0 1px #14171a; + } + } + \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/checkbox.css b/packages/client/dashboard/src/styles/react-aria/checkbox.css similarity index 100% rename from packages/client/dashboard/src/styles/checkbox.css rename to packages/client/dashboard/src/styles/react-aria/checkbox.css diff --git a/packages/client/dashboard/src/styles/react-aria/dialog.css b/packages/client/dashboard/src/styles/react-aria/dialog.css new file mode 100644 index 00000000..abf39807 --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/dialog.css @@ -0,0 +1,17 @@ +/* Dialog */ +.react-aria-Dialog { + outline: none; + + .react-aria-Heading { + line-height: 1em; + margin-top: 0; + } + + .react-aria-Button { + margin-top: 20px; + } + + .favorite { + margin: 0; + } +} diff --git a/packages/client/dashboard/src/styles/react-aria/index.css b/packages/client/dashboard/src/styles/react-aria/index.css new file mode 100644 index 00000000..5b3fddc3 --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/index.css @@ -0,0 +1,10 @@ + +@import "theme.css"; +@import "button.css"; +@import "checkbox.css"; +@import 'dialog.css'; +@import 'menu.css'; +@import 'modal.css'; +@import 'popover.css'; +@import 'tabs.css'; +@import 'textfield.css'; diff --git a/packages/client/dashboard/src/styles/menu.css b/packages/client/dashboard/src/styles/react-aria/menu.css similarity index 76% rename from packages/client/dashboard/src/styles/menu.css rename to packages/client/dashboard/src/styles/react-aria/menu.css index 27a2e61b..6fd7eff3 100644 --- a/packages/client/dashboard/src/styles/menu.css +++ b/packages/client/dashboard/src/styles/react-aria/menu.css @@ -1,28 +1,3 @@ -.react-aria-Button { - background: var(--spectrum-global-color-gray-50); - border: 1px solid var(--spectrum-global-color-gray-400); - color: var(--spectrum-alias-text-color); - border-radius: 4px; - appearance: none; - vertical-align: middle; - font-size: 1.2rem; - text-align: center; - margin: 0; - outline: none; - padding: 0.286rem 0.857rem; - - &[data-pressed] { - box-shadow: inset 0 1px 2px rgb(0 0 0 / 0.1); - background: var(--spectrum-global-color-gray-100); - border-color: var(--spectrum-global-color-gray-500); - } - - &[data-focus-visible] { - border-color: #14171a; - box-shadow: 0 0 0 1px #14171a; - } - } - .react-aria-Menu { --highlight-background: #14171a; --highlight-foreground: white; diff --git a/packages/client/dashboard/src/styles/react-aria/modal.css b/packages/client/dashboard/src/styles/react-aria/modal.css new file mode 100644 index 00000000..55ee1c40 --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/modal.css @@ -0,0 +1,54 @@ +/* Modal */ +.react-aria-ModalOverlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + z-index: 100000; + height: var(--visual-viewport-height); + background: rgba(0 0 0 / 0.5); + backdrop-filter: blur(12px); + overflow: scroll; + + &[data-entering] { + animation: fade 200ms; + } + + &[data-exiting] { + animation: fade 150ms reverse ease-in; + } +} + +.react-aria-Modal { + box-shadow: 0 8px 20px rgba(0 0 0 / 0.1); + border-radius: 6px; + background: var(--page-background); + border: 1px solid var(--spectrum-global-color-gray-300); + outline: none; + padding: 30px; + position: relative; + + &[data-entering] { + animation: zoom 300ms cubic-bezier(0.175, 0.885, 0.32, 1.275); + } +} + +@keyframes fade { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes zoom { + from { + transform: scale(0.8); + } + + to { + transform: scale(1); + } +} diff --git a/packages/client/dashboard/src/styles/react-aria/popover.css b/packages/client/dashboard/src/styles/react-aria/popover.css new file mode 100644 index 00000000..ccc9d2dd --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/popover.css @@ -0,0 +1,100 @@ +/* Popover */ +.react-aria-Popover, +.list-popover { + background: #1b1e23; + border: 1px solid #39424c; + border-radius: 10px; + z-index: 200; + outline: none; + width: 200px; + + &[data-placement='top'] { + margin-bottom: 6px; + --origin: translateY(8px); + } + + &[data-placement='bottom'] { + margin-top: 6px; + --origin: translateY(-8px); + + & .react-aria-OverlayArrow svg { + transform: rotate(180deg); + } + } + + &[data-placement='right'] { + margin-left: 6px; + --origin: translateX(-8px); + + & .react-aria-OverlayArrow svg { + transform: rotate(90deg); + } + } + + &[data-placement='left'] { + margin-right: 6px; + --origin: translateX(8px); + + & .react-aria-OverlayArrow svg { + transform: rotate(-90deg); + } + } + + &[data-entering] { + animation: slide 200ms; + } + + &[data-exiting] { + animation: slide 200ms reverse ease-in; + } +} + +.react-aria-Popover a { + text-decoration: none; +} + +.react-aria-Popover .popover-item { + color: #718096; +} + +.react-aria-Popover .popover-item button { + font-weight: 400; + font-size: 16px; + line-height: 19px; + padding: 20px; + color: inherit; + margin: 0; + padding: 20px; + width: 100%; + height: 100%; + text-align: start; +} + +.react-aria-Popover .popover-item:hover { + color: #ffffff; + background: #14171a; + border-radius: 20px; +} + +@keyframes slide { + from { + transform: var(--origin); + opacity: 0; + } + + to { + transform: translateY(0); + opacity: 1; + } +} + +@media (forced-colors: active) { + .react-aria-Popover {} +} + +:root { + --origin: translateY(8px); + --text-color-base: white; + --text-color: white; + --text-color-hover: white; +} \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/react-aria/tabs.css b/packages/client/dashboard/src/styles/react-aria/tabs.css new file mode 100644 index 00000000..d8958d0e --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/tabs.css @@ -0,0 +1,66 @@ +/* Tabs */ +.react-aria-Tabs { + position: relative; + --text-color-base:black; + --highlight-background: white; + width: 100%; +} + +.react-aria-TabList { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + + &[data-orientation=horizontal] { + border: 1px solid var(--border-color); + border-radius: 999px; + } +} + +.react-aria-Tab { + padding: 10px 20px; + cursor: default; + outline: none; + position: relative; + color: var(--text-color-base); + transition: color 200ms; + --border-color: transparent; + forced-color-adjust: none; + border-radius: 999px; + a { + color: var(--text-color); + } + + &[data-hovered], + &[data-focused] { + color: var(--text-color-hover); + } + + &[data-selected] { + background-color: var(--highlight-background); + color: var(--text-color-base); + a { + color: var(--text-color-base); + } + } + + &[data-disabled] { + color: var(--text-color-disabled); + &[data-selected] { + --border-color: var(--text-color-disabled); + } + } + + &[data-focus-visible]:after { + content: ''; + position: absolute; + inset: 4px; + border-radius: 4px; + border: 2px solid var(--focus-ring-color); + } +} + +.react-aria-TabPanel { + +} \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/react-aria/textfield.css b/packages/client/dashboard/src/styles/react-aria/textfield.css new file mode 100644 index 00000000..66a6accd --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/textfield.css @@ -0,0 +1,13 @@ +/* TextField */ +.react-aria-TextField { + margin-bottom: 8px; + + .react-aria-Label { + display: inline-block; + width: 5.357rem; + } + + .react-aria-Input { + font-size: 16px; + } +} \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/react-aria/theme.css b/packages/client/dashboard/src/styles/react-aria/theme.css new file mode 100644 index 00000000..5777da1f --- /dev/null +++ b/packages/client/dashboard/src/styles/react-aria/theme.css @@ -0,0 +1,118 @@ +/* color themes for dark and light modes, generated with Leonardo. + * Light: https://leonardocolor.io/theme.html?name=Light&config=%7B%22baseScale%22%3A%22Gray%22%2C%22colorScales%22%3A%5B%7B%22name%22%3A%22Gray%22%2C%22colorKeys%22%3A%5B%22%23000000%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%2C%7B%22name%22%3A%22Purple%22%2C%22colorKeys%22%3A%5B%22%235e30eb%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%2C%7B%22name%22%3A%22Red%22%2C%22colorKeys%22%3A%5B%22%23e32400%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%5D%2C%22lightness%22%3A98%2C%22contrast%22%3A1%2C%22saturation%22%3A100%2C%22formula%22%3A%22wcag2%22%7D */ + :root { + --background-color: #f8f8f8; + --gray-50: #ffffff; + --gray-100: #d0d0d0; + --gray-200: #afafaf; + --gray-300: #8f8f8f; + --gray-400: #717171; + --gray-500: #555555; + --gray-600: #393939; + --purple-100: #d5c9fa; + --purple-200: #b8a3f6; + --purple-300: #997cf2; + --purple-400: #7a54ef; + --purple-500: #582ddc; + --purple-600: #3c1e95; + --red-100: #f7c4ba; + --red-200: #f29887; + --red-300: #eb664d; + --red-400: #de2300; + --red-500: #a81b00; + --red-600: #731200; + --highlight-hover: rgb(0 0 0 / 0.07); + --highlight-pressed: rgb(0 0 0 / 0.15); + } + + /* Dark: https://leonardocolor.io/theme.html?name=Dark&config=%7B%22baseScale%22%3A%22Gray%22%2C%22colorScales%22%3A%5B%7B%22name%22%3A%22Gray%22%2C%22colorKeys%22%3A%5B%22%23000000%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%2C%7B%22name%22%3A%22Purple%22%2C%22colorKeys%22%3A%5B%22%235e30eb%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%2C%7B%22name%22%3A%22Red%22%2C%22colorKeys%22%3A%5B%22%23e32400%22%5D%2C%22colorspace%22%3A%22RGB%22%2C%22ratios%22%3A%5B%22-1.12%22%2C%221.45%22%2C%222.05%22%2C%223.02%22%2C%224.54%22%2C%227%22%2C%2210.86%22%5D%2C%22smooth%22%3Afalse%7D%5D%2C%22lightness%22%3A11%2C%22contrast%22%3A1%2C%22saturation%22%3A100%2C%22formula%22%3A%22wcag2%22%7D */ + @media (prefers-color-scheme: dark) { + :root { + --background-color: #1d1d1d; + --gray-50: #101010; + --gray-100: #393939; + --gray-200: #4f4f4f; + --gray-300: #686868; + --gray-400: #848484; + --gray-500: #a7a7a7; + --gray-600: #cfcfcf; + --purple-100: #3c1e95; + --purple-200: #522acd; + --purple-300: #6f46ed; + --purple-400: #8e6ef1; + --purple-500: #b099f5; + --purple-600: #d5c8fa; + --red-100: #721200; + --red-200: #9c1900; + --red-300: #cc2000; + --red-400: #e95034; + --red-500: #f08c79; + --red-600: #f7c3ba; + --highlight-hover: rgb(255 255 255 / 0.1); + --highlight-pressed: rgb(255 255 255 / 0.2); + } + } + + /* Semantic colors */ + :root { + --focus-ring-color: var(--purple-400); + --text-color: var(--gray-600); + --text-color-base: var(--gray-500); + --text-color-hover: var(--gray-600); + --text-color-disabled: var(--gray-200); + --text-color-placeholder: var(--gray-400); + --link-color: var(--purple-500); + --link-color-secondary: var(--gray-500); + --link-color-pressed: var(--purple-600); + --border-color: var(--gray-300); + --border-color-hover: var(--gray-400); + --border-color-pressed: var(--gray-400); + --border-color-disabled: var(--gray-100); + --field-background: var(--gray-50); + --field-text-color: var(--gray-600); + --overlay-background: var(--gray-50); + --button-background: var(--gray-50); + --button-background-pressed: var(--background-color); + /* these colors are the same between light and dark themes + * to ensure contrast with the foreground color */ + --highlight-background: #6f46ed; /* purple-300 from dark theme, 3.03:1 against background-color */ + --highlight-background-pressed: #522acd; /* purple-200 from dark theme */ + --highlight-background-invalid: #cc2000; /* red-300 from dark theme */ + --highlight-foreground: white; /* 5.56:1 against highlight-background */ + --highlight-foreground-pressed: #ddd; + --highlight-overlay: rgb(from #6f46ed r g b / 15%); + --invalid-color: var(--red-400); + --invalid-color-pressed: var(--red-500); + } + + /* Windows high contrast mode overrides */ + @media (forced-colors: active) { + :root { + --background-color: Canvas; + --focus-ring-color: Highlight; + --text-color: ButtonText; + --text-color-base: ButtonText; + --text-color-hover: ButtonText; + --text-color-disabled: GrayText; + --text-color-placeholder: ButtonText; + --link-color: LinkText; + --link-color-secondary: LinkText; + --link-color-pressed: LinkText; + --border-color: ButtonBorder; + --border-color-hover: ButtonBorder; + --border-color-pressed: ButtonBorder; + --border-color-disabled: GrayText; + --field-background: Field; + --field-text-color: FieldText; + --overlay-background: Canvas; + --button-background: ButtonFace; + --button-background-pressed: ButtonFace; + --highlight-background: Highlight; + --highlight-background-pressed: Highlight; + --highlight-background-invalid: LinkText; + --highlight-foreground: HighlightText; + --highlight-foreground-pressed: HighlightText; + --invalid-color: LinkText; + --invalid-color-pressed: LinkText; + } + } \ No newline at end of file diff --git a/packages/client/dashboard/src/styles/tab.css b/packages/client/dashboard/src/styles/tab.css deleted file mode 100644 index a1f0cdf3..00000000 --- a/packages/client/dashboard/src/styles/tab.css +++ /dev/null @@ -1,153 +0,0 @@ -.react-aria-Tabs { - --highlight-color: #fff; - --text-color: var(--spectrum-global-color-gray-700); - --text-color-hover: var(--spectrum-global-color-gray-800); - --text-color-selected: var(--spectrum-global-color-gray-900); - --text-color-disabled: var(--spectrum-alias-text-color-disabled); - - display: flex; - height: 100%; - - &[data-orientation='horizontal'] { - flex-direction: column; - } - - &[data-orientation='vertical'] { - flex-direction: row; - } -} - -.title-bar, -.dapp-title-bar { - display: flex; - align-items: center; - justify-content: space-between; - border-bottom: 1px solid #39424c; - position: sticky; - top: 60px; - z-index: 100; - background-color: #14171a; -} - -.dapp-title-bar { - border-bottom: none; - position: relative; - top: 0; -} - -.title-bar > span, -.dapp-title-bar > span { - font-style: italic; - font-weight: 700; - font-size: 24px; - line-height: 28px; - color: #ffffff; -} - -.react-aria-TabList { - display: flex; - - &[aria-orientation='horizontal'] { - .react-aria-Tab { - border-bottom: 3px solid var(--border-color, transparent); - } - } - - &[aria-orientation='vertical'] { - flex-direction: column; - /* border-right: 1px solid gray; */ - - .react-aria-Tab { - border-right: 3px solid var(--border-color, transparent); - } - } -} - -.dapp-title-bar .react-aria-TabList { - border: 1px solid #39424c; - border-radius: 100px; - padding: 2px; - - &[aria-orientation='horizontal'] { - .react-aria-Tab { - border-bottom: none; - } - } -} - -.react-aria-Tab { - padding: 10px; - cursor: default; - outline: none; - position: relative; - font-weight: 700; - font-size: 18px; - line-height: 21px; - color: #718096; - cursor: pointer; - transition: color 200ms; - padding: 20px 15px; - - &[data-hovered], - &:focus { - color: var(--text-color-hover); - } - - &[aria-selected='true'] { - --border-color: var(--highlight-color); - color: var(--text-color-selected); - } - - &[aria-disabled] { - color: var(--text-color-disabled); - &[aria-selected='true'] { - --border-color: var(--text-color-disabled); - } - } - - &[data-focus-visible]:after { - content: ''; - position: absolute; - inset: 4px; - border-radius: 4px; - border: 2px solid var(--highlight-color); - } -} - -.dapp-title-bar .react-aria-Tab { - padding: 6px 20px; - font-weight: 400; - font-size: 16px; - line-height: 24px; - &[aria-selected='true'] { - color: #14171A; - background-color: #FFFFFF; - border-radius: 100px; - } -} - -.react-aria-TabPanel { - margin-top: 4px; - padding: 20px 0 0 0; - border-radius: 4px; - outline: none; - flex-grow: 1; - - &[data-focus-visible] { - box-shadow: inset 0 0 0 2px var(--highlight-color); - } -} - -@media (forced-colors: active) { - .react-aria-Tabs { - forced-color-adjust: none; - color: CanvasText; - - --highlight-color: Highlight; - --text-color: ButtonText; - --text-color-hover: ButtonText; - --text-color-selected: ButtonText; - --text-color-disabled: GrayText; - } -} - From 8df7f9f9bf659aff188f6834c1dae048d79eba32 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 31 Jan 2024 16:18:58 +0800 Subject: [PATCH 109/127] reconstruct nav and styles --- packages/client/dashboard/src/App.tsx | 2 +- packages/client/dashboard/src/hooks/useGuideSteps.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index e54a3610..6a31fca1 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -171,7 +171,7 @@ function BuildLayout () { const [selectModel, setSelectModel] = useState() const [selectComposite, setSelectComposite] = useState() const { pathname } = useLocation() - const defaultKey = pathname.split('/explore/')[1] + const defaultKey = pathname.split('/build/')[1] const PAGES = [ { id: 'editor', diff --git a/packages/client/dashboard/src/hooks/useGuideSteps.ts b/packages/client/dashboard/src/hooks/useGuideSteps.ts index b576d504..d04e70f3 100644 --- a/packages/client/dashboard/src/hooks/useGuideSteps.ts +++ b/packages/client/dashboard/src/hooks/useGuideSteps.ts @@ -100,28 +100,28 @@ export function useGuideStepsState(dapps: ClientDApp[], loadingDApps: boolean) { useEffect(() => { if (!validStep(1)) { if (!validStep2SubStep(0)) { - const isModelEditor = location.pathname.endsWith('model-editor') + const isModelEditor = location.pathname.endsWith('editor') if (isModelEditor) { completeStep2SubStep(0) } } if (!validStep2SubStep(1)) { - const isModelPlayground = location.pathname.endsWith('model-playground') + const isModelPlayground = location.pathname.endsWith('playground') if (isModelPlayground) { completeStep2SubStep(1) } } if (!validStep2SubStep(2)) { - const isModelSdk = location.pathname.endsWith('model-sdk') + const isModelSdk = location.pathname.endsWith('sdk') if (isModelSdk) { completeStep2SubStep(2) } } if (!validStep2SubStep(3)) { - const isStatistic = location.pathname.endsWith('statistic') + const isStatistic = location.pathname.endsWith('metrics') if (isStatistic) { completeStep2SubStep(3) } From 222de5c9c32055ca799622762480a6656c5f4267 Mon Sep 17 00:00:00 2001 From: bufan Date: Wed, 31 Jan 2024 16:32:48 +0800 Subject: [PATCH 110/127] fix issue playground hidden plugin div cover nav --- packages/client/dashboard/src/components/nav/Nav.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index 4d4819a0..aca33598 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -189,7 +189,7 @@ const NavContainer = styled.nav<{ open?: boolean }>` flex-direction: column; align-items: center; justify-content: space-between; - + z-index: 100; .item-container { display: flex; flex-direction: row; From 4846a66814a4e9975c034f1b53afbda671ef4537 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 1 Feb 2024 11:51:55 +0800 Subject: [PATCH 111/127] quick start guide frame --- packages/client/dashboard/src/App.tsx | 2 +- .../src/components/icons/guideSteps/1.png | Bin 0 -> 30962 bytes .../src/components/icons/guideSteps/2.png | Bin 0 -> 34267 bytes .../src/components/icons/guideSteps/3.png | Bin 0 -> 34513 bytes .../src/components/icons/guideSteps/4.png | Bin 0 -> 35542 bytes .../src/components/icons/guideSteps/5.png | Bin 0 -> 32734 bytes .../src/components/model/ModelSDK.tsx | 64 +-- .../node/CreateCeramicNodeModal.tsx | 8 +- .../dashboard/src/container/CeramicNodes.tsx | 2 +- .../dashboard/src/container/DappCreate.tsx | 177 --------- .../src/container/DappQuickStart.tsx | 368 ++++++++++++++++++ .../dashboard/src/container/DappSdk.tsx | 6 +- 12 files changed, 418 insertions(+), 209 deletions(-) create mode 100644 packages/client/dashboard/src/components/icons/guideSteps/1.png create mode 100644 packages/client/dashboard/src/components/icons/guideSteps/2.png create mode 100644 packages/client/dashboard/src/components/icons/guideSteps/3.png create mode 100644 packages/client/dashboard/src/components/icons/guideSteps/4.png create mode 100644 packages/client/dashboard/src/components/icons/guideSteps/5.png delete mode 100644 packages/client/dashboard/src/container/DappCreate.tsx create mode 100644 packages/client/dashboard/src/container/DappQuickStart.tsx diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 6a31fca1..29e5cf04 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -21,7 +21,7 @@ import Nav from './components/nav/Nav' import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' import CeramicNodes from './container/CeramicNodes' import Components from './container/Components' -import DappCreate from './container/DappCreate' +import DappCreate from './container/DappQuickStart' import DappEditor from './container/DappEditor' import DappHome from './container/DappHome' import DappInfo from './container/DappInfo' diff --git a/packages/client/dashboard/src/components/icons/guideSteps/1.png b/packages/client/dashboard/src/components/icons/guideSteps/1.png new file mode 100644 index 0000000000000000000000000000000000000000..5575091d276750761580e7c453e55beafc374e03 GIT binary patch literal 30962 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%0D1hH;CJ23-6Th!U~)dC-1 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

;6pe6p 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 R!s7q{002ovPDHLkV1gIGgb4ru literal 0 HcmV?d00001 diff --git a/packages/client/dashboard/src/components/model/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx index 00b0994a..ba98bb6f 100644 --- a/packages/client/dashboard/src/components/model/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -8,20 +8,19 @@ import 'prismjs/plugins/line-numbers/prism-line-numbers.js' import { useCallback, useEffect, useState } from 'react' import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' import styled from 'styled-components' -import { getModelSDK } from '../../api/model' -import useSelectedDapp from '../../hooks/useSelectedDapp' +import { getModelSDK, getModelsInfoByIds } from '../../api/model' import { GraphqlGenType, Network } from '../../types.d' import { sdkTemplate } from './sdkTemplate' -export default function ModelSDK({ +export default function ModelSDK ({ modelId, - modelName, + network, + modelName }: { modelId: string - modelName: string + network: Network + modelName?: string }) { - const { selectedDapp } = useSelectedDapp() - const [codes, setCodes] = useState< { id: number; title: string; content: string }[] >([]) @@ -35,25 +34,26 @@ export default function ModelSDK({ } const zip = new JSZip() - codes.forEach((item) => { + codes.forEach(item => { zip.file(item.title, item.content) }) zip .generateAsync({ type: 'blob' }) .then(function (content) { - FileSaver.saveAs(content, `${camelCase(modelName)}SDK.zip`) + FileSaver.saveAs(content, `${camelCase(modelName ||'')}SDK.zip`) }) .catch(console.error) }, [codes, modelName]) const fetchModelSDK = useCallback(async () => { + if (!modelId || !network || !modelName) return try { setLoading(true) setErrMsg('') const resp = await getModelSDK({ - network: selectedDapp?.network as Network, + network: network, modelId: modelId, - type: genType, + type: genType }) if (resp.data.code !== 0) { throw new Error(resp.data.msg) @@ -66,7 +66,7 @@ export default function ModelSDK({ } const runtimeComposite = data.find( - (item) => item.filename === 'runtime-composite.ts' + item => item.filename === 'runtime-composite.ts' ) if (!runtimeComposite) { throw new Error('no runtime-composite') @@ -89,14 +89,14 @@ export const definition = ${JSON.stringify( [ { filename: `S3${modelName}Model.ts`, - content: sdkContent, + content: sdkContent }, runtimeComposite, - graphql, + graphql ].map((item, i) => ({ title: item.filename, content: item.content, - id: i, + id: i })) ) } catch (error) { @@ -105,12 +105,24 @@ export const definition = ${JSON.stringify( } finally { setLoading(false) } - }, [selectedDapp?.network, modelId, genType, modelName]) + }, [network, modelId, genType, modelName]) useEffect(() => { fetchModelSDK() }, [fetchModelSDK]) + useEffect(() => { + if (!modelId || !network) return + if (!modelName) { + getModelsInfoByIds({ + network, + ids: [modelId] + }).then(resp => { + modelName = resp.data.data[0].stream_content.name + }) + } + }, [network, modelId, genType, modelName]) + return ( {/* */} {(errMsg && ( -

+

An Error Occurred Please Try Again Later.

-

{errMsg}

+

{errMsg}

)) || ( <> @@ -137,16 +149,20 @@ export const definition = ${JSON.stringify( - {(item) => {item.title}} + {item => ( + + {item.title} + + )} - {codes.map((item) => ( - + {codes.map(item => ( + ))} @@ -159,7 +175,7 @@ export const definition = ${JSON.stringify( ) } -export function Code({ name, content }: { name: string; content: string }) { +export function Code ({ name, content }: { name: string; content: string }) { useEffect(() => { Prism.highlightAll() }, [content]) @@ -168,7 +184,7 @@ export function Code({ name, content }: { name: string; content: string }) { return (
diff --git a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx index 9fbbab32..b0b7fe8f 100644 --- a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx @@ -18,8 +18,8 @@ export default function CreateCeramicNodeModal ({ onSussess }: { fixedNetwork?: CeramicNetwork - closeModal: () => void - onSussess: () => void + closeModal?: () => void + onSussess?: () => void }) { const [submitting, setSubmitting] = useState(false) const [network, setNetwork] = useState( @@ -55,8 +55,8 @@ export default function CreateCeramicNodeModal ({ if (resp.data.code !== 0) { throw new Error(resp.data.msg) } - onSussess() - closeModal() + onSussess?.() + closeModal?.() } catch (error) { console.error(error) } finally { diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 92bae353..0c11a3b0 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -159,7 +159,7 @@ function DeleteNodeButton ({ node }: { node: CeramicDto }) { ) } -function CeramicNodeInfo ({ node }: { node: CeramicDto }) { +export function CeramicNodeInfo ({ node }: { node: CeramicDto }) { const session = useSession() return ( diff --git a/packages/client/dashboard/src/container/DappCreate.tsx b/packages/client/dashboard/src/container/DappCreate.tsx deleted file mode 100644 index 21d20b01..00000000 --- a/packages/client/dashboard/src/container/DappCreate.tsx +++ /dev/null @@ -1,177 +0,0 @@ -import { - useAuthentication, - useSession -} from '@us3r-network/auth-with-rainbowkit' -import { useCallback, useState } from 'react' -import { useNavigate } from 'react-router-dom' -import styled from 'styled-components' -import { createDapp } from '../api/dapp' -import EnumSelect from '../components/common/EnumSelect' -import { useAppCtx } from '../context/AppCtx' -import { Network } from '../types.d' - -export default function DappCreate () { - const navigate = useNavigate() - const [network, setNetwork] = useState(Network.TESTNET) - const { signIn } = useAuthentication() - const session = useSession() - const { loadDapps } = useAppCtx() - - const [appName, setAppName] = useState('') - const [creating, setCreating] = useState(false) - - const createAction = useCallback(async () => { - if (!session?.id) { - signIn() - return - } - - try { - setCreating(true) - const resp = await createDapp( - { name: appName, network }, - session.serialize() - ) - if (resp.data.code !== 0) { - throw new Error(resp.data.msg) - } - await loadDapps() - navigate(`/dapp/${resp.data.data.id}/index`) - } catch (error) { - console.error(error) - } finally { - setCreating(false) - } - }, [appName, navigate, network, session, signIn, loadDapps]) - - return ( - -
-

Create Application

-
-
- * App Name: - setAppName(e.target.value)} - /> -
- - - -
- - {creating ? ( - - ) : ( - - )} -
-
-
-
- ) -} - -const DappCreateContainer = styled.main` - > div { - display: flex; - flex-direction: column; - gap: 20px; - - h1 { - font-style: italic; - font-weight: 700; - font-size: 24px; - line-height: 28px; - margin: 0; - margin-top: 20px; - color: #ffffff; - } - - > div { - background: #1b1e23; - border-radius: 20px; - display: flex; - flex-direction: column; - justify-content: center; - padding: 40px; - gap: 40px; - - .app-name { - display: flex; - flex-direction: column; - - > span { - font-weight: 500; - font-size: 16px; - line-height: 24px; - margin-bottom: 8px; - } - - > input { - background: #1a1e23; - outline: none; - border: 1px solid #39424c; - border-radius: 12px; - height: 48px; - padding: 0px 16px; - color: #ffffff; - font-weight: 400; - font-size: 16px; - line-height: 24px; - } - } - - .btns { - display: flex; - align-items: center; - justify-content: end; - gap: 20px; - - button { - font-weight: 500; - font-size: 16px; - line-height: 24px; - - text-align: center; - - width: 120px; - background: none; - outline: none; - border: none; - cursor: pointer; - border: 1px solid #39424c; - border-radius: 24px; - height: 48px; - &.cancel { - background: #1b1e23; - - color: #ffffff; - } - - &.create { - color: #14171a; - background: #ffffff; - border-radius: 24px; - } - - > img { - height: 27px; - } - } - } - } - } -` diff --git a/packages/client/dashboard/src/container/DappQuickStart.tsx b/packages/client/dashboard/src/container/DappQuickStart.tsx new file mode 100644 index 00000000..60568ccb --- /dev/null +++ b/packages/client/dashboard/src/container/DappQuickStart.tsx @@ -0,0 +1,368 @@ +import { + useAuthentication, + useSession +} from '@us3r-network/auth-with-rainbowkit' +import { useCallback, useState } from 'react' +import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' +import { useNavigate } from 'react-router-dom' +import styled from 'styled-components' +import { createDapp } from '../api/dapp' +import EnumSelect from '../components/common/EnumSelect' +import { useAppCtx } from '../context/AppCtx' +import { CeramicNetwork, Network } from '../types.d' + +import Step_1_Icon from '../components/icons/guideSteps/1.png' +import Step_2_Icon from '../components/icons/guideSteps/2.png' +import Step_3_Icon from '../components/icons/guideSteps/3.png' +import Step_4_Icon from '../components/icons/guideSteps/4.png' +import Step_5_Icon from '../components/icons/guideSteps/5.png' +import { CompositeList } from '../components/model/ExploreCompositeList' +import CreateCeramicNodeModal from '../components/node/CreateCeramicNodeModal' +import ModelSDK from '../components/model/ModelSDK' +import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' +import { CeramicNodeInfo } from './CeramicNodes' +import useSelectedDapp from '../hooks/useSelectedDapp' +import { getModelsInfoByIds } from '../api/model' + +const steps = [ + { + id: 1, + title: 'Create Application', + icon: Step_1_Icon, + content: + 'Fill in some simple information to start developing your App or DApp.', + component: CreateDapp + }, + { + id: 2, + title: 'Deploy Node', + icon: Step_2_Icon, + content: 'Before you start, you also need to deploy a node for your App.', + component: DeployNode + }, + { + id: 3, + title: 'Explore Models, Composites and Components', + icon: Step_3_Icon, + content: + 'You can view the models, composites or components that others have created and add them to your App. Now try adding a model.', + component: Explore + }, + { + id: 4, + title: 'Start Building', + icon: Step_4_Icon, + content: + 'You can check the components and SDKs for each model for future development.', + component: StartBuilding + }, + { + id: 5, + title: 'Congratulations', + icon: Step_5_Icon, + content: + 'Okay, you should have learned how to use s3. Now, you are on your own!', + component: Congratulations + } +] + +export default function DappQuickStart () { + const [currentStep, setCurrentStep] = useState(1) + return ( + + setCurrentStep(Number(key))} + disabledKeys={[3, 4]} + > + {steps.map(item => ( + + {item.component && } + + ))} +
+
+ +

{steps[currentStep - 1].title}

+

{steps[currentStep - 1].content}

+
+ + {item => ( + +
+ {item.id} +
+
+ )} +
+
+
+
+ ) +} + +const Box = styled.main` + margin-top: 20px; + margin-bottom: 20px; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + gap: 20px; + + .steps-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 20px; + } + .step-info { + width: 300px; + height: 600px; + display: flex; + flex-direction: column; + align-items: start; + justify-content: end; + gap: 20px; + } + .step-tabs { + display: flex; + flex-direction: row; + align-items: center; + gap: 20px; + margin-bottom: 20px; + + .step { + display: flex; + align-items: center; + justify-content: center; + background: #1b1e23; + border-radius: 50%; + width: 40px; + height: 40px; + font-weight: 500; + font-size: 16px; + line-height: 24px; + color: #ffffff; + cursor: pointer; + } + } + .step-action { + width: 1000px; + height: 100%; + display: flex; + flex-direction: column; + gap: 20px; + } +` + +function CreateDapp () { + const navigate = useNavigate() + const [network, setNetwork] = useState(Network.TESTNET) + const { signIn } = useAuthentication() + const session = useSession() + const { loadDapps } = useAppCtx() + + const [appName, setAppName] = useState('') + const [creating, setCreating] = useState(false) + + const createAction = useCallback(async () => { + if (!session?.id) { + signIn() + return + } + + try { + setCreating(true) + const resp = await createDapp( + { name: appName, network }, + session.serialize() + ) + if (resp.data.code !== 0) { + throw new Error(resp.data.msg) + } + await loadDapps() + navigate(`/dapp/${resp.data.data.id}/index`) + } catch (error) { + console.error(error) + } finally { + setCreating(false) + } + }, [appName, navigate, network, session, signIn, loadDapps]) + + return ( + +
+
+
+ * App Name: + setAppName(e.target.value)} + /> +
+ + + +
+ + {creating ? ( + + ) : ( + + )} +
+
+
+
+ ) +} + +const DappCreateContainer = styled.div` + > div { + display: flex; + flex-direction: column; + gap: 20px; + + h1 { + font-style: italic; + font-weight: 700; + font-size: 24px; + line-height: 28px; + margin: 0; + margin-top: 20px; + color: #ffffff; + } + + > div { + background: #1b1e23; + border-radius: 20px; + display: flex; + flex-direction: column; + justify-content: center; + padding: 40px; + gap: 40px; + + .app-name { + display: flex; + flex-direction: column; + + > span { + font-weight: 500; + font-size: 16px; + line-height: 24px; + margin-bottom: 8px; + } + + > input { + background: #1a1e23; + outline: none; + border: 1px solid #39424c; + border-radius: 12px; + height: 48px; + padding: 0px 16px; + color: #ffffff; + font-weight: 400; + font-size: 16px; + line-height: 24px; + } + } + + .btns { + display: flex; + align-items: center; + justify-content: end; + gap: 20px; + + button { + font-weight: 500; + font-size: 16px; + line-height: 24px; + + text-align: center; + + width: 120px; + background: none; + outline: none; + border: none; + cursor: pointer; + border: 1px solid #39424c; + border-radius: 24px; + height: 48px; + &.cancel { + background: #1b1e23; + + color: #ffffff; + } + + &.create { + color: #14171a; + background: #ffffff; + border-radius: 24px; + } + + > img { + height: 27px; + } + } + } + } + } +` + +function DeployNode () { + const { currCeramicNode } = useCeramicNodeCtx() + if (currCeramicNode) { + return + } + return ( +
+ +
+ ) +} + +function Explore () { + return ( +
+ +
+ ) +} + +function StartBuilding () { + const { currDapp } = useAppCtx() + const firstModelId = currDapp?.models?.[0] + if (firstModelId) { + return ( +
+ +
+ ) + }else{ + return
No Model in this Dapp!
+ } +} + +function Congratulations () { + return
Congratulations
+} diff --git a/packages/client/dashboard/src/container/DappSdk.tsx b/packages/client/dashboard/src/container/DappSdk.tsx index 910095b0..9c304b94 100644 --- a/packages/client/dashboard/src/container/DappSdk.tsx +++ b/packages/client/dashboard/src/container/DappSdk.tsx @@ -2,14 +2,16 @@ import { useOutletContext } from 'react-router-dom' import ModelSDK from '../components/model/ModelSDK' import { DappCompositeDto, ModelStream } from '../types' import { BuildContentBox } from './DappEditor' +import { useAppCtx } from '../context/AppCtx' export default function DappSdk () { + const { currDapp } = useAppCtx() const { selectModel } = useOutletContext<{ selectModel: ModelStream selectComposite: DappCompositeDto }>() - if (selectModel) { + if (selectModel && currDapp) { const name = selectModel.stream_content.name const modelId = selectModel.stream_id @@ -19,7 +21,7 @@ export default function DappSdk () { {name} SDK
- +
) From 24e770f351d41d24e1c927f10089a6d7dcf3b576 Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 1 Feb 2024 13:06:58 +0800 Subject: [PATCH 112/127] fix keys warning issue --- packages/client/dashboard/src/App.tsx | 12 ++++++------ .../src/components/icons/CircleIcon.tsx | 2 +- .../dashboard/src/components/model/ModelSDK.tsx | 17 ++++++++++------- .../client/dashboard/src/components/nav/Nav.tsx | 5 ++--- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 29e5cf04..fdb30a5f 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -208,7 +208,7 @@ function BuildLayout () {
{PAGES.map(page => ( -
+
{PAGES.map(page => ( - - + + {page.label} @@ -257,7 +257,7 @@ function ExploreLayout () { {EXPLORE_PAGES.map(page => ( -
+
@@ -266,8 +266,8 @@ function ExploreLayout () {
{EXPLORE_PAGES.map(page => ( - - + + {page.label} diff --git a/packages/client/dashboard/src/components/icons/CircleIcon.tsx b/packages/client/dashboard/src/components/icons/CircleIcon.tsx index b429880b..33aeb61b 100644 --- a/packages/client/dashboard/src/components/icons/CircleIcon.tsx +++ b/packages/client/dashboard/src/components/icons/CircleIcon.tsx @@ -7,7 +7,7 @@ export default function CircleIcon ({ bgc = '#5BA85A' }: { bgc?: string }) { fill='none' xmlns='http://www.w3.org/2000/svg' > - + ) } diff --git a/packages/client/dashboard/src/components/model/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx index ba98bb6f..dce1f20b 100644 --- a/packages/client/dashboard/src/components/model/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -40,7 +40,7 @@ export default function ModelSDK ({ zip .generateAsync({ type: 'blob' }) .then(function (content) { - FileSaver.saveAs(content, `${camelCase(modelName ||'')}SDK.zip`) + FileSaver.saveAs(content, `${camelCase(modelName || '')}SDK.zip`) }) .catch(console.error) }, [codes, modelName]) @@ -153,7 +153,7 @@ export const definition = ${JSON.stringify( items={codes} > {item => ( - + {item.title} )} @@ -161,11 +161,14 @@ export const definition = ${JSON.stringify( - {codes.map(item => ( - - - - ))} + {codes.map(item => { + console.log('item', item) + return ( + + + + ) + })} )} diff --git a/packages/client/dashboard/src/components/nav/Nav.tsx b/packages/client/dashboard/src/components/nav/Nav.tsx index aca33598..81fe5df3 100644 --- a/packages/client/dashboard/src/components/nav/Nav.tsx +++ b/packages/client/dashboard/src/components/nav/Nav.tsx @@ -3,7 +3,6 @@ import { Link, NavLink } from 'react-router-dom' import styled from 'styled-components' import { DOCS_URL } from '../../constants' import ChartIcon from '../icons/ChartIcon' -import ChevronRight from '../icons/ChevronRight' import ComponentIcon from '../icons/ComponentIcon' import DocIcon from '../icons/DocIcon' import ExploreIcon from '../icons/ExploreIcon' @@ -101,7 +100,7 @@ export default function Nav ({ appId }: { appId: string }) {
{navItems.map(item => ( - + ))}
@@ -162,7 +161,7 @@ function NavItemRenderer ({ {item.items && (
{item.items.map(item => ( - + ))}
)} From d9290d229b27fcb4ebb55105b99e27faa846e56c Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 1 Feb 2024 14:00:29 +0800 Subject: [PATCH 113/127] use radio over tabs in App.tsx --- packages/client/dashboard/src/App.tsx | 143 +++++++++++------- .../dashboard/src/styles/react-aria/index.css | 1 - .../dashboard/src/styles/react-aria/tabs.css | 66 -------- 3 files changed, 88 insertions(+), 122 deletions(-) delete mode 100644 packages/client/dashboard/src/styles/react-aria/tabs.css diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index fdb30a5f..10c77265 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -3,7 +3,7 @@ import { ProfileStateProvider } from '@us3r-network/profile' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { useEffect, useState } from 'react' -import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' +import { Radio, RadioGroup } from 'react-aria-components' import { NavLink, Outlet, @@ -21,12 +21,12 @@ import Nav from './components/nav/Nav' import { CERAMIC_TESTNET_HOST, WALLET_CONNECT_PROJECT_ID } from './constants' import CeramicNodes from './container/CeramicNodes' import Components from './container/Components' -import DappCreate from './container/DappQuickStart' import DappEditor from './container/DappEditor' import DappHome from './container/DappHome' import DappInfo from './container/DappInfo' import DappMetrics from './container/DappMetrics' import DappPlayground from './container/DappPlayground' +import DappCreate from './container/DappQuickStart' import DappSdk from './container/DappSdk' import ExploreComposite from './container/ExploreComposite' import ExploreModel from './container/ExploreModel' @@ -203,34 +203,26 @@ function BuildLayout () { setSelectComposite(data) }} selectComposite={selectComposite} - editable={pathname.includes('model-editor')} + editable={pathname.includes('editor')} />
- + + {PAGES.map(page => ( -
- - - -
+ + {page.label} + ))} -
- - {PAGES.map(page => ( - - - {page.label} - - - ))} - -
-
+
) @@ -238,8 +230,8 @@ function BuildLayout () { function ExploreLayout () { const { pathname } = useLocation() - const defaultExploreKey = pathname.split('/explore/')[1] - const EXPLORE_PAGES = [ + const defaultKey = pathname.split('/explore/')[1] + const PAGES = [ { id: 'model', label: 'Models' @@ -255,26 +247,18 @@ function ExploreLayout () { ] return ( - - {EXPLORE_PAGES.map(page => ( -
- - - -
+ + + {PAGES.map(page => ( + + {page.label} + ))} -
- - {EXPLORE_PAGES.map(page => ( - - - {page.label} - - - ))} - -
-
+
) } @@ -283,21 +267,70 @@ const LayoutContainer = styled.div` width: 100%; margin-top: 20px; margin-bottom: 20px; + position: relative; display: flex; + flex-direction: row; gap: 20px; - .tab-list { + .tabs { position: absolute; top: 0px; right: 0px; + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + border: 1px solid white; + border-radius: 999px; } - .tab-panel { - position: absolute; - width: 100%; - top: 0; - margin: 0; - padding: 0; + + .tab { + --text-color-base: black; + --text-color-disabled: var(--text-color-base); + --highlight-background: white; + --border-color: transparent; + + padding: 10px 20px; + cursor: pointer; + outline: none; + position: relative; + color: white; + transition: color 200ms; + forced-color-adjust: none; + border-radius: 999px; + a { + color: var(--text-color); + } + + &[data-hovered], + &[data-focused] { + color: white; + } + + &[data-selected] { + background-color: var(--highlight-background); + color: var(--text-color-base); + a { + color: var(--text-color-base); + } + } + + &[data-disabled] { + color: var(--text-color-disabled); + &[data-selected] { + --border-color: var(--text-color-disabled); + } + } + + &[data-focus-visible]:after { + content: ''; + position: absolute; + inset: 4px; + border-radius: 4px; + border: 2px solid var(--focus-ring-color); + } } - .build-content{ + .build-content { flex-grow: 1; + width: 0; } ` diff --git a/packages/client/dashboard/src/styles/react-aria/index.css b/packages/client/dashboard/src/styles/react-aria/index.css index 5b3fddc3..58dea426 100644 --- a/packages/client/dashboard/src/styles/react-aria/index.css +++ b/packages/client/dashboard/src/styles/react-aria/index.css @@ -6,5 +6,4 @@ @import 'menu.css'; @import 'modal.css'; @import 'popover.css'; -@import 'tabs.css'; @import 'textfield.css'; diff --git a/packages/client/dashboard/src/styles/react-aria/tabs.css b/packages/client/dashboard/src/styles/react-aria/tabs.css deleted file mode 100644 index d8958d0e..00000000 --- a/packages/client/dashboard/src/styles/react-aria/tabs.css +++ /dev/null @@ -1,66 +0,0 @@ -/* Tabs */ -.react-aria-Tabs { - position: relative; - --text-color-base:black; - --highlight-background: white; - width: 100%; -} - -.react-aria-TabList { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - - &[data-orientation=horizontal] { - border: 1px solid var(--border-color); - border-radius: 999px; - } -} - -.react-aria-Tab { - padding: 10px 20px; - cursor: default; - outline: none; - position: relative; - color: var(--text-color-base); - transition: color 200ms; - --border-color: transparent; - forced-color-adjust: none; - border-radius: 999px; - a { - color: var(--text-color); - } - - &[data-hovered], - &[data-focused] { - color: var(--text-color-hover); - } - - &[data-selected] { - background-color: var(--highlight-background); - color: var(--text-color-base); - a { - color: var(--text-color-base); - } - } - - &[data-disabled] { - color: var(--text-color-disabled); - &[data-selected] { - --border-color: var(--text-color-disabled); - } - } - - &[data-focus-visible]:after { - content: ''; - position: absolute; - inset: 4px; - border-radius: 4px; - border: 2px solid var(--focus-ring-color); - } -} - -.react-aria-TabPanel { - -} \ No newline at end of file From fc58442665183e78878a5dee2d6db9db2879a45c Mon Sep 17 00:00:00 2001 From: bufan Date: Thu, 1 Feb 2024 23:22:57 +0800 Subject: [PATCH 114/127] quick start guide --- .../src/components/model/ExploreModelList.tsx | 5 +- .../src/components/model/ModelSDK.tsx | 22 +- .../node/CreateCeramicNodeModal.tsx | 16 +- .../dashboard/src/container/CeramicNodes.tsx | 31 +- .../src/container/DappQuickStart.tsx | 441 +++++++++++------- .../dashboard/src/container/MyDapps.tsx | 7 +- .../client/dashboard/src/context/AppCtx.tsx | 14 +- .../dashboard/src/hooks/useSelectedDapp.ts | 6 +- packages/client/dashboard/src/types.d.ts | 7 +- 9 files changed, 333 insertions(+), 216 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 462e2e40..cb72a24b 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -379,7 +379,7 @@ function Actions ({ const { s3ModelCollection } = useSelectedDapp() const [staring, setStaring] = useState(false) - const { loadDapps } = useAppCtx() + const { loadDapps, loadCurrDapp } = useAppCtx() const { selectedDapp } = useSelectedDapp() const [adding, setAdding] = useState(false) const addModelToDapp = useCallback( @@ -403,13 +403,14 @@ function Actions ({ ceramicNodeId ) await loadDapps() + await loadCurrDapp() } catch (err) { console.error(err) } finally { setAdding(false) } }, - [loadDapps, selectedDapp, session, setAdding, hasIndexed, ceramicNodeId] + [session, selectedDapp, ceramicNodeId, hasIndexed, loadDapps, loadCurrDapp] ) const collectModel = useCallback( diff --git a/packages/client/dashboard/src/components/model/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx index dce1f20b..8e1b91e7 100644 --- a/packages/client/dashboard/src/components/model/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -111,17 +111,17 @@ export const definition = ${JSON.stringify( fetchModelSDK() }, [fetchModelSDK]) - useEffect(() => { - if (!modelId || !network) return - if (!modelName) { - getModelsInfoByIds({ - network, - ids: [modelId] - }).then(resp => { - modelName = resp.data.data[0].stream_content.name - }) - } - }, [network, modelId, genType, modelName]) + // useEffect(() => { + // if (!modelId || !network) return + // if (!modelName) { + // getModelsInfoByIds({ + // network, + // ids: [modelId] + // }).then(resp => { + // modelName = resp.data.data[0].stream_content.name + // }) + // } + // }, [network, modelId, genType, modelName]) return ( diff --git a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx index b0b7fe8f..8d9afac1 100644 --- a/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/CreateCeramicNodeModal.tsx @@ -19,7 +19,7 @@ export default function CreateCeramicNodeModal ({ }: { fixedNetwork?: CeramicNetwork closeModal?: () => void - onSussess?: () => void + onSussess: () => void }) { const [submitting, setSubmitting] = useState(false) const [network, setNetwork] = useState( @@ -77,9 +77,11 @@ export default function CreateCeramicNodeModal ({

Create Ceramic Node

- + {closeModal && ( + + )}
@@ -124,7 +126,11 @@ export default function CreateCeramicNodeModal ({ )) || ( - )} diff --git a/packages/client/dashboard/src/container/CeramicNodes.tsx b/packages/client/dashboard/src/container/CeramicNodes.tsx index 0c11a3b0..7181deb7 100644 --- a/packages/client/dashboard/src/container/CeramicNodes.tsx +++ b/packages/client/dashboard/src/container/CeramicNodes.tsx @@ -10,7 +10,13 @@ import { useSession } from '@us3r-network/auth-with-rainbowkit' import dayjs from 'dayjs' import { useEffect, useState } from 'react' -import { Button, Dialog, DialogTrigger, Modal, ModalOverlay } from 'react-aria-components' +import { + Button, + Dialog, + DialogTrigger, + Modal, + ModalOverlay +} from 'react-aria-components' import styled from 'styled-components' import PlusIcon from '../components/icons/PlusIcon' import TrashIcon from '../components/icons/TrashIcon' @@ -41,7 +47,7 @@ export default function CeramicNodes () { }, 5000) } } - return ()=>{ + return () => { if (timer) clearTimeout(timer) } }, [ceramicNodes, loadCeramicNodes]) @@ -86,9 +92,7 @@ export default function CeramicNodes () { const active = currCeramicNode?.id === item.id return (
-
+
{item.name}
{active && ( @@ -104,7 +108,7 @@ export default function CeramicNodes () { })} - {currCeramicNode && } + {currCeramicNode && } ) } @@ -159,7 +163,13 @@ function DeleteNodeButton ({ node }: { node: CeramicDto }) { ) } -export function CeramicNodeInfo ({ node }: { node: CeramicDto }) { +export function CeramicNodeInfo ({ + node, + showTerminal +}: { + node: CeramicDto + showTerminal?: boolean +}) { const session = useSession() return ( @@ -171,7 +181,7 @@ export function CeramicNodeInfo ({ node }: { node: CeramicDto }) {
- + {node.status === CeramicStatus.PREPARING ? (
{/* */} @@ -209,7 +219,7 @@ export function CeramicNodeInfo ({ node }: { node: CeramicDto }) {
) : null} - {node?.id && + {showTerminal && node?.id && (node.status === CeramicStatus.STARTING || node.status === CeramicStatus.RUNNING) && session?.did && ( @@ -341,9 +351,11 @@ const NodesListBox = styled.div` } ` const NodeInfoContainer = styled.div` + width: 100%; height: 100%; display: flex; flex-direction: column; + /* justify-content: center; */ gap: 20px; flex-shrink: 1; flex-grow: 1; @@ -351,6 +363,7 @@ const NodeInfoContainer = styled.div` const NodeInfoBox = styled.div` width: 100%; padding: 20px; + box-sizing: border-box; border-radius: 20px; border: 1px solid #39424c; background: #1b1e23; diff --git a/packages/client/dashboard/src/container/DappQuickStart.tsx b/packages/client/dashboard/src/container/DappQuickStart.tsx index 60568ccb..6b228885 100644 --- a/packages/client/dashboard/src/container/DappQuickStart.tsx +++ b/packages/client/dashboard/src/container/DappQuickStart.tsx @@ -2,105 +2,289 @@ import { useAuthentication, useSession } from '@us3r-network/auth-with-rainbowkit' -import { useCallback, useState } from 'react' -import { Tab, TabList, TabPanel, Tabs } from 'react-aria-components' +import { useCallback, useEffect, useState } from 'react' +import { Button, Radio, RadioGroup } from 'react-aria-components' import { useNavigate } from 'react-router-dom' import styled from 'styled-components' import { createDapp } from '../api/dapp' import EnumSelect from '../components/common/EnumSelect' import { useAppCtx } from '../context/AppCtx' -import { CeramicNetwork, Network } from '../types.d' +import { CeramicNetwork, CeramicStatus, Network } from '../types.d' import Step_1_Icon from '../components/icons/guideSteps/1.png' import Step_2_Icon from '../components/icons/guideSteps/2.png' import Step_3_Icon from '../components/icons/guideSteps/3.png' import Step_4_Icon from '../components/icons/guideSteps/4.png' -import Step_5_Icon from '../components/icons/guideSteps/5.png' -import { CompositeList } from '../components/model/ExploreCompositeList' +// import Step_5_Icon from '../components/icons/guideSteps/5.png' +// import { CompositeList } from '../components/model/ExploreCompositeList' import CreateCeramicNodeModal from '../components/node/CreateCeramicNodeModal' import ModelSDK from '../components/model/ModelSDK' import { useCeramicNodeCtx } from '../context/CeramicNodeCtx' import { CeramicNodeInfo } from './CeramicNodes' -import useSelectedDapp from '../hooks/useSelectedDapp' -import { getModelsInfoByIds } from '../api/model' +import { uniq } from 'lodash' +import ModelList from '../components/model/ExploreModelList' +import React from 'react' -const steps = [ +const CreateDapp = () => { + const [network, setNetwork] = useState(Network.TESTNET) + const { signIn } = useAuthentication() + const session = useSession() + const { loadDapps, currDapp, setCurrAppId } = useAppCtx() + + const [appName, setAppName] = useState('') + const [creating, setCreating] = useState(false) + + const createAction = useCallback(async () => { + if (!session?.id) { + signIn() + return + } + + try { + setCreating(true) + const resp = await createDapp( + { name: appName, network }, + session.serialize() + ) + if (resp.data.code !== 0) { + throw new Error(resp.data.msg) + } + setCurrAppId(String(resp.data.data.id)) + await loadDapps() + } catch (error) { + console.error(error) + } finally { + setCreating(false) + } + }, [session, signIn, appName, network, setCurrAppId, loadDapps]) + + return ( + +
+ {currDapp ? ( +
+

App Name: {currDapp.name}

+

Network: {currDapp.network}

+

App ID: {currDapp.id}

+

Created At: {currDapp.createdAt}

+
+ ) : ( +
+
+ * App Name: + setAppName(e.target.value)} + /> +
+ + + +
+ {creating ? ( + + ) : ( + + )} +
+
+ )} +
+
+ ) +} + +const DeployNode = () => { + const { ceramicNodes, currCeramicNode, loadCeramicNodes } = + useCeramicNodeCtx() + useEffect(() => { + let timer: NodeJS.Timeout | undefined + // console.log('ceramicNodes changes: ', ceramicNodes) + if (ceramicNodes.length > 0) { + if (ceramicNodes[0].status !== CeramicStatus.RUNNING) { + timer = setTimeout(() => { + loadCeramicNodes() + }, 5000) + } + } + return () => { + if (timer) clearTimeout(timer) + } + }, [ceramicNodes, loadCeramicNodes]) + if (currCeramicNode) { + return + } + return ( + + ) +} + +const Explore = () => { + return +} + +const StartBuilding = () => { + const { currDapp } = useAppCtx() + const firstModel = currDapp?.modelDetails?.[0] + if (firstModel) { + return ( + + ) + } else { + return
No Model in this Dapp!
+ } +} + +const STEPS = [ { id: 1, title: 'Create Application', icon: Step_1_Icon, - content: + guideText: 'Fill in some simple information to start developing your App or DApp.', - component: CreateDapp + component: CreateDapp, + enable: true, + done: false }, { id: 2, title: 'Deploy Node', icon: Step_2_Icon, - content: 'Before you start, you also need to deploy a node for your App.', - component: DeployNode + guideText: 'Before you start, you also need to deploy a node for your App.', + component: DeployNode, + enable: true, + done: false }, { id: 3, title: 'Explore Models, Composites and Components', icon: Step_3_Icon, - content: + guideText: 'You can view the models, composites or components that others have created and add them to your App. Now try adding a model.', - component: Explore + component: Explore, + enable: false, + done: false }, { id: 4, title: 'Start Building', icon: Step_4_Icon, - content: + guideText: 'You can check the components and SDKs for each model for future development.', - component: StartBuilding - }, - { - id: 5, - title: 'Congratulations', - icon: Step_5_Icon, - content: - 'Okay, you should have learned how to use s3. Now, you are on your own!', - component: Congratulations + component: StartBuilding, + enable: false, + done: false } ] export default function DappQuickStart () { + const navigate = useNavigate() const [currentStep, setCurrentStep] = useState(1) + const [disabledSteps, setDisabledSteps] = useState(['3', '4']) + const [completedSteps, setCompletedSteps] = useState([]) + + const { currCeramicNode } = useCeramicNodeCtx() + const { currDapp } = useAppCtx() + + useEffect(() => { + if (currCeramicNode) { + setCompletedSteps(uniq([...completedSteps, 1])) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currCeramicNode]) + + useEffect(() => { + if (currDapp) { + setCompletedSteps(uniq([...completedSteps, 0])) + if (currDapp?.models?.length) { + setCompletedSteps(uniq([...completedSteps, 2])) + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currDapp]) + + useEffect(() => { + if (completedSteps.includes(0) && completedSteps.includes(1)) { + if (completedSteps.includes(2)) { + setDisabledSteps([]) + } else { + setDisabledSteps(['4']) + } + } else { + setDisabledSteps(['3', '4']) + } + }, [completedSteps]) + + const step = STEPS[currentStep - 1] return ( - setCurrentStep(Number(key))} - disabledKeys={[3, 4]} - > - {steps.map(item => ( - - {item.component && } - - ))} -
-
- -

{steps[currentStep - 1].title}

-

{steps[currentStep - 1].content}

-
- - {item => ( - -
- {item.id} -
-
+
+

{STEPS[currentStep - 1]?.guideText}

+ {} +
+ {currentStep < STEPS.length && + !disabledSteps.includes(String(currentStep + 1)) && ( + + )} + {currDapp && + completedSteps.includes(0) && + completedSteps.includes(1) && ( + )} -
- +
+
+ setCurrentStep(Number(value))} + > + {STEPS.map(item => ( + + {item.id} + + ))} + +
+ +

{STEPS[currentStep - 1]?.title}

+
+
) } @@ -111,28 +295,31 @@ const Box = styled.main` width: 100%; height: 100%; display: flex; - flex-direction: column; + flex-direction: row; + align-items: start; + justify-content: center; gap: 20px; .steps-container { display: flex; flex-direction: row; - align-items: center; + /* align-items: center; */ justify-content: center; gap: 20px; } .step-info { width: 300px; - height: 600px; + margin-top: 100px; + /* height: 600px; */ display: flex; - flex-direction: column; - align-items: start; - justify-content: end; + flex-direction: row; + /* align-items: center; */ + /* justify-content: end; */ gap: 20px; } .step-tabs { display: flex; - flex-direction: row; + flex-direction: column; align-items: center; gap: 20px; margin-bottom: 20px; @@ -142,6 +329,7 @@ const Box = styled.main` align-items: center; justify-content: center; background: #1b1e23; + border: 2px solid transparent; border-radius: 50%; width: 40px; height: 40px; @@ -150,91 +338,33 @@ const Box = styled.main` line-height: 24px; color: #ffffff; cursor: pointer; + + &[data-disabled] { + color: grey; + cursor: not-allowed; + } + &[data-hovered] { + border-color: white; + } + &[data-selected] { + background: #ffffff; + color: #14171a; + } } } .step-action { - width: 1000px; - height: 100%; + width: 800px; + height: 600px; display: flex; flex-direction: column; + align-items: center; + /* justify-content: center; */ gap: 20px; } ` -function CreateDapp () { - const navigate = useNavigate() - const [network, setNetwork] = useState(Network.TESTNET) - const { signIn } = useAuthentication() - const session = useSession() - const { loadDapps } = useAppCtx() - - const [appName, setAppName] = useState('') - const [creating, setCreating] = useState(false) - - const createAction = useCallback(async () => { - if (!session?.id) { - signIn() - return - } - - try { - setCreating(true) - const resp = await createDapp( - { name: appName, network }, - session.serialize() - ) - if (resp.data.code !== 0) { - throw new Error(resp.data.msg) - } - await loadDapps() - navigate(`/dapp/${resp.data.data.id}/index`) - } catch (error) { - console.error(error) - } finally { - setCreating(false) - } - }, [appName, navigate, network, session, signIn, loadDapps]) - - return ( - -
-
-
- * App Name: - setAppName(e.target.value)} - /> -
- - - -
- - {creating ? ( - - ) : ( - - )} -
-
-
-
- ) -} - const DappCreateContainer = styled.div` + width: 100%; > div { display: flex; flex-direction: column; @@ -325,44 +455,3 @@ const DappCreateContainer = styled.div` } } ` - -function DeployNode () { - const { currCeramicNode } = useCeramicNodeCtx() - if (currCeramicNode) { - return - } - return ( -
- -
- ) -} - -function Explore () { - return ( -
- -
- ) -} - -function StartBuilding () { - const { currDapp } = useAppCtx() - const firstModelId = currDapp?.models?.[0] - if (firstModelId) { - return ( -
- -
- ) - }else{ - return
No Model in this Dapp!
- } -} - -function Congratulations () { - return
Congratulations
-} diff --git a/packages/client/dashboard/src/container/MyDapps.tsx b/packages/client/dashboard/src/container/MyDapps.tsx index b7cca62b..9f8cd10e 100644 --- a/packages/client/dashboard/src/container/MyDapps.tsx +++ b/packages/client/dashboard/src/container/MyDapps.tsx @@ -10,9 +10,14 @@ import { useAppCtx } from '../context/AppCtx' import { ClientDApp } from '../types.d' import { createImageFromInitials } from '../utils/createImage' import { getRandomColor } from '../utils/randomColor' +import { useEffect } from 'react' export default function MyDapps() { - const { dapps } = useAppCtx() + const { dapps, setCurrAppId } = useAppCtx() + setCurrAppId('') + useEffect(() => { + setCurrAppId('') + }, [setCurrAppId]) return (
diff --git a/packages/client/dashboard/src/context/AppCtx.tsx b/packages/client/dashboard/src/context/AppCtx.tsx index efdad9ed..e17ef004 100644 --- a/packages/client/dashboard/src/context/AppCtx.tsx +++ b/packages/client/dashboard/src/context/AppCtx.tsx @@ -4,7 +4,7 @@ import React, { useCallback, useContext, useEffect, - useState, + useState } from 'react' import { getDapp, getDappWithDid } from '../api/dapp' import { useGuideStepsState } from '../hooks/useGuideSteps' @@ -22,13 +22,14 @@ export interface AppContextData { currAppId: string setCurrAppId: React.Dispatch> loadDapps: () => Promise + loadCurrDapp: () => Promise guideSteps: ReturnType } const AppContext = createContext(null) -export default function AppProvider({ - children, +export default function AppProvider ({ + children }: { children: React.ReactNode }) { @@ -93,8 +94,9 @@ export default function AppProvider({ currAppId, setCurrAppId, loadDapps, + loadCurrDapp, loadingDApps: loadingDApps || loadingDApp, - guideSteps, + guideSteps }} > {children} @@ -102,12 +104,12 @@ export default function AppProvider({ ) } -export function useAppCtx() { +export function useAppCtx () { const context = useContext(AppContext) if (!context) { throw new Error('Missing connection context') } return { - ...context, + ...context } } diff --git a/packages/client/dashboard/src/hooks/useSelectedDapp.ts b/packages/client/dashboard/src/hooks/useSelectedDapp.ts index dbd2df42..338033d0 100644 --- a/packages/client/dashboard/src/hooks/useSelectedDapp.ts +++ b/packages/client/dashboard/src/hooks/useSelectedDapp.ts @@ -6,7 +6,7 @@ import { useAppCtx } from '../context/AppCtx' import { Network } from '../types.d' export default function useSelectedDapp() { - const { dapps } = useAppCtx() + const { dapps, currAppId } = useAppCtx() const { appId } = useParams() const selectDapps = useMemo(() => { return ( @@ -19,8 +19,8 @@ export default function useSelectedDapp() { }, [dapps]) const selectedDapp = useMemo(() => { - return selectDapps?.find((item) => item.id === Number(appId)) - }, [selectDapps, appId]) + return selectDapps?.find((item) => item.id === Number(currAppId || appId)) + }, [selectDapps, currAppId, appId]) const s3ModelCollection = useMemo(() => { if (selectedDapp?.network === Network.MAINNET) { diff --git a/packages/client/dashboard/src/types.d.ts b/packages/client/dashboard/src/types.d.ts index c979d920..eaa16ddc 100644 --- a/packages/client/dashboard/src/types.d.ts +++ b/packages/client/dashboard/src/types.d.ts @@ -104,6 +104,7 @@ export type ClientDApp = { socialLinks?: { platform: string; url: string }[] tags?: string[] models?: string[] + modelDetails?: ModelStream[] composites?: DappCompositeDto[]; createdAt?: number lastModifiedAt?: number @@ -184,9 +185,9 @@ export type ModelStream = { stream_id: string controller_did: string tip: string - streamContent: { - name: string - } + // streamContent: { + // name: string + // } stream_content: { name: string description: string | null From b77a4997eae809011cc64633c2103ab37a374c29 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 2 Feb 2024 09:35:10 +0800 Subject: [PATCH 115/127] add quick tips --- .../src/container/DappQuickStart.tsx | 72 ++++++++++++++----- 1 file changed, 55 insertions(+), 17 deletions(-) diff --git a/packages/client/dashboard/src/container/DappQuickStart.tsx b/packages/client/dashboard/src/container/DappQuickStart.tsx index 6b228885..467e8e09 100644 --- a/packages/client/dashboard/src/container/DappQuickStart.tsx +++ b/packages/client/dashboard/src/container/DappQuickStart.tsx @@ -60,15 +60,20 @@ const CreateDapp = () => { return ( -
- {currDapp ? ( + {currDapp ? ( +

App Name: {currDapp.name}

Network: {currDapp.network}

App ID: {currDapp.id}

Created At: {currDapp.createdAt}

- ) : ( +

+ Your dapp has been created; proceed to the next step to continue. +

+
+ ) : ( +
* App Name: @@ -97,8 +102,12 @@ const CreateDapp = () => { )}
- )} -
+

+ Fill in the required information to create a dapp, and testnet + network is recommended during the development. +

+
+ )}
) } @@ -121,18 +130,40 @@ const DeployNode = () => { } }, [ceramicNodes, loadCeramicNodes]) if (currCeramicNode) { - return + return ( + <> + +

+ Since you already have a Ceramic node set up, you can proceed to the + next step. +

+ + ) } return ( - + <> + {' '} +

+ You must create a Ceramic node, as all data operations will be executed + on this node. +

+ ) } const Explore = () => { - return + return ( + <> + +

+ Browse through the current collection of models and choose a model that + you wish to incorporate into your dapp. +

+ + ) } const StartBuilding = () => { @@ -140,11 +171,18 @@ const StartBuilding = () => { const firstModel = currDapp?.modelDetails?.[0] if (firstModel) { return ( - + <> + {' '} + +

+ Using the automatically generated SDK, you can now directly perform + CRUD operations on data; let's begin coding. +

+ ) } else { return
No Model in this Dapp!
@@ -235,7 +273,6 @@ export default function DappQuickStart () { return (
-

{STEPS[currentStep - 1]?.guideText}

{}
{currentStep < STEPS.length && @@ -283,6 +320,7 @@ export default function DappQuickStart () {

{STEPS[currentStep - 1]?.title}

+

{STEPS[currentStep - 1]?.guideText}

From b1f506e287a7281f6641bb0e4d858759e13b6a53 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 2 Feb 2024 10:44:13 +0800 Subject: [PATCH 116/127] remove extra code --- .../client/dashboard/src/components/common/ModalBase.tsx | 5 ++--- .../dashboard/src/components/dapp/DappSocialEditor.tsx | 2 +- .../dashboard/src/components/model/CreateNewComposite.tsx | 2 +- .../src/components/model/DappModelAndComposites.tsx | 2 +- .../dashboard/src/components/model/ExploreCompositeList.tsx | 5 ++--- packages/client/dashboard/src/container/DappQuickStart.tsx | 3 +-- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/client/dashboard/src/components/common/ModalBase.tsx b/packages/client/dashboard/src/components/common/ModalBase.tsx index d8e75838..be276728 100644 --- a/packages/client/dashboard/src/components/common/ModalBase.tsx +++ b/packages/client/dashboard/src/components/common/ModalBase.tsx @@ -4,7 +4,7 @@ import { Heading, Modal, ModalOverlay, - ModalOverlayProps, + ModalOverlayProps } from 'react-aria-components' import styled, { keyframes } from 'styled-components' import CloseIcon from '../icons/CloseIcon' @@ -20,7 +20,7 @@ export interface ModalBaseProps extends ModalOverlayProps { closeBtnClassName?: string } -export default function ModalBase({ +export default function ModalBase ({ children, title, showCloseBtn = true, @@ -38,7 +38,6 @@ export default function ModalBase({ {(!!title || showCloseBtn) && ( - {' '} {title} {showCloseBtn && (
{IconMap[item.platform] && - React.createElement(IconMap[item.platform])}{' '} + React.createElement(IconMap[item.platform])} {item.platform}
diff --git a/packages/client/dashboard/src/components/model/CreateNewComposite.tsx b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx index d739c97a..49fcdd78 100644 --- a/packages/client/dashboard/src/components/model/CreateNewComposite.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx @@ -100,7 +100,7 @@ export default function CreateNewComposite ({
- Composite Name:{' '} + Composite Name: - {' '} +
) } diff --git a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx index 367a3d74..62043bc8 100644 --- a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx @@ -216,11 +216,10 @@ function Actions ({ } }, [session, selectedDapp, ceramicNodeId, hasIndexed, composite, loadDapps]) return ( - + diff --git a/packages/client/dashboard/src/container/DappQuickStart.tsx b/packages/client/dashboard/src/container/DappQuickStart.tsx index 467e8e09..edace872 100644 --- a/packages/client/dashboard/src/container/DappQuickStart.tsx +++ b/packages/client/dashboard/src/container/DappQuickStart.tsx @@ -145,7 +145,7 @@ const DeployNode = () => { {' '} + />

You must create a Ceramic node, as all data operations will be executed on this node. @@ -172,7 +172,6 @@ const StartBuilding = () => { if (firstModel) { return ( <> - {' '} Date: Fri, 2 Feb 2024 12:06:39 +0800 Subject: [PATCH 117/127] remove extra log --- .../src/components/model/CompositePublish.tsx | 2 -- .../src/components/model/CreateNewModel.tsx | 2 -- .../components/model/ExploreCompositeList.tsx | 2 -- .../src/components/model/ExploreModelList.tsx | 24 +++++++++++++---- .../src/components/model/ModelSDK.tsx | 1 - .../dashboard/src/components/nav/Header.tsx | 12 ++++----- .../node/DeleteCeramicNodeModal.tsx | 1 - .../src/components/node/NodeStatus.tsx | 4 +-- .../src/container/DappPlayground.tsx | 1 - .../dashboard/src/container/MyDapps.tsx | 1 - .../dashboard/src/hooks/useSelectedDapp.ts | 26 +++---------------- .../dashboard/src/utils/composeDBUtils.ts | 2 +- 12 files changed, 31 insertions(+), 47 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositePublish.tsx b/packages/client/dashboard/src/components/model/CompositePublish.tsx index 7c246e0f..1d738dd1 100644 --- a/packages/client/dashboard/src/components/model/CompositePublish.tsx +++ b/packages/client/dashboard/src/components/model/CompositePublish.tsx @@ -42,14 +42,12 @@ export default function CompositePublish ({ encodedDefinition: composite.composite, createAt: new Date().toISOString() } - console.log('compositeInput', compositeInput) setPublishing(true) const s3Composite = new S3CompositeModel(CERAMIC_TESTNET_HOST) s3Composite.authComposeClient(session) const stream = await s3Composite.createComposite({ content: compositeInput }) - console.log(stream) const streamId = stream?.data?.createComposite?.document?.id if (!streamId) { toast.error('Publish failed') diff --git a/packages/client/dashboard/src/components/model/CreateNewModel.tsx b/packages/client/dashboard/src/components/model/CreateNewModel.tsx index 0a534fae..765bea3f 100644 --- a/packages/client/dashboard/src/components/model/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewModel.tsx @@ -58,7 +58,6 @@ export default function CreateNewModel ({ const newModelIDs = Object.values(composite.modelIDs) // const models = selectedDapp.models || [] // models.push(...newModelIDs) - // // console.log("models: ", newModelIDs, models) // await updateDapp( // { ...selectedDapp, models }, // session.serialize(), @@ -74,7 +73,6 @@ export default function CreateNewModel ({ }) }) ) - console.log(resp) await loadDappModels() closeModal() } catch (error) { diff --git a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx index 62043bc8..e67a3ccf 100644 --- a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx @@ -76,7 +76,6 @@ export function CompositeList ({ next={() => { pageNum.current += 1 fetchMoreComposites(pageNum.current) - console.log('fetch more') }} hasMore={hasMore} loader={Loading...} @@ -185,7 +184,6 @@ function Actions ({ .then( () => { const models = JSON.parse(composite.composite).models - console.log(Object.keys(models)) const modelIds = Object.keys(models) startIndexModels({ modelIds, diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index cb72a24b..861923ce 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -11,7 +11,7 @@ import { import InfiniteScroll from 'react-infinite-scroll-component' import styled from 'styled-components' import { updateDapp } from '../../api/dapp' -import { PAGE_SIZE } from '../../constants' +import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST, PAGE_SIZE } from '../../constants' import { getModelStreamList, getModelsInfoByIds, @@ -30,6 +30,7 @@ import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useSelectedDapp from '../../hooks/useSelectedDapp' import { CeramicStatus, ClientDApp, ModelStream, Network } from '../../types.d' import { shortPubKey } from '../../utils/shortPubKey' +import { S3ModelCollectionModel } from '@us3r-network/data-model' export default function ModelList ({ searchText, @@ -39,7 +40,7 @@ export default function ModelList ({ filterStar?: boolean }) { // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { s3ModelCollection, selectedDapp } = useSelectedDapp() + const { selectedDapp } = useSelectedDapp() const { currCeramicNode } = useCeramicNodeCtx() const session = useSession() const [models, setModels] = useState>([]) @@ -49,9 +50,16 @@ export default function ModelList ({ const [personalCollections, setPersonalCollections] = useState< PersonalCollection[] >([]) + + const s3ModelCollection = useMemo(() => { + if (selectedDapp?.network === Network.MAINNET) { + return new S3ModelCollectionModel(CERAMIC_MAINNET_HOST, 'mainnet') + } + return new S3ModelCollectionModel(CERAMIC_TESTNET_HOST, 'testnet') + }, [selectedDapp?.network]) + const fetchPersonalCollections = useCallback(async () => { if (!session) return - s3ModelCollection.authComposeClient(session) try { const personal = await s3ModelCollection.queryPersonalCollections({ first: 500 @@ -155,7 +163,6 @@ export default function ModelList ({ next={() => { pageNum.current += 1 fetchMoreModel(pageNum.current) - console.log('fetch more') }} hasMore={filterStar ? false : hasMore} loader={Loading...} @@ -376,12 +383,19 @@ function Actions ({ ceramicNodeId?: number }) { const session = useSession() - const { s3ModelCollection } = useSelectedDapp() const [staring, setStaring] = useState(false) const { loadDapps, loadCurrDapp } = useAppCtx() const { selectedDapp } = useSelectedDapp() const [adding, setAdding] = useState(false) + + const s3ModelCollection = useMemo(() => { + if (selectedDapp?.network === Network.MAINNET) { + return new S3ModelCollectionModel(CERAMIC_MAINNET_HOST, 'mainnet') + } + return new S3ModelCollectionModel(CERAMIC_TESTNET_HOST, 'testnet') + }, [selectedDapp?.network]) + const addModelToDapp = useCallback( async (modelId: string) => { if (!session || !selectedDapp) return diff --git a/packages/client/dashboard/src/components/model/ModelSDK.tsx b/packages/client/dashboard/src/components/model/ModelSDK.tsx index 8e1b91e7..d5e94412 100644 --- a/packages/client/dashboard/src/components/model/ModelSDK.tsx +++ b/packages/client/dashboard/src/components/model/ModelSDK.tsx @@ -162,7 +162,6 @@ export const definition = ${JSON.stringify( {codes.map(item => { - console.log('item', item) return ( diff --git a/packages/client/dashboard/src/components/nav/Header.tsx b/packages/client/dashboard/src/components/nav/Header.tsx index c8510475..9fc1f4e8 100644 --- a/packages/client/dashboard/src/components/nav/Header.tsx +++ b/packages/client/dashboard/src/components/nav/Header.tsx @@ -3,17 +3,17 @@ import { useMemo } from 'react' import { Link, useLocation, useNavigate } from 'react-router-dom' import { Item } from 'react-stately' import styled from 'styled-components' -import useSelectedDapp from '../../hooks/useSelectedDapp' import { Label } from '../common/ListBox' import { Select } from '../common/Select' import LoginButton from './LoginButton' import { LogoWhite } from './Logo' +import { useAppCtx } from '../../context/AppCtx' +import { ClientDApp } from '../../types' export default function Header() { - const { appId, selectDapps } = useSelectedDapp() const session = useSession() - + const { dapps, currAppId } = useAppCtx() return (

@@ -21,8 +21,8 @@ export default function Header() {

CONSOLE

- {session?.id && appId && ( - + {session?.id && currAppId && ( + )}
@@ -82,7 +82,7 @@ function DappSelector({ dapps, selected, }: { - dapps: { id: number; name: string }[] + dapps: ClientDApp[] selected: string }) { const navigate = useNavigate() diff --git a/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx b/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx index 59611b94..e3743e7c 100644 --- a/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx +++ b/packages/client/dashboard/src/components/node/DeleteCeramicNodeModal.tsx @@ -31,7 +31,6 @@ export default function DeleteCeramicNodeModal ({ return } if (nodeName.trim() !== node.name.trim()) { - console.log('Node Name: ', nodeName, node.name) alert('Node name is not correct!') return } diff --git a/packages/client/dashboard/src/components/node/NodeStatus.tsx b/packages/client/dashboard/src/components/node/NodeStatus.tsx index 18309b77..c93d31a4 100644 --- a/packages/client/dashboard/src/components/node/NodeStatus.tsx +++ b/packages/client/dashboard/src/components/node/NodeStatus.tsx @@ -17,7 +17,7 @@ export default function NodeStatus ({ useEffect(() => { if (status !== CeramicStatus.PREPARING) return if (prepageingPercentage < 100) { - console.log('set prepare timeout', prepageingPercentage) + // console.log('set prepare timeout', prepageingPercentage) setTimeout(() => { setPrepageingPercentage(prepageingPercentage + 1) }, 350) @@ -27,7 +27,7 @@ export default function NodeStatus ({ useEffect(() => { if (status !== CeramicStatus.STARTING) return if (startingPercentage < 100) { - console.log('set start timeout', startingPercentage) + // console.log('set start timeout', startingPercentage) setTimeout(() => { setStartingPercentage(startingPercentage + 1) }, 200) diff --git a/packages/client/dashboard/src/container/DappPlayground.tsx b/packages/client/dashboard/src/container/DappPlayground.tsx index 64c083e4..c8eba2ff 100644 --- a/packages/client/dashboard/src/container/DappPlayground.tsx +++ b/packages/client/dashboard/src/container/DappPlayground.tsx @@ -77,7 +77,6 @@ function ModelPlayground ({ streamId, network || Network.TESTNET ) - console.log('data', resp) setModelData(resp.data.data) } catch (error) { const err = error as AxiosError diff --git a/packages/client/dashboard/src/container/MyDapps.tsx b/packages/client/dashboard/src/container/MyDapps.tsx index 9f8cd10e..56e1ed3c 100644 --- a/packages/client/dashboard/src/container/MyDapps.tsx +++ b/packages/client/dashboard/src/container/MyDapps.tsx @@ -14,7 +14,6 @@ import { useEffect } from 'react' export default function MyDapps() { const { dapps, setCurrAppId } = useAppCtx() - setCurrAppId('') useEffect(() => { setCurrAppId('') }, [setCurrAppId]) diff --git a/packages/client/dashboard/src/hooks/useSelectedDapp.ts b/packages/client/dashboard/src/hooks/useSelectedDapp.ts index 338033d0..4cfebddc 100644 --- a/packages/client/dashboard/src/hooks/useSelectedDapp.ts +++ b/packages/client/dashboard/src/hooks/useSelectedDapp.ts @@ -1,38 +1,18 @@ -import { S3ModelCollectionModel } from '@us3r-network/data-model' import { useMemo } from 'react' import { useParams } from 'react-router-dom' -import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST } from '../constants' import { useAppCtx } from '../context/AppCtx' -import { Network } from '../types.d' +// todo: this hook is NOT simimalr to useAppCtx, can be removed later export default function useSelectedDapp() { const { dapps, currAppId } = useAppCtx() const { appId } = useParams() - const selectDapps = useMemo(() => { - return ( - dapps?.map((item) => ({ - ...item, - id: item.id!, - name: item.name, - })) || [] - ) - }, [dapps]) const selectedDapp = useMemo(() => { - return selectDapps?.find((item) => item.id === Number(currAppId || appId)) - }, [selectDapps, currAppId, appId]) - - const s3ModelCollection = useMemo(() => { - if (selectedDapp?.network === Network.MAINNET) { - return new S3ModelCollectionModel(CERAMIC_MAINNET_HOST, 'mainnet') - } - return new S3ModelCollectionModel(CERAMIC_TESTNET_HOST, 'testnet') - }, [selectedDapp?.network]) + return dapps?.find((item) => item.id === Number(currAppId || appId)) + }, [dapps, currAppId, appId]) return { appId, selectedDapp, - selectDapps, - s3ModelCollection, } } diff --git a/packages/client/dashboard/src/utils/composeDBUtils.ts b/packages/client/dashboard/src/utils/composeDBUtils.ts index 29b49e2b..43be39ef 100644 --- a/packages/client/dashboard/src/utils/composeDBUtils.ts +++ b/packages/client/dashboard/src/utils/composeDBUtils.ts @@ -130,7 +130,7 @@ export async function getRuntimeDefinitionFromEncodedComposite( // console.log('runtime definition:', composite.toRuntime()) return composite.toRuntime() } catch (error) { - console.log('get runtime error', error) + console.error('get runtime error', error) return null } } \ No newline at end of file From 8c36afcdbc750f65e0001e90b476ef8ac67db200 Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 2 Feb 2024 13:02:25 +0800 Subject: [PATCH 118/127] remove extra log --- .../src/components/model/ExploreModelList.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 861923ce..1ccae8fe 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -56,16 +56,17 @@ export default function ModelList ({ return new S3ModelCollectionModel(CERAMIC_MAINNET_HOST, 'mainnet') } return new S3ModelCollectionModel(CERAMIC_TESTNET_HOST, 'testnet') - }, [selectedDapp?.network]) + }, [selectedDapp]) const fetchPersonalCollections = useCallback(async () => { - if (!session) return + if (!session || !s3ModelCollection) return try { + s3ModelCollection.authComposeClient(session) const personal = await s3ModelCollection.queryPersonalCollections({ first: 500 }) if (personal.errors) throw new Error(personal.errors[0].message) - const collected = personal.data?.viewer.modelCollectionList + const collected = personal.data?.viewer?.modelCollectionList if (collected) { setPersonalCollections( @@ -141,8 +142,11 @@ export default function ModelList ({ useEffect(() => { fetchModel() + }, [fetchModel]) + + useEffect(() => { fetchPersonalCollections() - }, [fetchModel, fetchPersonalCollections]) + }, [fetchPersonalCollections]) useEffect(() => { fetchStarModels().catch(err => { From 12ee18ad23851d04e14f88b425dcf2b4d6dca13a Mon Sep 17 00:00:00 2001 From: bufan Date: Fri, 2 Feb 2024 13:14:57 +0800 Subject: [PATCH 119/127] fix editor style --- .../dashboard/src/components/model/CompositeEditor.tsx | 3 ++- packages/client/dashboard/src/container/DappEditor.tsx | 10 ++++++---- .../client/dashboard/src/container/DappPlayground.tsx | 4 ++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index aaa0ccf5..24387084 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -77,6 +77,7 @@ export const definition = ${JSON.stringify(runtimeDefinition)}`} } const Box = styled.div` + height: 100%; .title { display: flex; align-items: center; @@ -100,7 +101,7 @@ const Box = styled.div` ` const EditorBox = styled.div` - max-height: 800px; + height: 100%; background: #14171a; border: 1px solid #39424c; border-radius: 20px; diff --git a/packages/client/dashboard/src/container/DappEditor.tsx b/packages/client/dashboard/src/container/DappEditor.tsx index 6dfff747..46cf89c2 100644 --- a/packages/client/dashboard/src/container/DappEditor.tsx +++ b/packages/client/dashboard/src/container/DappEditor.tsx @@ -27,10 +27,12 @@ export default function DappEditor () {
{selectModel.stream_content?.name}
- +
+ +
) } diff --git a/packages/client/dashboard/src/container/DappPlayground.tsx b/packages/client/dashboard/src/container/DappPlayground.tsx index c8eba2ff..aac2ba3a 100644 --- a/packages/client/dashboard/src/container/DappPlayground.tsx +++ b/packages/client/dashboard/src/container/DappPlayground.tsx @@ -27,7 +27,7 @@ export default function DappPlayground () {
{selectModel.stream_content.name}
-
+
{selectComposite.name}
-
+
Date: Fri, 2 Feb 2024 17:25:36 +0800 Subject: [PATCH 120/127] start index from browser --- .../components/model/CreateNewComposite.tsx | 22 ++--- .../src/components/model/CreateNewModel.tsx | 32 +++---- .../model/DappModelAndComposites.tsx | 32 +++---- .../components/model/ExploreCompositeList.tsx | 18 ++-- .../src/components/model/ExploreModelList.tsx | 45 +++++----- .../src/components/model/ModelSDK.tsx | 2 +- .../dashboard/src/container/DappEditor.tsx | 4 +- .../dashboard/src/utils/composeDBUtils.ts | 90 +++++++++++++++++++ 8 files changed, 164 insertions(+), 81 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CreateNewComposite.tsx b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx index 49fcdd78..377f36a7 100644 --- a/packages/client/dashboard/src/components/model/CreateNewComposite.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewComposite.tsx @@ -7,9 +7,11 @@ import { createDappComposites } from '../../api/composite' import useSelectedDapp from '../../hooks/useSelectedDapp' import { schemas } from '../../utils/composedb-types/schemas' import CloseIcon from '../icons/CloseIcon' -import { createCompositeFromBrowser } from '../../utils/composeDBUtils' +import { + createCompositeFromBrowser, + startIndexModelsFromBrowser +} from '../../utils/composeDBUtils' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' -import { startIndexModels } from '../../api/model' export default function CreateNewComposite ({ closeModal, @@ -44,18 +46,17 @@ export default function CreateNewComposite ({ const result = await createCompositeFromBrowser( gqlSchema.code, currCeramicNode.serviceUrl + '/', - // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, currCeramicNode.privateKey, session ) if (!result) return const { composite, runtimeDefinition } = result - + const newCompositeData = { graphql: gqlSchema.code, name, - composite:JSON.stringify(composite), - runtimeDefinition:JSON.stringify(runtimeDefinition), + composite: JSON.stringify(composite), + runtimeDefinition: JSON.stringify(runtimeDefinition) } const resp = await createDappComposites({ data: newCompositeData, @@ -66,11 +67,12 @@ export default function CreateNewComposite ({ throw new Error(resp.data.msg) } const modelIds = composite.modelIDs - await startIndexModels({ + await startIndexModelsFromBrowser( modelIds, - network: selectedDapp.network, - didSession: session.serialize() - }).catch(console.error) + selectedDapp.network, + currCeramicNode.serviceUrl + '/', + currCeramicNode.privateKey + ) if (loadDappComposites) await loadDappComposites() closeModal() diff --git a/packages/client/dashboard/src/components/model/CreateNewModel.tsx b/packages/client/dashboard/src/components/model/CreateNewModel.tsx index 765bea3f..5928ff7d 100644 --- a/packages/client/dashboard/src/components/model/CreateNewModel.tsx +++ b/packages/client/dashboard/src/components/model/CreateNewModel.tsx @@ -3,23 +3,22 @@ import { AxiosError } from 'axios' import { GraphQLEditor, PassedSchema } from 'graphql-editor' import { useCallback, useState } from 'react' import styled from 'styled-components' -import { updateDapp } from '../../api/dapp' -import { useAppCtx } from '../../context/AppCtx' +import { createDappModels } from '../../api/model' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { schemas } from '../../utils/composedb-types/schemas' import { createCompositeFromBrowser } from '../../utils/composeDBUtils' +import { schemas } from '../../utils/composedb-types/schemas' import CloseIcon from '../icons/CloseIcon' -import { createDappModels } from '../../api/model' export default function CreateNewModel ({ + loadDappModels, closeModal }: { + loadDappModels?: () => Promise closeModal: () => void }) { const { selectedDapp } = useSelectedDapp() const { currCeramicNode } = useCeramicNodeCtx() - const { loadDapps } = useAppCtx() const session = useSession() const [submitting, setSubmitting] = useState(false) @@ -45,26 +44,20 @@ export default function CreateNewModel ({ // const { composite, runtimeDefinition } = resp.data.data // const newModelIDs = Object.key(composite.models) - // create model directly through the ceramic node + // create model directly through the ceramic node and index it const result = await createCompositeFromBrowser( gqlSchema.code, currCeramicNode.serviceUrl + '/', // `http://${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalanceHost}:${ceramicNodes[0].serviceK8sMetadata.ceramicLoadbalancePort}`, currCeramicNode.privateKey, - session + session, + true, // start index model on my private node ) if (!result) return const { composite, runtimeDefinition } = result const newModelIDs = Object.values(composite.modelIDs) - // const models = selectedDapp.models || [] - // models.push(...newModelIDs) - // await updateDapp( - // { ...selectedDapp, models }, - // session.serialize(), - // currCeramicNode.id - // ) - // await loadDapps() - const resp = await Promise.all( + //save new model to dapp + await Promise.all( newModelIDs.map(async mdoelStreamId => { return await createDappModels({ data: { mdoelStreamId, gqlSchema, composite, runtimeDefinition }, @@ -73,7 +66,7 @@ export default function CreateNewModel ({ }) }) ) - await loadDappModels() + loadDappModels?.() closeModal() } catch (error) { const err = error as AxiosError @@ -81,7 +74,7 @@ export default function CreateNewModel ({ } finally { setSubmitting(false) } - }, [submitting, selectedDapp, session, gqlSchema, currCeramicNode, closeModal]) + }, [submitting, selectedDapp, session, gqlSchema, currCeramicNode, loadDappModels, closeModal]) return ( @@ -190,6 +183,3 @@ const CreateBox = styled.div` } } ` -function loadDappModels () { - throw new Error('Function not implemented.') -} diff --git a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx index b0fd0a0e..2c8d5a16 100644 --- a/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx +++ b/packages/client/dashboard/src/components/model/DappModelAndComposites.tsx @@ -15,7 +15,7 @@ import { useLocation } from 'react-router-dom' import styled from 'styled-components' import { deleteDappComposites, getDappComposites } from '../../api/composite' import { updateDapp } from '../../api/dapp' -import { getModelsInfoByIds } from '../../api/model' +import { getDappModels, getModelsInfoByIds } from '../../api/model' import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useIsOwner from '../../hooks/useIsOwner' @@ -65,7 +65,7 @@ export default function DappModelAndComposites ({ editable?: boolean }) { const session = useSession() - const { loadDapps, currDapp } = useAppCtx() + const { loadDapps, currDapp, loadCurrDapp } = useAppCtx() const { appId, selectedDapp } = useSelectedDapp() const { currCeramicNode } = useCeramicNodeCtx() const [loading, setLoading] = useState(false) @@ -102,18 +102,19 @@ export default function DappModelAndComposites ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [dapp]) - // const loadDappModels = useCallback(async () => { - // if (!dapp) return - // try { - // const resp = await getDappModels({ - // dapp - // }) - // if (resp.data.code !== 0) throw new Error(resp.data.msg) - // setDappModels(resp.data.data) - // } catch (error) { - // console.error(error) - // } - // }, [dapp]) + const loadDappModels = useCallback(async () => { + if (!dapp) return + // try { + // const resp = await getDappModels({ + // dapp + // }) + // if (resp.data.code !== 0) throw new Error(resp.data.msg) + // setDappModels(resp.data.data) + // } catch (error) { + // console.error(error) + // } + await loadCurrDapp() + }, [dapp, loadCurrDapp]) const loadDappComposites = useCallback(async () => { if (!dapp) return @@ -342,7 +343,8 @@ export default function DappModelAndComposites ({ isOpen={openModal === OPEN_MODAL.CREATE_NEW_MODEL} onOpenChange={() => setOpenModal(OPEN_MODAL.NONE)} > - {({ close }) => } + {({ close }) => } {/* CREATE_NEW_COMPOSITE modal */} { if (!session || !selectedDapp) return - if (!ceramicNodeId) return + if (!currCeramicNode) return if (!hasIndexed) { bindingDappComposites({ compositeId: composite.id, @@ -185,11 +185,12 @@ function Actions ({ () => { const models = JSON.parse(composite.composite).models const modelIds = Object.keys(models) - startIndexModels({ + startIndexModelsFromBrowser( modelIds, - network: selectedDapp.network, - didSession: session.serialize() - }).catch(console.error) + selectedDapp.network, + currCeramicNode.serviceUrl + '/', + currCeramicNode.privateKey + ) }, err => { console.error(err) @@ -204,7 +205,6 @@ function Actions ({ await updateDapp( { ...selectedDapp, composites }, session.serialize(), - ceramicNodeId ) await loadDapps() } catch (err) { @@ -212,7 +212,7 @@ function Actions ({ } finally { setAdding(false) } - }, [session, selectedDapp, ceramicNodeId, hasIndexed, composite, loadDapps]) + }, [session, selectedDapp, currCeramicNode, hasIndexed, composite, loadDapps]) return ( diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 1ccae8fe..8aa2fe72 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -15,7 +15,6 @@ import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST, PAGE_SIZE } from '../../con import { getModelStreamList, getModelsInfoByIds, - startIndexModel } from '../../api/model' import { ImgOrName } from '../common/ImgOrName' import { TableBox, TableContainer } from '../common/TableBox' @@ -28,9 +27,10 @@ import { S3_SCAN_URL } from '../../constants' import { PersonalCollection, useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { CeramicStatus, ClientDApp, ModelStream, Network } from '../../types.d' +import { ClientDApp, ModelStream, Network } from '../../types.d' import { shortPubKey } from '../../utils/shortPubKey' import { S3ModelCollectionModel } from '@us3r-network/data-model' +import { startIndexModelsFromBrowser } from '../../utils/composeDBUtils' export default function ModelList ({ searchText, @@ -41,7 +41,6 @@ export default function ModelList ({ }) { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { selectedDapp } = useSelectedDapp() - const { currCeramicNode } = useCeramicNodeCtx() const session = useSession() const [models, setModels] = useState>([]) const [starModels, setStarModels] = useState>([]) @@ -264,15 +263,9 @@ export default function ModelList ({ {/* */} @@ -372,7 +365,6 @@ function Actions ({ fetchPersonal, stream_id, hasIndexed, - ceramicNodeId }: { hasIndexed: boolean stream_id: string @@ -384,9 +376,9 @@ function Actions ({ } | undefined fetchPersonal: () => void - ceramicNodeId?: number }) { const session = useSession() + const { currCeramicNode } = useCeramicNodeCtx() const [staring, setStaring] = useState(false) const { loadDapps, loadCurrDapp } = useAppCtx() @@ -403,13 +395,20 @@ function Actions ({ const addModelToDapp = useCallback( async (modelId: string) => { if (!session || !selectedDapp) return - if (!ceramicNodeId) return + if (!currCeramicNode) return + console.log('currCeramicNode', currCeramicNode, hasIndexed) if (!hasIndexed) { - startIndexModel({ - modelId, - network: selectedDapp.network as Network, - didSession: session.serialize() - }).catch(console.error) + // await startIndexModel({ + // modelId, + // network: selectedDapp.network as Network, + // didSession: session.serialize() + // }).catch(console.error) + await startIndexModelsFromBrowser( + [modelId], + selectedDapp.network as Network, + currCeramicNode.serviceUrl + '/', + currCeramicNode.privateKey, + ) } try { setAdding(true) @@ -418,7 +417,7 @@ function Actions ({ await updateDapp( { ...selectedDapp, models }, session.serialize(), - ceramicNodeId + // ceramicNodeId ) await loadDapps() await loadCurrDapp() @@ -428,7 +427,7 @@ function Actions ({ setAdding(false) } }, - [session, selectedDapp, ceramicNodeId, hasIndexed, loadDapps, loadCurrDapp] + [session, selectedDapp, hasIndexed, loadDapps, loadCurrDapp,currCeramicNode] ) const collectModel = useCallback( @@ -500,11 +499,11 @@ function Actions ({ - ) : ceramicNodeId ? ( + ) : currCeramicNode ? ( )}
From 2e9f44b7a700080278a8390489c088fdba75cca4 Mon Sep 17 00:00:00 2001 From: bufan Date: Sun, 4 Feb 2024 11:38:20 +0800 Subject: [PATCH 123/127] change startIndexing function --- .../src/components/model/ExploreModelList.tsx | 44 ++++++++--------- .../dashboard/src/utils/composeDBUtils.ts | 47 ++++++------------- .../src/utils/composedb-types/scalars.ts | 2 +- 3 files changed, 36 insertions(+), 57 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreModelList.tsx b/packages/client/dashboard/src/components/model/ExploreModelList.tsx index 8aa2fe72..50685c78 100644 --- a/packages/client/dashboard/src/components/model/ExploreModelList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreModelList.tsx @@ -11,11 +11,12 @@ import { import InfiniteScroll from 'react-infinite-scroll-component' import styled from 'styled-components' import { updateDapp } from '../../api/dapp' -import { CERAMIC_MAINNET_HOST, CERAMIC_TESTNET_HOST, PAGE_SIZE } from '../../constants' import { - getModelStreamList, - getModelsInfoByIds, -} from '../../api/model' + CERAMIC_MAINNET_HOST, + CERAMIC_TESTNET_HOST, + PAGE_SIZE +} from '../../constants' +import { getModelStreamList, getModelsInfoByIds } from '../../api/model' import { ImgOrName } from '../common/ImgOrName' import { TableBox, TableContainer } from '../common/TableBox' import CheckCircleIcon from '../icons/CheckCircleIcon' @@ -56,7 +57,7 @@ export default function ModelList ({ } return new S3ModelCollectionModel(CERAMIC_TESTNET_HOST, 'testnet') }, [selectedDapp]) - + const fetchPersonalCollections = useCallback(async () => { if (!session || !s3ModelCollection) return try { @@ -263,7 +264,6 @@ export default function ModelList ({ {/* */} @@ -364,9 +364,7 @@ function Actions ({ hasStarItem, fetchPersonal, stream_id, - hasIndexed, }: { - hasIndexed: boolean stream_id: string hasStarItem: | { @@ -396,27 +394,19 @@ function Actions ({ async (modelId: string) => { if (!session || !selectedDapp) return if (!currCeramicNode) return - console.log('currCeramicNode', currCeramicNode, hasIndexed) - if (!hasIndexed) { - // await startIndexModel({ - // modelId, - // network: selectedDapp.network as Network, - // didSession: session.serialize() - // }).catch(console.error) + setAdding(true) + try { await startIndexModelsFromBrowser( [modelId], - selectedDapp.network as Network, - currCeramicNode.serviceUrl + '/', - currCeramicNode.privateKey, - ) - } - try { - setAdding(true) + selectedDapp.network as Network, + currCeramicNode.serviceUrl + '/', + currCeramicNode.privateKey + ) const models = selectedDapp.models || [] models.push(modelId) await updateDapp( { ...selectedDapp, models }, - session.serialize(), + session.serialize() // ceramicNodeId ) await loadDapps() @@ -427,7 +417,13 @@ function Actions ({ setAdding(false) } }, - [session, selectedDapp, hasIndexed, loadDapps, loadCurrDapp,currCeramicNode] + [ + session, + selectedDapp, + loadDapps, + loadCurrDapp, + currCeramicNode + ] ) const collectModel = useCallback( diff --git a/packages/client/dashboard/src/utils/composeDBUtils.ts b/packages/client/dashboard/src/utils/composeDBUtils.ts index 9129fc92..4e1b9999 100644 --- a/packages/client/dashboard/src/utils/composeDBUtils.ts +++ b/packages/client/dashboard/src/utils/composeDBUtils.ts @@ -9,6 +9,7 @@ import { Ed25519Provider } from 'key-did-provider-ed25519' import { getResolver } from 'key-did-resolver' import { fromString } from 'uint8arrays/from-string' import { Network } from '../types' +import { StreamID } from '@ceramicnetwork/streamid' export async function createCompositeFromBrowser( graphql: string, @@ -130,7 +131,7 @@ export async function startIndexModelsFromBrowser( console.error('Please specify a CeramicNodeAdminPrivateKey') return } - console.log('Start index models on private node: ', models, network, myCeramicNode) + // 0 Login console.log('Connecting to the ceramic node: ', myCeramicNode) const ceramic = new CeramicClient(myCeramicNode) @@ -166,41 +167,23 @@ export async function startIndexModelsFromBrowser( return } - //1 Create My Composite - let myComposite: Composite - try { - console.log('Creating the composite...') - myComposite = await Composite.fromModels({ - ceramic: ceramic as unknown as CeramicApi, - models, - index: false, - }) - console.log(`Creating the composite... Done! The encoded representation:`) - console.log(myComposite) - } catch (e) { - console.error((e as Error).message) - return - } - - //2 Deploy My Composite - if (myCeramicNodeAdminPrivateKey) + // 1 Start indexing models on private node + console.log('Start index models on private node: ', models, network, myCeramicNode) + const indexedModels = [] + for await (const m of models) { + const modelStreamId = StreamID.fromString(m) try { - console.log('Deploying the composite...') - // Notify the Ceramic node to index the models present in the composite - await myComposite.startIndexingOn(ceramic as unknown as CeramicApi) - // Logging the model stream IDs to stdout, so that they can be piped using standard I/O or redirected to a file - console.log( - JSON.stringify(Object.keys(myComposite.toParams().definition.models)) - ) - console.log(`Deploying the composite... Done!`) - } catch (e) { - console.error((e as Error).message) - return + console.log(`Index models, stream id:${m}`); + const res = await ceramic.admin.startIndexingModels([modelStreamId]); + console.log(`Indexed model: ${m}.`, res); + indexedModels.push(m) + } catch (error) { + console.error(`Add model ${m} index err: ${error}`); } - return myComposite + } + return indexedModels } - export async function getRuntimeDefinitionFromEncodedComposite( encodedDefinition: string, myCeramicNode: string = '', diff --git a/packages/client/dashboard/src/utils/composedb-types/scalars.ts b/packages/client/dashboard/src/utils/composedb-types/scalars.ts index 8c5d4b8a..a0e9cb0d 100644 --- a/packages/client/dashboard/src/utils/composedb-types/scalars.ts +++ b/packages/client/dashboard/src/utils/composedb-types/scalars.ts @@ -126,7 +126,7 @@ export const extraScalars: Record = { ...getGraphQLScalarSchema('timezone'), maxLength: 100, }, - URI: { ...getGraphQLScalarSchema('uri'), maxLength: 100 }, + // URI: { ...getGraphQLScalarSchema('uri'), maxLength: 100 }, UTCOffset: { ...getGraphQLScalarSchema('utcoffset'), maxLength: 100, From 1f31207969bb7420e728dc743468752fbf09e23c Mon Sep 17 00:00:00 2001 From: bufan Date: Sun, 4 Feb 2024 12:30:02 +0800 Subject: [PATCH 124/127] fix add composite to dapp issue --- .../components/model/ExploreCompositeList.tsx | 121 ++++++++---------- .../src/components/model/ExploreModelList.tsx | 26 ++-- 2 files changed, 67 insertions(+), 80 deletions(-) diff --git a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx index 83279ee2..864ffcbc 100644 --- a/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx +++ b/packages/client/dashboard/src/components/model/ExploreCompositeList.tsx @@ -11,12 +11,11 @@ import { import InfiniteScroll from 'react-infinite-scroll-component' import styled from 'styled-components' import { bindingDappComposites, getComposites } from '../../api/composite' -import { updateDapp } from '../../api/dapp' import { PAGE_SIZE, S3_SCAN_URL } from '../../constants' import { useAppCtx } from '../../context/AppCtx' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import useSelectedDapp from '../../hooks/useSelectedDapp' -import { CeramicStatus, DappCompositeDto, Network } from '../../types.d' +import { DappCompositeDto, Network } from '../../types.d' import { shortPubKey } from '../../utils/shortPubKey' import { TableBox, TableContainer } from '../common/TableBox' import CheckCircleIcon from '../icons/CheckCircleIcon' @@ -26,14 +25,11 @@ import CreateCompositeModal from './CreateNewComposite' import { Dapps } from '../model/ExploreModelList' import NoCeramicNodeModal from '../node/NoCeramicNodeModal' import { startIndexModelsFromBrowser } from '../../utils/composeDBUtils' +import { updateDapp } from '../../api/dapp' +import { difference, uniq } from 'lodash' -export function CompositeList ({ - searchText -}: { - searchText?: string -}) { +export function CompositeList ({ searchText }: { searchText?: string }) { const { selectedDapp } = useSelectedDapp() - const { currCeramicNode } = useCeramicNodeCtx() const [composites, setComposites] = useState>([]) const [hasMore, setHasMore] = useState(true) const pageNum = useRef(1) @@ -130,20 +126,7 @@ export function CompositeList ({ {/* */} - dapp.id === selectedDapp?.id - ) !== -1 - } - ceramicNodeId={ - currCeramicNode && - currCeramicNode.status === CeramicStatus.RUNNING - ? currCeramicNode?.id - : undefined - } - /> + ) @@ -157,62 +140,66 @@ export function CompositeList ({ ) } -function Actions ({ - composite, - hasIndexed, - ceramicNodeId -}: { - composite: DappCompositeDto - hasIndexed: boolean - ceramicNodeId?: number -}) { +function Actions ({ composite }: { composite: DappCompositeDto }) { const session = useSession() const { currCeramicNode } = useCeramicNodeCtx() - const { loadDapps } = useAppCtx() + const { loadDapps, loadCurrDapp } = useAppCtx() const { selectedDapp } = useSelectedDapp() const [adding, setAdding] = useState(false) const bindComposite = useCallback(async () => { if (!session || !selectedDapp) return if (!currCeramicNode) return - if (!hasIndexed) { - bindingDappComposites({ + try { + setAdding(true) + const compsiteModels = JSON.parse(composite.composite).models + const modelIds = Object.keys(compsiteModels) + const dappModels = selectedDapp.models || [] + const newModels = difference(modelIds,dappModels) + if (newModels.length > 0) { + console.log('start indexing new models in composite on private node') + startIndexModelsFromBrowser( + modelIds, + selectedDapp.network, + currCeramicNode.serviceUrl + '/', + currCeramicNode.privateKey + ).then((result) => { + console.log('indexd models on private node:', result) + }) + .catch(err => { + console.error(err) + }) + console.log('store new models in composite of dapp to server') + const models = uniq([...dappModels, ...newModels]) + await updateDapp( + { ...selectedDapp, models }, + session.serialize() + // ceramicNodeId + ) + } + console.log('store composite of dapp to server') + await bindingDappComposites({ compositeId: composite.id, dapp: selectedDapp, did: session.serialize() }) - .then( - () => { - const models = JSON.parse(composite.composite).models - const modelIds = Object.keys(models) - startIndexModelsFromBrowser( - modelIds, - selectedDapp.network, - currCeramicNode.serviceUrl + '/', - currCeramicNode.privateKey - ) - }, - err => { - console.error(err) - } - ) - .catch(console.error) - } - try { - setAdding(true) - const composites = selectedDapp.composites || [] - composites.push(composite) - await updateDapp( - { ...selectedDapp, composites }, - session.serialize(), - ) + console.log('reload dapps') await loadDapps() + await loadCurrDapp() } catch (err) { console.error(err) } finally { setAdding(false) } - }, [session, selectedDapp, currCeramicNode, hasIndexed, composite, loadDapps]) + }, [ + session, + selectedDapp, + currCeramicNode, + composite.id, + composite.composite, + loadDapps, + loadCurrDapp + ]) return ( @@ -240,18 +227,14 @@ function Actions ({ ) : ( <> - {hasIndexed ? ( - - ) : ceramicNodeId ? ( + ) : currCeramicNode ? ( ) : currCeramicNode ? (
- * App Name: + * Node Name: { const [network, setNetwork] = useState(Network.TESTNET) @@ -58,59 +59,142 @@ const CreateDapp = () => { } }, [session, signIn, appName, network, setCurrAppId, loadDapps]) - return ( - - {currDapp ? ( -
-
-

App Name: {currDapp.name}

-

Network: {currDapp.network}

-

App ID: {currDapp.id}

-

Created At: {currDapp.createdAt}

-
-

- Your dapp has been created; proceed to the next step to continue. -

-
- ) : ( -
-
-
- * App Name: - setAppName(e.target.value)} - /> -
- - +

Your dapp has been created; proceed to the next step to continue.

+ +

App Name: {currDapp.name}

+

Network: {currDapp.network}

+

App ID: {currDapp.id}

+

Created At: {dayjs(currDapp.createdAt).format('YYYY-MM-DD')}

+
+ + ) + else + return ( + <> +

+ Fill in the required information to create a dapp, Testnet is + recommended for development. +

+ +
+ * App Name: + setAppName(e.target.value)} /> - -
- {creating ? ( - - ) : ( - - )} -
-

- Fill in the required information to create a dapp, and testnet - network is recommended during the development. -

-
- )} - - ) + +
+ {creating ? ( + + ) : ( + + )} +
+ + + ) } +const DappCreateBox = styled.div` + width: 100%; + background: #1b1e23; + border-radius: 20px; + display: flex; + flex-direction: column; + justify-content: center; + padding: 40px; + gap: 20px; + border: 1px solid #39424c; + + .app-info{ + display: flex; + flex-direction: column; + gap: 20px; + h3 { + font-weight: 500; + font-size: 24px; + line-height: 36px; + } + p { + font-weight: 400; + font-size: 16px; + line-height: 24px; + } + } + .app-name { + display: flex; + flex-direction: column; + + > span { + font-weight: 500; + font-size: 16px; + line-height: 24px; + margin-bottom: 8px; + } + + > input { + background: #1a1e23; + outline: none; + border: 1px solid #39424c; + border-radius: 12px; + height: 48px; + padding: 0px 16px; + color: #ffffff; + font-weight: 400; + font-size: 16px; + line-height: 24px; + } + } + + .btns { + display: flex; + align-items: center; + justify-content: end; + gap: 20px; + + button { + font-size: 16px; + font-weight: 700; + line-height: 24px; + text-align: center; + width: 120px; + background: none; + outline: none; + border: none; + cursor: pointer; + border: 1px solid #39424c; + border-radius: 24px; + height: 48px; + &.cancel { + background: #1b1e23; + + color: #ffffff; + } + + &.create { + color: #14171a; + background: #ffffff; + border-radius: 24px; + } + + > img { + height: 27px; + } + } + } +` const DeployNode = () => { const { ceramicNodes, currCeramicNode, loadCeramicNodes } = @@ -132,24 +216,24 @@ const DeployNode = () => { if (currCeramicNode) { return ( <> -

Since you already have a Ceramic node set up, you can proceed to the next step.

+ ) } return ( <> -

You must create a Ceramic node, as all data operations will be executed on this node.

+ ) } @@ -157,11 +241,11 @@ const DeployNode = () => { const Explore = () => { return ( <> -

Browse through the current collection of models and choose a model that you wish to incorporate into your dapp.

+ ) } @@ -172,15 +256,15 @@ const StartBuilding = () => { if (firstModel) { return ( <> +

+ Using the automatically generated SDK, you can now directly perform + CRUD operations on data; let's begin coding. +

-

- Using the automatically generated SDK, you can now directly perform - CRUD operations on data; let's begin coding. -

) } else { @@ -271,23 +355,17 @@ export default function DappQuickStart () { const step = STEPS[currentStep - 1] return ( -
- {} -
- {currentStep < STEPS.length && - !disabledSteps.includes(String(currentStep + 1)) && ( - - )} +
+

+ SETP {String(currentStep)} + {STEPS[currentStep - 1]?.title} +

+
{currDapp && completedSteps.includes(0) && completedSteps.includes(1) && ( )} + {currentStep < STEPS.length && ( + + )}
-
- setCurrentStep(Number(value))} - > - {STEPS.map(item => ( - - {item.id} - - ))} - -
- -

{STEPS[currentStep - 1]?.title}

-

{STEPS[currentStep - 1]?.guideText}

+
+
{}
+
+ setCurrentStep(Number(value))} + > + {STEPS.map(item => ( + + {item.id} + + ))} + +
+ +

{STEPS[currentStep - 1]?.guideText}

+
@@ -327,16 +418,88 @@ export default function DappQuickStart () { } const Box = styled.main` - margin-top: 20px; - margin-bottom: 20px; + margin: 20px auto; width: 100%; + max-width: 1200px; height: 100%; display: flex; - flex-direction: row; + flex-direction: column; align-items: start; justify-content: center; gap: 20px; - + .step-title-bar { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + gap: 20px; + border-bottom: 1px solid #39424c; + .step-title { + display: flex; + align-items: center; + gap: 10px; + font-size: 24px; + span { + background: linear-gradient(52.42deg, #cd62ff 35.31%, #62aaff 89.64%), + linear-gradient(0deg, #ffffff, #ffffff); + background-clip: text; + -webkit-background-clip: text; + font-style: italic; + color: transparent; + display: inline-block; + padding-right: 5px; + } + } + .buttons { + display: flex; + gap: 20px; + align-items: center; + justify-content: end; + .next-button { + display: flex; + align-items: center; + justify-content: center; + color: #ffffff; + gap: 10px; + background: linear-gradient(52.42deg, #cd62ff 35.31%, #62aaff 89.64%); + padding: 12px 24px 12px 24px; + border-radius: 999px; + + //styleName: Text/Medium 16pt · 1rem; + font-family: Rubik; + font-size: 16px; + font-weight: 500; + line-height: 24px; + letter-spacing: 0em; + text-align: center; + white-space: nowrap; + &[data-disabled] { + background: #39424c; + color: #ffffff; + } + } + .skip-button { + display: flex; + align-items: center; + justify-content: center; + color: black; + gap: 10px; + background: white; + padding: 12px 24px 12px 24px; + border-radius: 999px; + + //styleName: Text/Medium 16pt · 1rem; + font-family: Rubik; + font-size: 16px; + font-weight: 500; + line-height: 24px; + letter-spacing: 0em; + text-align: center; + white-space: nowrap; + } + } + } .steps-container { display: flex; flex-direction: row; @@ -346,7 +509,7 @@ const Box = styled.main` } .step-info { width: 300px; - margin-top: 100px; + margin-top: 60px; /* height: 600px; */ display: flex; flex-direction: row; @@ -390,105 +553,25 @@ const Box = styled.main` } } .step-action { - width: 800px; - height: 600px; + width: 900px; + max-height: 600px; display: flex; flex-direction: column; align-items: center; /* justify-content: center; */ gap: 20px; - } -` - -const DappCreateContainer = styled.div` - width: 100%; - > div { - display: flex; - flex-direction: column; - gap: 20px; - - h1 { - font-style: italic; - font-weight: 700; - font-size: 24px; - line-height: 28px; + > p { + width: 100%; + padding: 0; margin: 0; - margin-top: 20px; - color: #ffffff; } - > div { - background: #1b1e23; - border-radius: 20px; + width: 100%; + height: 100%; display: flex; flex-direction: column; - justify-content: center; - padding: 40px; - gap: 40px; - - .app-name { - display: flex; - flex-direction: column; - - > span { - font-weight: 500; - font-size: 16px; - line-height: 24px; - margin-bottom: 8px; - } - - > input { - background: #1a1e23; - outline: none; - border: 1px solid #39424c; - border-radius: 12px; - height: 48px; - padding: 0px 16px; - color: #ffffff; - font-weight: 400; - font-size: 16px; - line-height: 24px; - } - } - - .btns { - display: flex; - align-items: center; - justify-content: end; - gap: 20px; - - button { - font-weight: 500; - font-size: 16px; - line-height: 24px; - - text-align: center; - - width: 120px; - background: none; - outline: none; - border: none; - cursor: pointer; - border: 1px solid #39424c; - border-radius: 24px; - height: 48px; - &.cancel { - background: #1b1e23; - - color: #ffffff; - } - - &.create { - color: #14171a; - background: #ffffff; - border-radius: 24px; - } - - > img { - height: 27px; - } - } - } + gap: 20px; + box-sizing: border-box; } } ` From 125ffd1fcf651981c27d8a1841599279e9de49f5 Mon Sep 17 00:00:00 2001 From: bufan Date: Sun, 4 Feb 2024 18:21:36 +0800 Subject: [PATCH 126/127] fix extra scalar issue --- .../dashboard/src/components/model/CompositeEditor.tsx | 9 +++++---- packages/client/dashboard/src/container/DappEditor.tsx | 1 + .../dashboard/src/utils/composedb-types/scalars.ts | 10 +++++----- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/client/dashboard/src/components/model/CompositeEditor.tsx b/packages/client/dashboard/src/components/model/CompositeEditor.tsx index 24387084..5b9b3bf8 100644 --- a/packages/client/dashboard/src/components/model/CompositeEditor.tsx +++ b/packages/client/dashboard/src/components/model/CompositeEditor.tsx @@ -4,20 +4,21 @@ import { useEffect, useState } from 'react' import styled from 'styled-components' import { useCeramicNodeCtx } from '../../context/CeramicNodeCtx' import { getRuntimeDefinitionFromEncodedComposite } from '../../utils/composeDBUtils' -import { schemas } from '../../utils/composedb-types/schemas' import CodeDownload from './CodeDownload' export default function CompositeEditor ({ schema, + library, encodedDefinition }: { schema?: string + library?: string encodedDefinition: string }) { const { currCeramicNode } = useCeramicNodeCtx() const [gqlSchema, setGqlSchema] = useState({ code: schema || '', - libraries: schemas.library + libraries: library || '' }) const [runtimeDefinition, setRuntimeDefinition] = useState(null) @@ -39,9 +40,9 @@ export default function CompositeEditor ({ useEffect(() => { setGqlSchema({ code: schema || '', - libraries: schemas.library + libraries: library || '' }) - }, [schema]) + }, [library, schema]) return ( diff --git a/packages/client/dashboard/src/container/DappEditor.tsx b/packages/client/dashboard/src/container/DappEditor.tsx index 72c86808..a70dec83 100644 --- a/packages/client/dashboard/src/container/DappEditor.tsx +++ b/packages/client/dashboard/src/container/DappEditor.tsx @@ -46,6 +46,7 @@ export default function DappEditor () {
diff --git a/packages/client/dashboard/src/utils/composedb-types/scalars.ts b/packages/client/dashboard/src/utils/composedb-types/scalars.ts index a0e9cb0d..bdcb7eca 100644 --- a/packages/client/dashboard/src/utils/composedb-types/scalars.ts +++ b/packages/client/dashboard/src/utils/composedb-types/scalars.ts @@ -98,10 +98,10 @@ export const extraScalars: Record = { ...getGraphQLScalarSchema('date'), maxLength: 100, }, - // DateTime: { - // ...getGraphQLScalarSchema('datetime'), - // maxLength: 100, - // }, + DateTime: { + ...getGraphQLScalarSchema('datetime'), + maxLength: 100, + }, DID: { ...getGraphQLScalarSchema('did'), maxLength: 100 }, Latitude: getGraphQLScalarSchema('latitude'), LocalDate: { @@ -126,7 +126,7 @@ export const extraScalars: Record = { ...getGraphQLScalarSchema('timezone'), maxLength: 100, }, - // URI: { ...getGraphQLScalarSchema('uri'), maxLength: 100 }, + URI: { ...getGraphQLScalarSchema('uri'), maxLength: 100 }, UTCOffset: { ...getGraphQLScalarSchema('utcoffset'), maxLength: 100, From e9ea3c646251ab269df3f731b584dfc53401857d Mon Sep 17 00:00:00 2001 From: bufan Date: Mon, 5 Feb 2024 10:08:56 +0800 Subject: [PATCH 127/127] hide right nav --- packages/client/dashboard/src/App.tsx | 82 +++++++++++++-------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/packages/client/dashboard/src/App.tsx b/packages/client/dashboard/src/App.tsx index 10c77265..dd3fecd3 100644 --- a/packages/client/dashboard/src/App.tsx +++ b/packages/client/dashboard/src/App.tsx @@ -3,9 +3,9 @@ import { ProfileStateProvider } from '@us3r-network/profile' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' import { useEffect, useState } from 'react' -import { Radio, RadioGroup } from 'react-aria-components' +// import { Radio, RadioGroup } from 'react-aria-components' import { - NavLink, + // NavLink, Outlet, Route, Routes, @@ -171,25 +171,25 @@ function BuildLayout () { const [selectModel, setSelectModel] = useState() const [selectComposite, setSelectComposite] = useState() const { pathname } = useLocation() - const defaultKey = pathname.split('/build/')[1] - const PAGES = [ - { - id: 'editor', - label: 'Editor' - }, - { - id: 'playground', - label: 'Playground' - }, - { - id: 'sdk', - label: 'SDK' - }, - { - id: 'metrics', - label: 'Metrics' - } - ] + // const defaultKey = pathname.split('/build/')[1] + // const PAGES = [ + // { + // id: 'editor', + // label: 'Editor' + // }, + // { + // id: 'playground', + // label: 'Playground' + // }, + // { + // id: 'sdk', + // label: 'SDK' + // }, + // { + // id: 'metrics', + // label: 'Metrics' + // } + // ] return ( - {page.label} ))} - + */}
) } function ExploreLayout () { - const { pathname } = useLocation() - const defaultKey = pathname.split('/explore/')[1] - const PAGES = [ - { - id: 'model', - label: 'Models' - }, - { - id: 'composite', - label: 'Composites' - }, - { - id: 'components', - label: 'Components' - } - ] + // const { pathname } = useLocation() + // const defaultKey = pathname.split('/explore/')[1] + // const PAGES = [ + // { + // id: 'model', + // label: 'Models' + // }, + // { + // id: 'composite', + // label: 'Composites' + // }, + // { + // id: 'components', + // label: 'Components' + // } + // ] return ( - {page.label} ))} - + */} ) }