From 238f69c877a046527f0d63cd50b16c0bb8a1a422 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 11 Sep 2024 19:24:41 +0300 Subject: [PATCH 01/23] Add useProgram hook gen --- js/cli/src/app.ts | 30 ++++++++++++++++++++++++++---- js/cli/src/generate/hooks-gen.ts | 25 +++++++++++++++++++++++++ js/cli/src/generate/index.ts | 10 ++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 js/cli/src/generate/hooks-gen.ts diff --git a/js/cli/src/app.ts b/js/cli/src/app.ts index b4611bf0..1cb71362 100644 --- a/js/cli/src/app.ts +++ b/js/cli/src/app.ts @@ -7,12 +7,18 @@ import { Sails } from 'sails-js'; import * as _path from 'path'; import { confirm } from '@inquirer/prompts'; -import { generateLib } from './generate/index.js'; +import { generateHooks, generateLib } from './generate/index.js'; import * as config from './config.json'; const program = new Command(); -const handler = async (path: string, out: string, name: string, project: boolean) => { +const handler = async ( + path: string, + out: string, + name: string, + project: boolean, + generate: (sails: Sails, className?: string) => string, +) => { const parser = new SailsIdlParser(); await parser.init(); const sails = new Sails(parser); @@ -43,7 +49,7 @@ const handler = async (path: string, out: string, name: string, project: boolean let libCode: string; try { - libCode = generateLib(sails.parseIdl(idl), name); + libCode = generate(sails.parseIdl(idl), name); } catch (e) { console.log(e.message, e.stack); process.exit(1); @@ -129,7 +135,23 @@ program .description('Generate typescript library based on .sails.idl file') .action(async (path, options: { out: string; name: string; project: boolean }) => { try { - await handler(path, options.out, options.name, options.project); + await handler(path, options.out, options.name, options.project, generateLib); + } catch (error) { + console.error(error.message); + process.exit(1); + } + process.exit(0); + }); + +program + .command('generateHooks ') + .option('--no-project', 'Generate single file without project structure') + .option('-n --name ', 'Name of the library', 'program') + .option('-o --out ', 'Output directory') + .description('Generate typescript library based on .sails.idl file') + .action(async (path, options: { out: string; name: string; project: boolean }) => { + try { + await handler(path, options.out, options.name, options.project, generateHooks); } catch (error) { console.error(error.message); process.exit(1); diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts new file mode 100644 index 00000000..99362618 --- /dev/null +++ b/js/cli/src/generate/hooks-gen.ts @@ -0,0 +1,25 @@ +import { ISailsProgram } from 'sails-js-types'; + +import { Output } from './output.js'; +import { BaseGenerator } from './base.js'; + +export class HooksGenerator extends BaseGenerator { + constructor(out: Output, private _program: ISailsProgram) { + super(out); + } + + private generateUseProgramReturn = () => { + this._out.line('return useGearProgram({ library: Program, id })'); + }; + + public generate() { + const libFileName = 'lib'; // TODO: pass file name + + this._out + .import('@gear-js/api', 'HexString') + .import('@gear-js/react-hooks', 'useProgram as useGearProgram') + .import(`./${libFileName}`, 'Program') + .block(`export function useProgram(id: HexString | undefined)`, this.generateUseProgramReturn) + .line(); + } +} diff --git a/js/cli/src/generate/index.ts b/js/cli/src/generate/index.ts index 163fe1a0..c16daf6b 100644 --- a/js/cli/src/generate/index.ts +++ b/js/cli/src/generate/index.ts @@ -2,6 +2,7 @@ import { Sails } from 'sails-js'; import { ServiceGenerator } from './service-gen.js'; import { TypesGenerator } from './types-gen.js'; +import { HooksGenerator } from './hooks-gen.js'; import { Output } from './output.js'; export function generateLib(sails: Sails, className = 'Program'): string { @@ -16,3 +17,12 @@ export function generateLib(sails: Sails, className = 'Program'): string { return out.finalize(); } + +export function generateHooks(sails: Sails): string { + const out = new Output(); + + const hooksGen = new HooksGenerator(out, sails.program); + hooksGen.generate(); + + return out.finalize(); +} From 4352f6f217e84c597bd8b516db8909df95fca704 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 11 Sep 2024 20:06:15 +0300 Subject: [PATCH 02/23] Add useSendTransaction hooks gen --- js/cli/src/generate/hooks-gen.ts | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 99362618..04a790bf 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -13,13 +13,33 @@ export class HooksGenerator extends BaseGenerator { }; public generate() { - const libFileName = 'lib'; // TODO: pass file name + const LIB_FILE_NAME = 'lib'; // TODO: pass file name this._out .import('@gear-js/api', 'HexString') - .import('@gear-js/react-hooks', 'useProgram as useGearProgram') - .import(`./${libFileName}`, 'Program') + .import('@gear-js/react-hooks', 'useProgram as useGearProgram, useSendProgramTransaction') + .import(`./${LIB_FILE_NAME}`, 'Program') .block(`export function useProgram(id: HexString | undefined)`, this.generateUseProgramReturn) .line(); + + Object.values(this._program.services).forEach(({ funcs, ...service }) => { + funcs.forEach((func) => { + if (func.isQuery) return; + + this._out + .block( + `export function useSend${service.name}${func.name}Transaction(programId: HexString | undefined)`, + () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useSendProgramTransaction({ program, serviceName: '${service.name}', functionName: '${func.name}' })`, + ); + }, + ) + .line(); + }); + }); } } From 536bc0ae515deb15202075b925958daed576c6e8 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 11 Sep 2024 20:19:54 +0300 Subject: [PATCH 03/23] Add useQuery hooks gen --- js/cli/src/generate/hooks-gen.ts | 61 +++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 04a790bf..d07f93dc 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -12,34 +12,55 @@ export class HooksGenerator extends BaseGenerator { this._out.line('return useGearProgram({ library: Program, id })'); }; + private generateUseSendTransaction = (serviceName: string, functionName: string) => { + const name = `useSend${serviceName}${functionName}Transaction`; + + this._out + .block(`export function ${name}(programId: HexString | undefined)`, () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useSendProgramTransaction({ program, serviceName: '${serviceName}', functionName: '${functionName}' })`, + ); + }) + .line(); + }; + + private generateUseQuery = (serviceName: string, functionName: string) => { + const name = `use${serviceName}${functionName}Query`; + + this._out + // TODO: args type + .block(`export function ${name}(programId: HexString | undefined, args: any)`, () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useProgramQuery({ program, serviceName: '${serviceName}', functionName: '${functionName}', args })`, + ); + }) + .line(); + }; + public generate() { const LIB_FILE_NAME = 'lib'; // TODO: pass file name this._out .import('@gear-js/api', 'HexString') - .import('@gear-js/react-hooks', 'useProgram as useGearProgram, useSendProgramTransaction') + .import('@gear-js/react-hooks', 'useProgram as useGearProgram, useSendProgramTransaction, useProgramQuery') .import(`./${LIB_FILE_NAME}`, 'Program') .block(`export function useProgram(id: HexString | undefined)`, this.generateUseProgramReturn) .line(); - Object.values(this._program.services).forEach(({ funcs, ...service }) => { - funcs.forEach((func) => { - if (func.isQuery) return; - - this._out - .block( - `export function useSend${service.name}${func.name}Transaction(programId: HexString | undefined)`, - () => { - this._out - .line('const { data: program } = useProgram(programId)') - .line() - .line( - `return useSendProgramTransaction({ program, serviceName: '${service.name}', functionName: '${func.name}' })`, - ); - }, - ) - .line(); - }); - }); + for (const service of this._program.services) { + for (const { isQuery, name } of service.funcs) { + if (isQuery) { + this.generateUseQuery(service.name, name); + } else { + this.generateUseSendTransaction(service.name, name); + } + } + } } } From 2ea3e0cc0452b7c5c5591ac5665d18b2a5ade5e9 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 12 Sep 2024 00:05:00 +0300 Subject: [PATCH 04/23] Add useProgramEvent hooks gen --- js/cli/src/generate/hooks-gen.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index d07f93dc..4fee2e50 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -43,12 +43,31 @@ export class HooksGenerator extends BaseGenerator { .line(); }; + private generateUseEvent = (serviceName: string, eventName: string) => { + const name = `use${serviceName}${eventName}Event`; + + this._out + // TODO: onData type + .block(`export function ${name}(programId: HexString | undefined, onData: any)`, () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useProgramEvent({ program, serviceName: '${serviceName}', functionName: '${eventName}', onData })`, + ); + }) + .line(); + }; + public generate() { const LIB_FILE_NAME = 'lib'; // TODO: pass file name this._out .import('@gear-js/api', 'HexString') - .import('@gear-js/react-hooks', 'useProgram as useGearProgram, useSendProgramTransaction, useProgramQuery') + .import( + '@gear-js/react-hooks', + 'useProgram as useGearProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', + ) .import(`./${LIB_FILE_NAME}`, 'Program') .block(`export function useProgram(id: HexString | undefined)`, this.generateUseProgramReturn) .line(); @@ -61,6 +80,10 @@ export class HooksGenerator extends BaseGenerator { this.generateUseSendTransaction(service.name, name); } } + + for (const { name } of service.events) { + this.generateUseEvent(service.name, name); + } } } } From b9fde6619d4ccef329236a1d4c6ca4c0654a98bc Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 12 Sep 2024 18:04:27 +0300 Subject: [PATCH 05/23] Generate hooks alongside with lib --- js/cli/src/app.ts | 104 ++++++++++++++++--------------- js/cli/src/config.json | 1 + js/cli/src/generate/hooks-gen.ts | 8 +-- 3 files changed, 59 insertions(+), 54 deletions(-) diff --git a/js/cli/src/app.ts b/js/cli/src/app.ts index 1cb71362..87b8d8b2 100644 --- a/js/cli/src/app.ts +++ b/js/cli/src/app.ts @@ -12,13 +12,7 @@ import * as config from './config.json'; const program = new Command(); -const handler = async ( - path: string, - out: string, - name: string, - project: boolean, - generate: (sails: Sails, className?: string) => string, -) => { +const handler = async (path: string, out: string, name: string, project: boolean, withHooks: boolean) => { const parser = new SailsIdlParser(); await parser.init(); const sails = new Sails(parser); @@ -28,6 +22,11 @@ const handler = async ( out = out || '.'; const dir = out; const libFile = project ? _path.join(dir, 'src', 'lib.ts') : _path.join(dir, 'lib.ts'); + let hooksFile = ''; + + if (withHooks) { + hooksFile = project ? _path.join(dir, 'src', 'hooks.ts') : _path.join(dir, 'hooks.ts'); + } if (!existsSync(dir)) { mkdirSync(dir, { recursive: true }); @@ -44,12 +43,25 @@ const handler = async ( process.exit(0); } } + + if (hooksFile && existsSync(hooksFile)) { + const answer = await confirm({ + message: `File ${hooksFile} exists. Do you want to overwrite?`, + default: false, + }); + + if (!answer) { + process.exit(0); + } + } } let libCode: string; + let hooksCode: string; try { - libCode = generate(sails.parseIdl(idl), name); + libCode = generateLib(sails.parseIdl(idl), name); + hooksCode = withHooks ? generateHooks(sails.parseIdl(idl)) : ''; } catch (e) { console.log(e.message, e.stack); process.exit(1); @@ -57,7 +69,13 @@ const handler = async ( if (!project) { writeFileSync(libFile, libCode); - console.log(`Lib generated at ${libFile}`); + + if (hooksFile && hooksCode) { + writeFileSync(hooksFile, hooksCode); + console.log(`Lib and hooks are generated at ${libFile} and ${hooksFile}`); + } else { + console.log(`Lib generated at ${libFile}`); + } } else { const srcDir = _path.join(dir, 'src'); const tsconfigPath = _path.join(dir, 'tsconfig.json'); @@ -94,33 +112,36 @@ const handler = async ( writeFileSync(_path.join(srcDir, 'lib.ts'), libCode); + if (hooksCode) { + writeFileSync(_path.join(srcDir, 'hooks.ts'), hooksCode); + } + if (writeTsconfig) { writeFileSync(_path.join(dir, 'tsconfig.json'), JSON.stringify(config.tsconfig, null, 2)); } if (writePkgJson) { - writeFileSync( - _path.join(dir, 'package.json'), - JSON.stringify( - { - name, - type: 'module', - dependencies: { - '@gear-js/api': config.versions['gear-js'], - '@polkadot/api': config.versions['polkadot-api'], - 'sails-js': config.versions['sails-js'], - }, - devDependencies: { - typescript: config.versions['typescript'], - }, - scripts: { - build: 'tsc', - }, - }, - null, - 2, - ), - ); + const packageJson = { + name, + type: 'module', + dependencies: { + '@gear-js/api': config.versions['gear-js'], + '@polkadot/api': config.versions['polkadot-api'], + 'sails-js': config.versions['sails-js'], + }, + devDependencies: { + typescript: config.versions['typescript'], + }, + scripts: { + build: 'tsc', + }, + }; + + if (withHooks) { + packageJson.dependencies['@gear-js/react-hooks'] = config.versions['gear-js-hooks']; + } + + writeFileSync(_path.join(dir, 'package.json'), JSON.stringify(packageJson, null, 2)); } console.log(`Lib generated at ${dir}`); @@ -130,28 +151,13 @@ const handler = async ( program .command('generate ') .option('--no-project', 'Generate single file without project structure') + .option('--with-hooks', 'Generate React hooks') .option('-n --name ', 'Name of the library', 'program') .option('-o --out ', 'Output directory') .description('Generate typescript library based on .sails.idl file') - .action(async (path, options: { out: string; name: string; project: boolean }) => { - try { - await handler(path, options.out, options.name, options.project, generateLib); - } catch (error) { - console.error(error.message); - process.exit(1); - } - process.exit(0); - }); - -program - .command('generateHooks ') - .option('--no-project', 'Generate single file without project structure') - .option('-n --name ', 'Name of the library', 'program') - .option('-o --out ', 'Output directory') - .description('Generate typescript library based on .sails.idl file') - .action(async (path, options: { out: string; name: string; project: boolean }) => { + .action(async (path, options: { out: string; name: string; project: boolean; withHooks: boolean }) => { try { - await handler(path, options.out, options.name, options.project, generateHooks); + await handler(path, options.out, options.name, options.project, options.withHooks); } catch (error) { console.error(error.message); process.exit(1); diff --git a/js/cli/src/config.json b/js/cli/src/config.json index 6a9df764..845db179 100644 --- a/js/cli/src/config.json +++ b/js/cli/src/config.json @@ -16,6 +16,7 @@ }, "versions": { "gear-js": "0.38.2", + "gear-js-hooks": "0.13.0", "polkadot-api": "12.0.1", "sails-js": "0.2.0", "typescript": "^5.5.4" diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 4fee2e50..8b764cc8 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -8,10 +8,6 @@ export class HooksGenerator extends BaseGenerator { super(out); } - private generateUseProgramReturn = () => { - this._out.line('return useGearProgram({ library: Program, id })'); - }; - private generateUseSendTransaction = (serviceName: string, functionName: string) => { const name = `useSend${serviceName}${functionName}Transaction`; @@ -69,7 +65,9 @@ export class HooksGenerator extends BaseGenerator { 'useProgram as useGearProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', ) .import(`./${LIB_FILE_NAME}`, 'Program') - .block(`export function useProgram(id: HexString | undefined)`, this.generateUseProgramReturn) + .block('export function useProgram(id: HexString | undefined)', () => + this._out.line('return useGearProgram({ library: Program, id })'), + ) .line(); for (const service of this._program.services) { From 9d7b61bae5f45420779e3e4d9b236bc2e6e0db9b Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 12 Sep 2024 18:42:30 +0300 Subject: [PATCH 06/23] Fix service and function names case --- js/cli/src/generate/hooks-gen.ts | 36 +++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 8b764cc8..ca8af97e 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -1,4 +1,5 @@ import { ISailsProgram } from 'sails-js-types'; +import { toLowerCaseFirst } from 'sails-js-util'; import { Output } from './output.js'; import { BaseGenerator } from './base.js'; @@ -17,7 +18,9 @@ export class HooksGenerator extends BaseGenerator { .line('const { data: program } = useProgram(programId)') .line() .line( - `return useSendProgramTransaction({ program, serviceName: '${serviceName}', functionName: '${functionName}' })`, + `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( + serviceName, + )}', functionName: '${toLowerCaseFirst(functionName)}' })`, ); }) .line(); @@ -33,7 +36,9 @@ export class HooksGenerator extends BaseGenerator { .line('const { data: program } = useProgram(programId)') .line() .line( - `return useProgramQuery({ program, serviceName: '${serviceName}', functionName: '${functionName}', args })`, + `return useProgramQuery({ program, serviceName: '${toLowerCaseFirst( + serviceName, + )}', functionName: '${toLowerCaseFirst(functionName)}', args })`, ); }) .line(); @@ -49,39 +54,36 @@ export class HooksGenerator extends BaseGenerator { .line('const { data: program } = useProgram(programId)') .line() .line( - `return useProgramEvent({ program, serviceName: '${serviceName}', functionName: '${eventName}', onData })`, + `return useProgramEvent({ program, serviceName: '${toLowerCaseFirst( + serviceName, + )}', functionName: '${toLowerCaseFirst(eventName)}', onData })`, ); }) .line(); }; public generate() { + const { services } = this._program; const LIB_FILE_NAME = 'lib'; // TODO: pass file name this._out .import('@gear-js/api', 'HexString') .import( '@gear-js/react-hooks', - 'useProgram as useGearProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', + 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', ) .import(`./${LIB_FILE_NAME}`, 'Program') .block('export function useProgram(id: HexString | undefined)', () => - this._out.line('return useGearProgram({ library: Program, id })'), + this._out.line('return useSailsProgram({ library: Program, id })'), ) .line(); - for (const service of this._program.services) { - for (const { isQuery, name } of service.funcs) { - if (isQuery) { - this.generateUseQuery(service.name, name); - } else { - this.generateUseSendTransaction(service.name, name); - } - } + Object.values(services).forEach(({ funcs, events, ...service }) => { + funcs.forEach(({ isQuery, name }) => + (isQuery ? this.generateUseQuery : this.generateUseSendTransaction)(service.name, name), + ); - for (const { name } of service.events) { - this.generateUseEvent(service.name, name); - } - } + events.forEach(({ name }) => this.generateUseEvent(service.name, name)); + }); } } From 3a1322f2491fd835dd93e3ecc056e32fe1bad1f7 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 12 Sep 2024 21:50:59 +0300 Subject: [PATCH 07/23] Fix events function name --- js/cli/src/generate/hooks-gen.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index ca8af97e..abf14e1f 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -56,7 +56,7 @@ export class HooksGenerator extends BaseGenerator { .line( `return useProgramEvent({ program, serviceName: '${toLowerCaseFirst( serviceName, - )}', functionName: '${toLowerCaseFirst(eventName)}', onData })`, + )}', functionName: 'subscribeTo${eventName}Event', onData })`, ); }) .line(); From 8e197905ef446ce729a9b5f7568fbb5606c1dccc Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 12 Sep 2024 22:42:35 +0300 Subject: [PATCH 08/23] Add useQuery and useEvent args types --- js/cli/src/generate/hooks-gen.ts | 52 ++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index abf14e1f..6ca337c3 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -28,37 +28,43 @@ export class HooksGenerator extends BaseGenerator { private generateUseQuery = (serviceName: string, functionName: string) => { const name = `use${serviceName}${functionName}Query`; + const formattedServiceName = toLowerCaseFirst(serviceName); + const formattedFunctionName = toLowerCaseFirst(functionName); this._out - // TODO: args type - .block(`export function ${name}(programId: HexString | undefined, args: any)`, () => { - this._out - .line('const { data: program } = useProgram(programId)') - .line() - .line( - `return useProgramQuery({ program, serviceName: '${toLowerCaseFirst( - serviceName, - )}', functionName: '${toLowerCaseFirst(functionName)}', args })`, - ); - }) + // TODO: rest parameters + .block( + `export function ${name}(programId: HexString | undefined, args: QueryArgs['${formattedServiceName}']['${formattedFunctionName}']>)`, + () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', args })`, + ); + }, + ) .line(); }; private generateUseEvent = (serviceName: string, eventName: string) => { const name = `use${serviceName}${eventName}Event`; + const formattedServiceName = toLowerCaseFirst(serviceName); + const functionName = `subscribeTo${eventName}Event`; this._out - // TODO: onData type - .block(`export function ${name}(programId: HexString | undefined, onData: any)`, () => { - this._out - .line('const { data: program } = useProgram(programId)') - .line() - .line( - `return useProgramEvent({ program, serviceName: '${toLowerCaseFirst( - serviceName, - )}', functionName: 'subscribeTo${eventName}Event', onData })`, - ); - }) + // TODO: rest parameters + .block( + `export function ${name}(programId: HexString | undefined, onData: (...args: EventCallbackArgs['${formattedServiceName}']['${functionName}']>>) => void)`, + () => { + this._out + .line('const { data: program } = useProgram(programId)') + .line() + .line( + `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', onData })`, + ); + }, + ) .line(); }; @@ -72,6 +78,8 @@ export class HooksGenerator extends BaseGenerator { '@gear-js/react-hooks', 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', ) + // TODO: combine with above after hooks update + .import('@gear-js/react-hooks/dist/esm/hooks/sails/types', 'Event, EventCallbackArgs, QueryArgs') .import(`./${LIB_FILE_NAME}`, 'Program') .block('export function useProgram(id: HexString | undefined)', () => this._out.line('return useSailsProgram({ library: Program, id })'), From c09383ad875e440a5ed722cad9d6fba4ff67367c Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 13 Sep 2024 01:08:23 +0300 Subject: [PATCH 09/23] Define hook parameters --- js/cli/src/generate/hooks-gen.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 6ca337c3..4b281cec 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -4,6 +4,38 @@ import { toLowerCaseFirst } from 'sails-js-util'; import { Output } from './output.js'; import { BaseGenerator } from './base.js'; +// type UseProgramParameters = Omit, 'library'>; + +// type ProgramType = InstanceType; +// type ServiceName = SailsServiceName; + +// type UseQueryParameters< +// TServiceName extends ServiceName, +// TFunctionName extends QueryName, +// > = Omit< +// UseProgramQueryParameters< +// ProgramType, +// TServiceName, +// TFunctionName, +// QueryArgs, +// QueryReturn +// >, +// 'program' | 'serviceName' | 'functionName' +// >; + +// type UseEventParameters< +// TServiceName extends ServiceName, +// TFunctionName extends FunctionName, +// > = Omit< +// UseProgramEventParameters< +// ProgramType, +// TServiceName, +// TFunctionName, +// EventCallbackArgs> +// >, +// 'program' | 'serviceName' | 'functionName' +// >; + export class HooksGenerator extends BaseGenerator { constructor(out: Output, private _program: ISailsProgram) { super(out); From 39910dcefac415ac79df8c8689a0542dc12f9e63 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 13 Sep 2024 16:30:50 +0300 Subject: [PATCH 10/23] Add hooks parameters --- js/cli/src/generate/hooks-gen.ts | 62 +++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 4b281cec..099dc88c 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -41,13 +41,47 @@ export class HooksGenerator extends BaseGenerator { super(out); } + private generateTypes = () => { + this._out + .line("type UseProgramParameters = Omit, 'library'>") + .line('type ProgramType = InstanceType') + .line('type ServiceName = SailsServiceName') + .line() + .line('type UseQueryParameters<', false) + .line(' TServiceName extends ServiceName,', false) + .line(' TFunctionName extends QueryName,', false) + .line('> = Omit<', false) + .line(' UseProgramQueryParameters<', false) + .line(' ProgramType,', false) + .line(' TServiceName,', false) + .line(' TFunctionName,', false) + .line(' QueryArgs,', false) + .line(' QueryReturn', false) + .line(' >,', false) + .line(" 'program' | 'serviceName' | 'functionName'", false) + .line('>') + .line() + .line('type UseEventParameters<', false) + .line(' TServiceName extends ServiceName,', false) + .line(' TFunctionName extends FunctionName,', false) + .line('> = Omit<', false) + .line(' UseProgramEventParameters<', false) + .line(' ProgramType,', false) + .line(' TServiceName,', false) + .line(' TFunctionName,', false) + .line(' EventCallbackArgs>', false) + .line(' >,', false) + .line(" 'program' | 'serviceName' | 'functionName'", false) + .line('>;'); + }; + private generateUseSendTransaction = (serviceName: string, functionName: string) => { const name = `useSend${serviceName}${functionName}Transaction`; this._out .block(`export function ${name}(programId: HexString | undefined)`, () => { this._out - .line('const { data: program } = useProgram(programId)') + .line('const { data: program } = useProgram({ id: programId })') .line() .line( `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( @@ -64,15 +98,14 @@ export class HooksGenerator extends BaseGenerator { const formattedFunctionName = toLowerCaseFirst(functionName); this._out - // TODO: rest parameters .block( - `export function ${name}(programId: HexString | undefined, args: QueryArgs['${formattedServiceName}']['${formattedFunctionName}']>)`, + `export function ${name}(programId: HexString | undefined, parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, () => { this._out - .line('const { data: program } = useProgram(programId)') + .line('const { data: program } = useProgram({ id: programId })') .line() .line( - `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', args })`, + `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', ...parameters })`, ); }, ) @@ -87,13 +120,13 @@ export class HooksGenerator extends BaseGenerator { this._out // TODO: rest parameters .block( - `export function ${name}(programId: HexString | undefined, onData: (...args: EventCallbackArgs['${formattedServiceName}']['${functionName}']>>) => void)`, + `export function ${name}(programId: HexString | undefined, parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, () => { this._out - .line('const { data: program } = useProgram(programId)') + .line('const { data: program } = useProgram({ id: programId })') .line() .line( - `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', onData })`, + `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', ...parameters })`, ); }, ) @@ -108,16 +141,21 @@ export class HooksGenerator extends BaseGenerator { .import('@gear-js/api', 'HexString') .import( '@gear-js/react-hooks', - 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent', + 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent, UseProgramParameters as useSailsProgramParameters, UseProgramQueryParameters, UseProgramEventParameters', ) // TODO: combine with above after hooks update - .import('@gear-js/react-hooks/dist/esm/hooks/sails/types', 'Event, EventCallbackArgs, QueryArgs') + .import( + '@gear-js/react-hooks/dist/esm/hooks/sails/types', + 'Event, EventCallbackArgs, QueryArgs, ServiceName as SailsServiceName, FunctionName, QueryName, QueryReturn, EventReturn', + ) .import(`./${LIB_FILE_NAME}`, 'Program') - .block('export function useProgram(id: HexString | undefined)', () => - this._out.line('return useSailsProgram({ library: Program, id })'), + .block('export function useProgram({ id, ...parameters }: UseProgramParameters)', () => + this._out.line('return useSailsProgram({ library: Program, id, ...parameters })'), ) .line(); + this.generateTypes(); + Object.values(services).forEach(({ funcs, events, ...service }) => { funcs.forEach(({ isQuery, name }) => (isQuery ? this.generateUseQuery : this.generateUseSendTransaction)(service.name, name), From 065cac96f5a4787e8c417c578f9367976e19d5d7 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 13 Sep 2024 17:56:50 +0300 Subject: [PATCH 11/23] Drop programId parameter --- js/cli/src/app.ts | 2 +- js/cli/src/generate/hooks-gen.ts | 96 +++++++++++++++++++++++--------- 2 files changed, 70 insertions(+), 28 deletions(-) diff --git a/js/cli/src/app.ts b/js/cli/src/app.ts index 87b8d8b2..0d67e742 100644 --- a/js/cli/src/app.ts +++ b/js/cli/src/app.ts @@ -25,7 +25,7 @@ const handler = async (path: string, out: string, name: string, project: boolean let hooksFile = ''; if (withHooks) { - hooksFile = project ? _path.join(dir, 'src', 'hooks.ts') : _path.join(dir, 'hooks.ts'); + hooksFile = project ? _path.join(dir, 'src', 'hooks.tsx') : _path.join(dir, 'hooks.tsx'); } if (!existsSync(dir)) { diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 099dc88c..051ccee5 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -4,7 +4,7 @@ import { toLowerCaseFirst } from 'sails-js-util'; import { Output } from './output.js'; import { BaseGenerator } from './base.js'; -// type UseProgramParameters = Omit, 'library'>; +// type UseProgramParameters = Omit, 'library' | 'id'>; // type ProgramType = InstanceType; // type ServiceName = SailsServiceName; @@ -36,14 +36,46 @@ import { BaseGenerator } from './base.js'; // 'program' | 'serviceName' | 'functionName' // >; +// const ProgramIdContext = createContext(undefined); +// const useProgramId = () => useContext(ProgramIdContext); + +// const { Provider } = ProgramIdContext; + +// type Props = { +// value: HexString | undefined; +// children: ReactNode; +// }; + +// export function ProgramIdProvider({ children, value }: Props) { +// return {children}; +// } + export class HooksGenerator extends BaseGenerator { constructor(out: Output, private _program: ISailsProgram) { super(out); } + private generateImports = () => { + const LIB_FILE_NAME = 'lib'; // TODO: pass file name + + this._out + .import('@gear-js/api', 'HexString') + .import( + '@gear-js/react-hooks', + 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent, UseProgramParameters as useSailsProgramParameters, UseProgramQueryParameters, UseProgramEventParameters', + ) + .import('react', 'createContext, ReactNode, useContext') + // TODO: combine with above after hooks update + .import( + '@gear-js/react-hooks/dist/esm/hooks/sails/types', + 'Event, EventCallbackArgs, QueryArgs, ServiceName as SailsServiceName, FunctionName, QueryName, QueryReturn, EventReturn', + ) + .import(`./${LIB_FILE_NAME}`, 'Program'); + }; + private generateTypes = () => { this._out - .line("type UseProgramParameters = Omit, 'library'>") + .line("type UseProgramParameters = Omit, 'library' | 'id'>") .line('type ProgramType = InstanceType') .line('type ServiceName = SailsServiceName') .line() @@ -72,16 +104,41 @@ export class HooksGenerator extends BaseGenerator { .line(' EventCallbackArgs>', false) .line(' >,', false) .line(" 'program' | 'serviceName' | 'functionName'", false) - .line('>;'); + .line('>') + .line(); + }; + + private generateProgramIdContext = () => { + this._out + .line('const ProgramIdContext = createContext(undefined)') + .line('const useProgramId = () => useContext(ProgramIdContext)') + .line('const { Provider } = ProgramIdContext') + .line() + .block('type Props =', () => this._out.line('value: HexString | undefined').line('children: ReactNode')) + .line() + .block('export function ProgramIdProvider({ children, value }: Props)', () => + this._out.line('return {children}'), + ) + .line(); + }; + + private generateUseProgram = () => { + this._out + .block('export function useProgram(parameters?: UseProgramParameters)', () => + this._out + .line('const id = useProgramId()') + .line('return useSailsProgram({ library: Program, id, ...parameters })'), + ) + .line(); }; private generateUseSendTransaction = (serviceName: string, functionName: string) => { const name = `useSend${serviceName}${functionName}Transaction`; this._out - .block(`export function ${name}(programId: HexString | undefined)`, () => { + .block(`export function ${name}()`, () => { this._out - .line('const { data: program } = useProgram({ id: programId })') + .line('const { data: program } = useProgram()') .line() .line( `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( @@ -99,10 +156,10 @@ export class HooksGenerator extends BaseGenerator { this._out .block( - `export function ${name}(programId: HexString | undefined, parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, + `export function ${name}(parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, () => { this._out - .line('const { data: program } = useProgram({ id: programId })') + .line('const { data: program } = useProgram()') .line() .line( `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', ...parameters })`, @@ -120,10 +177,10 @@ export class HooksGenerator extends BaseGenerator { this._out // TODO: rest parameters .block( - `export function ${name}(programId: HexString | undefined, parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, + `export function ${name}(parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, () => { this._out - .line('const { data: program } = useProgram({ id: programId })') + .line('const { data: program } = useProgram()') .line() .line( `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', ...parameters })`, @@ -135,26 +192,11 @@ export class HooksGenerator extends BaseGenerator { public generate() { const { services } = this._program; - const LIB_FILE_NAME = 'lib'; // TODO: pass file name - - this._out - .import('@gear-js/api', 'HexString') - .import( - '@gear-js/react-hooks', - 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent, UseProgramParameters as useSailsProgramParameters, UseProgramQueryParameters, UseProgramEventParameters', - ) - // TODO: combine with above after hooks update - .import( - '@gear-js/react-hooks/dist/esm/hooks/sails/types', - 'Event, EventCallbackArgs, QueryArgs, ServiceName as SailsServiceName, FunctionName, QueryName, QueryReturn, EventReturn', - ) - .import(`./${LIB_FILE_NAME}`, 'Program') - .block('export function useProgram({ id, ...parameters }: UseProgramParameters)', () => - this._out.line('return useSailsProgram({ library: Program, id, ...parameters })'), - ) - .line(); + this.generateImports(); this.generateTypes(); + this.generateProgramIdContext(); + this.generateUseProgram(); Object.values(services).forEach(({ funcs, events, ...service }) => { funcs.forEach(({ isQuery, name }) => From 558cef3cbe34c798e8e918a922a41b1350e276bf Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 16 Sep 2024 16:52:49 +0300 Subject: [PATCH 12/23] Revert programId parameter --- js/cli/src/generate/hooks-gen.ts | 108 +++++++++---------------------- 1 file changed, 30 insertions(+), 78 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 051ccee5..7cfd178e 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -4,52 +4,6 @@ import { toLowerCaseFirst } from 'sails-js-util'; import { Output } from './output.js'; import { BaseGenerator } from './base.js'; -// type UseProgramParameters = Omit, 'library' | 'id'>; - -// type ProgramType = InstanceType; -// type ServiceName = SailsServiceName; - -// type UseQueryParameters< -// TServiceName extends ServiceName, -// TFunctionName extends QueryName, -// > = Omit< -// UseProgramQueryParameters< -// ProgramType, -// TServiceName, -// TFunctionName, -// QueryArgs, -// QueryReturn -// >, -// 'program' | 'serviceName' | 'functionName' -// >; - -// type UseEventParameters< -// TServiceName extends ServiceName, -// TFunctionName extends FunctionName, -// > = Omit< -// UseProgramEventParameters< -// ProgramType, -// TServiceName, -// TFunctionName, -// EventCallbackArgs> -// >, -// 'program' | 'serviceName' | 'functionName' -// >; - -// const ProgramIdContext = createContext(undefined); -// const useProgramId = () => useContext(ProgramIdContext); - -// const { Provider } = ProgramIdContext; - -// type Props = { -// value: HexString | undefined; -// children: ReactNode; -// }; - -// export function ProgramIdProvider({ children, value }: Props) { -// return {children}; -// } - export class HooksGenerator extends BaseGenerator { constructor(out: Output, private _program: ISailsProgram) { super(out); @@ -75,9 +29,10 @@ export class HooksGenerator extends BaseGenerator { private generateTypes = () => { this._out - .line("type UseProgramParameters = Omit, 'library' | 'id'>") + .line("type UseProgramParameters = Omit, 'library'>") .line('type ProgramType = InstanceType') .line('type ServiceName = SailsServiceName') + .line('type ProgramId = { programId?: HexString | undefined }') .line() .line('type UseQueryParameters<', false) .line(' TServiceName extends ServiceName,', false) @@ -91,7 +46,7 @@ export class HooksGenerator extends BaseGenerator { .line(' QueryReturn', false) .line(' >,', false) .line(" 'program' | 'serviceName' | 'functionName'", false) - .line('>') + .line('> & ProgramId') .line() .line('type UseEventParameters<', false) .line(' TServiceName extends ServiceName,', false) @@ -104,7 +59,7 @@ export class HooksGenerator extends BaseGenerator { .line(' EventCallbackArgs>', false) .line(' >,', false) .line(" 'program' | 'serviceName' | 'functionName'", false) - .line('>') + .line('> & ProgramId') .line(); }; @@ -122,30 +77,35 @@ export class HooksGenerator extends BaseGenerator { .line(); }; - private generateUseProgram = () => { + private generateUseProgram = () => this._out .block('export function useProgram(parameters?: UseProgramParameters)', () => this._out - .line('const id = useProgramId()') + .line('const contextId = useProgramId()') + .line("const id = parameters && 'id' in parameters ? parameters.id : contextId") + .line() .line('return useSailsProgram({ library: Program, id, ...parameters })'), ) .line(); - }; + + private generateUseProgramCall = () => + this._out + .line( + "const { data: program } = useProgram(parameters && 'programId' in parameters ? { id: parameters.programId } : undefined)", + ) + .line(); private generateUseSendTransaction = (serviceName: string, functionName: string) => { const name = `useSend${serviceName}${functionName}Transaction`; this._out - .block(`export function ${name}()`, () => { - this._out - .line('const { data: program } = useProgram()') - .line() - .line( - `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( - serviceName, - )}', functionName: '${toLowerCaseFirst(functionName)}' })`, - ); - }) + .block(`export function ${name}(parameters?: ProgramId)`, () => + this.generateUseProgramCall().line( + `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( + serviceName, + )}', functionName: '${toLowerCaseFirst(functionName)}' })`, + ), + ) .line(); }; @@ -157,14 +117,10 @@ export class HooksGenerator extends BaseGenerator { this._out .block( `export function ${name}(parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, - () => { - this._out - .line('const { data: program } = useProgram()') - .line() - .line( - `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', ...parameters })`, - ); - }, + () => + this.generateUseProgramCall().line( + `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', ...parameters })`, + ), ) .line(); }; @@ -178,14 +134,10 @@ export class HooksGenerator extends BaseGenerator { // TODO: rest parameters .block( `export function ${name}(parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, - () => { - this._out - .line('const { data: program } = useProgram()') - .line() - .line( - `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', ...parameters })`, - ); - }, + () => + this.generateUseProgramCall().line( + `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', ...parameters })`, + ), ) .line(); }; From 40dbc196451abfaab0102269f0bfa593ed87ecc5 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 16 Sep 2024 17:08:23 +0300 Subject: [PATCH 13/23] Fix types formatting --- js/cli/src/generate/hooks-gen.ts | 68 +++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 7cfd178e..5929b3b2 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -16,13 +16,26 @@ export class HooksGenerator extends BaseGenerator { .import('@gear-js/api', 'HexString') .import( '@gear-js/react-hooks', - 'useProgram as useSailsProgram, useSendProgramTransaction, useProgramQuery, useProgramEvent, UseProgramParameters as useSailsProgramParameters, UseProgramQueryParameters, UseProgramEventParameters', + `useProgram as useSailsProgram, + useSendProgramTransaction, + useProgramQuery, + useProgramEvent, + UseProgramParameters as useSailsProgramParameters, + UseProgramQueryParameters, + UseProgramEventParameters`, ) .import('react', 'createContext, ReactNode, useContext') // TODO: combine with above after hooks update .import( '@gear-js/react-hooks/dist/esm/hooks/sails/types', - 'Event, EventCallbackArgs, QueryArgs, ServiceName as SailsServiceName, FunctionName, QueryName, QueryReturn, EventReturn', + `Event, + EventCallbackArgs, + QueryArgs, + ServiceName as SailsServiceName, + FunctionName, + QueryName, + QueryReturn, + EventReturn`, ) .import(`./${LIB_FILE_NAME}`, 'Program'); }; @@ -35,30 +48,42 @@ export class HooksGenerator extends BaseGenerator { .line('type ProgramId = { programId?: HexString | undefined }') .line() .line('type UseQueryParameters<', false) - .line(' TServiceName extends ServiceName,', false) - .line(' TFunctionName extends QueryName,', false) + .increaseIndent() + .line('TServiceName extends ServiceName,', false) + .line('TFunctionName extends QueryName,', false) + .reduceIndent() .line('> = Omit<', false) - .line(' UseProgramQueryParameters<', false) - .line(' ProgramType,', false) - .line(' TServiceName,', false) - .line(' TFunctionName,', false) - .line(' QueryArgs,', false) - .line(' QueryReturn', false) - .line(' >,', false) - .line(" 'program' | 'serviceName' | 'functionName'", false) + .increaseIndent() + .line('UseProgramQueryParameters<', false) + .increaseIndent() + .line('ProgramType,', false) + .line('TServiceName,', false) + .line('TFunctionName,', false) + .line('QueryArgs,', false) + .line('QueryReturn', false) + .reduceIndent() + .line('>,', false) + .line("'program' | 'serviceName' | 'functionName'", false) + .reduceIndent() .line('> & ProgramId') .line() .line('type UseEventParameters<', false) - .line(' TServiceName extends ServiceName,', false) - .line(' TFunctionName extends FunctionName,', false) + .increaseIndent() + .line('TServiceName extends ServiceName,', false) + .line('TFunctionName extends FunctionName,', false) + .reduceIndent() .line('> = Omit<', false) - .line(' UseProgramEventParameters<', false) - .line(' ProgramType,', false) - .line(' TServiceName,', false) - .line(' TFunctionName,', false) - .line(' EventCallbackArgs>', false) - .line(' >,', false) - .line(" 'program' | 'serviceName' | 'functionName'", false) + .increaseIndent() + .line('UseProgramEventParameters<', false) + .increaseIndent() + .line('ProgramType,', false) + .line('TServiceName,', false) + .line('TFunctionName,', false) + .line('EventCallbackArgs>', false) + .reduceIndent() + .line('>,', false) + .line("'program' | 'serviceName' | 'functionName'", false) + .reduceIndent() .line('> & ProgramId') .line(); }; @@ -131,7 +156,6 @@ export class HooksGenerator extends BaseGenerator { const functionName = `subscribeTo${eventName}Event`; this._out - // TODO: rest parameters .block( `export function ${name}(parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, () => From 3c8e986610df36db2b435fd422589f4e4a0174ff Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 16 Sep 2024 17:32:05 +0300 Subject: [PATCH 14/23] Drop inner useProgram call --- js/cli/src/generate/hooks-gen.ts | 50 +++++++------------------------- 1 file changed, 11 insertions(+), 39 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 5929b3b2..39c5c0fa 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -13,7 +13,6 @@ export class HooksGenerator extends BaseGenerator { const LIB_FILE_NAME = 'lib'; // TODO: pass file name this._out - .import('@gear-js/api', 'HexString') .import( '@gear-js/react-hooks', `useProgram as useSailsProgram, @@ -24,7 +23,6 @@ export class HooksGenerator extends BaseGenerator { UseProgramQueryParameters, UseProgramEventParameters`, ) - .import('react', 'createContext, ReactNode, useContext') // TODO: combine with above after hooks update .import( '@gear-js/react-hooks/dist/esm/hooks/sails/types', @@ -45,7 +43,7 @@ export class HooksGenerator extends BaseGenerator { .line("type UseProgramParameters = Omit, 'library'>") .line('type ProgramType = InstanceType') .line('type ServiceName = SailsServiceName') - .line('type ProgramId = { programId?: HexString | undefined }') + .line('type ProgramParameter = { program: ProgramType }') .line() .line('type UseQueryParameters<', false) .increaseIndent() @@ -65,7 +63,7 @@ export class HooksGenerator extends BaseGenerator { .line('>,', false) .line("'program' | 'serviceName' | 'functionName'", false) .reduceIndent() - .line('> & ProgramId') + .line('> & ProgramParameter') .line() .line('type UseEventParameters<', false) .increaseIndent() @@ -84,39 +82,14 @@ export class HooksGenerator extends BaseGenerator { .line('>,', false) .line("'program' | 'serviceName' | 'functionName'", false) .reduceIndent() - .line('> & ProgramId') - .line(); - }; - - private generateProgramIdContext = () => { - this._out - .line('const ProgramIdContext = createContext(undefined)') - .line('const useProgramId = () => useContext(ProgramIdContext)') - .line('const { Provider } = ProgramIdContext') - .line() - .block('type Props =', () => this._out.line('value: HexString | undefined').line('children: ReactNode')) - .line() - .block('export function ProgramIdProvider({ children, value }: Props)', () => - this._out.line('return {children}'), - ) + .line('> & ProgramParameter') .line(); }; private generateUseProgram = () => this._out - .block('export function useProgram(parameters?: UseProgramParameters)', () => - this._out - .line('const contextId = useProgramId()') - .line("const id = parameters && 'id' in parameters ? parameters.id : contextId") - .line() - .line('return useSailsProgram({ library: Program, id, ...parameters })'), - ) - .line(); - - private generateUseProgramCall = () => - this._out - .line( - "const { data: program } = useProgram(parameters && 'programId' in parameters ? { id: parameters.programId } : undefined)", + .block('export function useProgram(parameters: UseProgramParameters)', () => + this._out.line('return useSailsProgram({ library: Program, ...parameters })'), ) .line(); @@ -124,8 +97,8 @@ export class HooksGenerator extends BaseGenerator { const name = `useSend${serviceName}${functionName}Transaction`; this._out - .block(`export function ${name}(parameters?: ProgramId)`, () => - this.generateUseProgramCall().line( + .block(`export function ${name}({ program }: ProgramParameter)`, () => + this._out.line( `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( serviceName, )}', functionName: '${toLowerCaseFirst(functionName)}' })`, @@ -143,8 +116,8 @@ export class HooksGenerator extends BaseGenerator { .block( `export function ${name}(parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, () => - this.generateUseProgramCall().line( - `return useProgramQuery({ program, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}', ...parameters })`, + this._out.line( + `return useProgramQuery({ ...parameters, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}' })`, ), ) .line(); @@ -159,8 +132,8 @@ export class HooksGenerator extends BaseGenerator { .block( `export function ${name}(parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, () => - this.generateUseProgramCall().line( - `return useProgramEvent({ program, serviceName: '${formattedServiceName}', functionName: '${functionName}', ...parameters })`, + this._out.line( + `return useProgramEvent({...parameters, serviceName: '${formattedServiceName}', functionName: '${functionName}' })`, ), ) .line(); @@ -171,7 +144,6 @@ export class HooksGenerator extends BaseGenerator { this.generateImports(); this.generateTypes(); - this.generateProgramIdContext(); this.generateUseProgram(); Object.values(services).forEach(({ funcs, events, ...service }) => { From 78f29197208a9b3f1d619f178c59b1970ff4bbee Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 16 Sep 2024 17:44:57 +0300 Subject: [PATCH 15/23] Add usePrepareTransaction hooks gen --- js/cli/src/generate/hooks-gen.ts | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 39c5c0fa..7460714f 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -17,6 +17,7 @@ export class HooksGenerator extends BaseGenerator { '@gear-js/react-hooks', `useProgram as useSailsProgram, useSendProgramTransaction, + usePrepareProgramTransaction, useProgramQuery, useProgramEvent, UseProgramParameters as useSailsProgramParameters, @@ -107,6 +108,20 @@ export class HooksGenerator extends BaseGenerator { .line(); }; + private generateUsePrepareTransaction = (serviceName: string, functionName: string) => { + const name = `usePrepare${serviceName}${functionName}Transaction`; + + this._out + .block(`export function ${name}({ program }: ProgramParameter)`, () => + this._out.line( + `return usePrepareProgramTransaction({ program, serviceName: '${toLowerCaseFirst( + serviceName, + )}', functionName: '${toLowerCaseFirst(functionName)}' })`, + ), + ) + .line(); + }; + private generateUseQuery = (serviceName: string, functionName: string) => { const name = `use${serviceName}${functionName}Query`; const formattedServiceName = toLowerCaseFirst(serviceName); @@ -147,9 +162,12 @@ export class HooksGenerator extends BaseGenerator { this.generateUseProgram(); Object.values(services).forEach(({ funcs, events, ...service }) => { - funcs.forEach(({ isQuery, name }) => - (isQuery ? this.generateUseQuery : this.generateUseSendTransaction)(service.name, name), - ); + funcs.forEach(({ isQuery, name }) => { + if (isQuery) return this.generateUseQuery(service.name, name); + + this.generateUseSendTransaction(service.name, name); + this.generateUsePrepareTransaction(service.name, name); + }); events.forEach(({ name }) => this.generateUseEvent(service.name, name)); }); From d4c3a776009d041613f8c204dd8563d9c28fc0ff Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Mon, 16 Sep 2024 21:24:25 +0300 Subject: [PATCH 16/23] Update readme --- js/cli/README.md | 78 ++++++++++++++++++++++++++++++-- js/cli/src/app.ts | 2 +- js/cli/src/generate/hooks-gen.ts | 2 +- 3 files changed, 77 insertions(+), 5 deletions(-) diff --git a/js/cli/README.md b/js/cli/README.md index 151d9771..a131e95a 100644 --- a/js/cli/README.md +++ b/js/cli/README.md @@ -1,7 +1,9 @@ # Overview + The `sails-js-cli` is a command-line tool designed to generate TypeScript client libraries from Sails IDL files. It automates the process of creating fully functional client libraries based on the interfaces defined in the Sails framework, streamlining development and ensuring consistency between client and on-chain programs. # Installation + To install the `sails-js-cli` package globally, run the following command: ```bash @@ -15,6 +17,7 @@ npx sails-js-cli command ...args ``` # Generate typescript client library using the IDL file + To generate a TypeScript client library run the following command: ```bash @@ -33,12 +36,18 @@ If you want to generate only `lib.ts` file without the whole project structure, sails-js generate path/to/sails.idl -o path/to/out/dir --no-project ``` +React hooks generation is available via `--with-hooks` flag: + +```bash +sails-js generate path/to/sails.idl -o path/to/out/dir --with-hooks +``` # Use generated library ## Create an instance First, connect to the chain using `@gear-js/api`. + ```javascript import { GearApi } from '@gear-js/api'; @@ -60,7 +69,6 @@ const program = new Program(api, programId); The `Program` class has all the functions available in the IDL file. - ## Methods There are a few types of methods available in the `Program` class. @@ -71,6 +79,7 @@ There are a few types of methods available in the `Program` class. - Event subscription methods ### Query methods + Query methods are used to query the program state. These methods accept the arguments needed to call the function in the program and return the result. Apart from the arguments, these functions also accept optional parameters: `originAddress` is the address of the account that is calling the function (if this parameter isn't provided zero address is used as a default value), `value` is a parameter parameter can be used depending on the function to send some amount of tokens to the correct function execution and `atBlock` to query program state at a specific block. @@ -81,6 +90,7 @@ console.log(result); ``` ### Message methods + Message methods are used to send messages to the program. These methods accept the arguments needed to send the message and return [transaction builder](../README.md#transaction-builder) that has a few methods to build and send the transaction. @@ -93,7 +103,7 @@ const transaction = program.serviceName.functionName(arg1, arg2); import { Keyring } from '@polkadot/api'; const keyring = new Keyring({ type: 'sr25519' }); const pair = keyring.addFromUri('//Alice'); -transaction.withAccount(pair) +transaction.withAccount(pair); // Or the address and signerOptions // This case is mostly used on the frontend with connected wallet. @@ -122,10 +132,11 @@ const { msgId, blockHash, response } = await transaction.signAndSend(); const result = await response(); -console.log(result) +console.log(result); ``` ### Constructor methods + Constructor methods are postfixed with `CtorFromCode` and `CtorFromCodeId` in the `Program` class and are used to deploy the program on the chain. These methods accept either bytes of the wasm or the id of the uploaded code. They returns the same [transaction builder](../README.md#transaction-builder) as the message methods. @@ -139,6 +150,7 @@ const transaction = program.newCtorFromCode(code); ``` ### Event subscription methods + Event subscription methods are used to subscribe to the specific events emitted by the program. ```javascript @@ -146,3 +158,63 @@ program.subscribeToSomeEvent((data) => { console.log(data); }); ``` + +## React Hooks + +Library generation with the `--with-hooks` flag creates custom React hooks that facilitate interaction with a `sails-js` program. These hooks are essentially wrappers around the generic hooks provided by the `@gear-js/react-hooks` library. The custom hooks are generated based on the `Program` class defined in the `lib.ts` file, and they are based on the specific types and names derived from it. + +Feel free to refer to the `@gear-js/react-hooks` [README](https://github.com/gear-tech/gear-js/tree/main/utils/gear-hooks#sails) for a summary of the hooks' specifics. + +### useProgram + +Initializes the program with the provided parameters. + +```jsx +import { useProgram } from './hooks'; + +const { data: program } = useProgram({ id: '0x...' }); +``` + +### useSend `serviceName` `functionName` Transaction + +Sends a transaction to a specified service and function. + +```jsx +import { useProgram, useSendAdminMintTransaction } from './hooks'; + +const { data: program } = useProgram({ id: '0x...' }); +const { sendTransaction } = useSendAdminMintTransaction({ program }); +``` + +### usePrepare `serviceName` `functionName` Transaction + +Prepares a transaction for a specified service and function. + +```jsx +import { useProgram, usePrepareAdminMintTransaction } from './hooks'; + +const { data: program } = useProgram({ id: '0x...' }); +const { prepareTransaction } = usePrepareAdminMintTransaction({ program }); +``` + +### use `serviceName` `functionName` Query + +Queries a specified service and function. + +```jsx +import { useProgram, useErc20BalanceOfQuery } from './hooks'; + +const { data: program } = useProgram({ id: '0x...' }); +const { data } = useErc20BalanceOfQuery({ program, args: ['0x...'] }); +``` + +### use `serviceName` `functionName` Event + +Subscribes to events from a specified service and event name. + +```jsx +import { useProgram, useAdminMintedEvent } from './hooks'; + +const { data: program } = useProgram({ id: '0x...' }); +const { data } = useAdminMintedEvent({ program, onData: (value) => console.log(value) }); +``` diff --git a/js/cli/src/app.ts b/js/cli/src/app.ts index 0d67e742..87b8d8b2 100644 --- a/js/cli/src/app.ts +++ b/js/cli/src/app.ts @@ -25,7 +25,7 @@ const handler = async (path: string, out: string, name: string, project: boolean let hooksFile = ''; if (withHooks) { - hooksFile = project ? _path.join(dir, 'src', 'hooks.tsx') : _path.join(dir, 'hooks.tsx'); + hooksFile = project ? _path.join(dir, 'src', 'hooks.ts') : _path.join(dir, 'hooks.ts'); } if (!existsSync(dir)) { diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 7460714f..62434823 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -44,7 +44,7 @@ export class HooksGenerator extends BaseGenerator { .line("type UseProgramParameters = Omit, 'library'>") .line('type ProgramType = InstanceType') .line('type ServiceName = SailsServiceName') - .line('type ProgramParameter = { program: ProgramType }') + .line('type ProgramParameter = { program: ProgramType | undefined }') .line() .line('type UseQueryParameters<', false) .increaseIndent() From 419631526a2f385456cbb398f6025bfc3b2cde93 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 18 Sep 2024 01:58:42 +0300 Subject: [PATCH 17/23] Drop redudant jest config props --- js/jest.config.ts | 8 ++------ js/test/setup.js | 4 +++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/js/jest.config.ts b/js/jest.config.ts index 6caf2131..f3f1fa8c 100644 --- a/js/jest.config.ts +++ b/js/jest.config.ts @@ -1,20 +1,16 @@ import type { Config } from '@jest/types'; +import { createDefaultEsmPreset } from 'ts-jest'; const config: Config.InitialOptions = { + ...createDefaultEsmPreset(), globalSetup: './test/setup.js', clearMocks: true, coverageProvider: 'v8', testEnvironment: 'node', verbose: true, - preset: 'ts-jest/presets/js-with-babel', - transformIgnorePatterns: ['node_modules/(?!@polkadot)/'], - extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', }, - transform: { - '^.+\\.tsx?$': ['ts-jest', { useESM: true }], - }, testTimeout: 15_000, }; diff --git a/js/test/setup.js b/js/test/setup.js index e7b4e2f9..70cd1464 100644 --- a/js/test/setup.js +++ b/js/test/setup.js @@ -2,11 +2,13 @@ import * as fs from 'fs'; import { execSync } from 'child_process'; export default () => { + execSync('rm -rf test/demo'); + // Build demo app execSync('cargo build -p demo --release'); // Generate demo ts client - execSync('node cli/build/app.js generate ../examples/demo/client/demo.idl -o ./test/demo --no-project'); + execSync('node cli/build/app.js generate ../examples/demo/client/demo.idl -o ./test/demo --no-project --with-hooks'); // Modify client imports From e318e850bd67df83217401432bdd673d199a403e Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 18 Sep 2024 02:09:31 +0300 Subject: [PATCH 18/23] Init hooks test --- js/jest.config.ts | 14 ++++++++++++++ js/test/demo-hooks.test.tsx | 34 ++++++++++++++++++++++++++++++++++ js/tsconfig.json | 3 ++- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 js/test/demo-hooks.test.tsx diff --git a/js/jest.config.ts b/js/jest.config.ts index f3f1fa8c..8218c423 100644 --- a/js/jest.config.ts +++ b/js/jest.config.ts @@ -8,10 +8,24 @@ const config: Config.InitialOptions = { coverageProvider: 'v8', testEnvironment: 'node', verbose: true, + moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', + + // manually resolving hooks to esm, cuz somehow jest resolves it to cjs? + // if main property in a package.json is pointing to esm, there's no problem whatsoever. + // maybe it has something to do with the package folder structure + '^@gear-js/react-hooks$': '/../node_modules/@gear-js/react-hooks/dist/esm/index.mjs', }, + testTimeout: 15_000, + + // cuz hooks testEnvironment is jsdom. there was a problem with rxjs for example + // https://github.com/microsoft/accessibility-insights-web/pull/5421#issuecomment-1109168149 + // https://jest-archive-august-2023.netlify.app/docs/28.x/upgrading-to-jest28/#packagejson-exports + testEnvironmentOptions: { + customExportConditions: ['node'], + }, }; export default config; diff --git a/js/test/demo-hooks.test.tsx b/js/test/demo-hooks.test.tsx new file mode 100644 index 00000000..da225ad1 --- /dev/null +++ b/js/test/demo-hooks.test.tsx @@ -0,0 +1,34 @@ +/** + * @jest-environment jsdom + */ + +import { ApiProvider } from '@gear-js/react-hooks'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { renderHook as renderReactHook, waitFor } from '@testing-library/react'; +import { ReactNode } from 'react'; + +import { Program } from './demo/lib'; +import { useProgram } from './demo/hooks'; + +const API_ARGS = { endpoint: 'ws://127.0.0.1:9944' }; +const QUERY_CLIENT = new QueryClient(); + +const Providers = ({ children }: { children: ReactNode }) => ( + + {children} + +); + +const renderHook = (hook: (initialProps: TProps) => TReturn) => + renderReactHook(hook, { wrapper: Providers }); + +describe('program hook', () => { + test('useProgram hook', async () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + + await waitFor(() => { + expect(result.current.data).toBeInstanceOf(Program); + expect(result.current.data.programId).toBe('0x01'); + }); + }); +}); diff --git a/js/tsconfig.json b/js/tsconfig.json index 4969e1ec..14075e90 100644 --- a/js/tsconfig.json +++ b/js/tsconfig.json @@ -7,6 +7,7 @@ "forceConsistentCasingInFileNames": true, "strict": false, "noImplicitAny": false, - "skipLibCheck": true + "skipLibCheck": true, + "jsx": "react-jsx" } } From fe136d0325fff42e9fb133a87382a03071eeca52 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 18 Sep 2024 17:27:28 +0300 Subject: [PATCH 19/23] Add hooks parameters tests --- js/test/demo-hooks.test.tsx | 113 ++++++++++++++++++++++++++++++------ js/vitest.config.ts | 17 ++++++ 2 files changed, 111 insertions(+), 19 deletions(-) create mode 100644 js/vitest.config.ts diff --git a/js/test/demo-hooks.test.tsx b/js/test/demo-hooks.test.tsx index da225ad1..ca7282f4 100644 --- a/js/test/demo-hooks.test.tsx +++ b/js/test/demo-hooks.test.tsx @@ -1,34 +1,109 @@ -/** - * @jest-environment jsdom - */ - -import { ApiProvider } from '@gear-js/react-hooks'; +import { HexString } from '@gear-js/api'; +import * as GearHooks from '@gear-js/react-hooks'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { renderHook as renderReactHook, waitFor } from '@testing-library/react'; +import { renderHook as renderReactHook } from '@testing-library/react'; import { ReactNode } from 'react'; +import { test, expect, vi } from 'vitest'; import { Program } from './demo/lib'; -import { useProgram } from './demo/hooks'; +import { + useCounterAddedEvent, + useCounterValueQuery, + useDogAvgWeightQuery, + useDogBarkedEvent, + usePrepareCounterAddTransaction, + usePrepareDogMakeSoundTransaction, + usePreparePingPongPingTransaction, + usePrepareReferencesSetNumTransaction, + usePrepareThisThatNoopTransaction, + useProgram, + useReferencesLastByteQuery, + useSendCounterAddTransaction, + useSendDogMakeSoundTransaction, + useSendPingPongPingTransaction, + useSendReferencesSetNumTransaction, + useSendThisThatNoopTransaction, + useThisThatThatQuery, +} from './demo/hooks'; -const API_ARGS = { endpoint: 'ws://127.0.0.1:9944' }; const QUERY_CLIENT = new QueryClient(); +const useProgramSpy = vi.spyOn(GearHooks, 'useProgram'); +const useSendTransactionSpy = vi.spyOn(GearHooks, 'useSendProgramTransaction'); +const usePrepareTransactionSpy = vi.spyOn(GearHooks, 'usePrepareProgramTransaction'); +const useQuerySpy = vi.spyOn(GearHooks, 'useProgramQuery'); +const useEventSpy = vi.spyOn(GearHooks, 'useProgramEvent'); + const Providers = ({ children }: { children: ReactNode }) => ( - - {children} - + {children} ); const renderHook = (hook: (initialProps: TProps) => TReturn) => renderReactHook(hook, { wrapper: Providers }); -describe('program hook', () => { - test('useProgram hook', async () => { - const { result } = renderHook(() => useProgram({ id: '0x01' })); +test('useProgram', () => { + const ARGS = { id: '0x01' as HexString, query: { enabled: true } }; + renderHook(() => useProgram(ARGS)); + + expect(useProgramSpy).toHaveBeenCalledWith({ library: Program, ...ARGS }); +}); + +test('useSendTransaction', () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + const program = result.current.data; + + renderHook(() => useSendCounterAddTransaction({ program })); + renderHook(() => useSendDogMakeSoundTransaction({ program })); + renderHook(() => useSendPingPongPingTransaction({ program })); + renderHook(() => useSendReferencesSetNumTransaction({ program })); + renderHook(() => useSendThisThatNoopTransaction({ program })); + + expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'counter', functionName: 'add' }); + expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'dog', functionName: 'makeSound' }); + expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'pingPong', functionName: 'ping' }); + expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'references', functionName: 'setNum' }); + expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'thisThat', functionName: 'noop' }); +}); + +test('usePrepareTransaction', () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + const program = result.current.data; + + renderHook(() => usePrepareCounterAddTransaction({ program })); + renderHook(() => usePrepareDogMakeSoundTransaction({ program })); + renderHook(() => usePreparePingPongPingTransaction({ program })); + renderHook(() => usePrepareReferencesSetNumTransaction({ program })); + renderHook(() => usePrepareThisThatNoopTransaction({ program })); + + expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'counter', functionName: 'add' }); + expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'dog', functionName: 'makeSound' }); + expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'pingPong', functionName: 'ping' }); + expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'references', functionName: 'setNum' }); + expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'thisThat', functionName: 'noop' }); +}); + +test('useQuery', () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + const ARGS = { program: result.current.data, query: { enabled: true } }; + + renderHook(() => useCounterValueQuery({ ...ARGS, args: [] })); + renderHook(() => useDogAvgWeightQuery({ ...ARGS, args: [] })); + renderHook(() => useReferencesLastByteQuery({ ...ARGS, args: [] })); + renderHook(() => useThisThatThatQuery({ ...ARGS, args: [] })); + + expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'counter', functionName: 'value', args: [] }); + expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'dog', functionName: 'avgWeight', args: [] }); + expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'references', functionName: 'lastByte', args: [] }); + expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'thisThat', functionName: 'that', args: [] }); +}); + +test('useEvent', () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + const ARGS = { program: result.current.data, query: { enabled: true }, onData: () => {} }; + + renderHook(() => useCounterAddedEvent(ARGS)); + renderHook(() => useDogBarkedEvent(ARGS)); - await waitFor(() => { - expect(result.current.data).toBeInstanceOf(Program); - expect(result.current.data.programId).toBe('0x01'); - }); - }); + expect(useEventSpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'counter', functionName: 'subscribeToAddedEvent' }); + expect(useEventSpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'dog', functionName: 'subscribeToBarkedEvent' }); }); diff --git a/js/vitest.config.ts b/js/vitest.config.ts new file mode 100644 index 00000000..6bf6be09 --- /dev/null +++ b/js/vitest.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + // resolving manually cuz vitest is using nodejs resolution, remove after hooks update + // https://github.com/vitest-dev/vitest/discussions/4233 + resolve: { alias: { '@gear-js/react-hooks': '@gear-js/react-hooks/dist/esm/index.mjs' } }, + + test: { + // globalSetup: 'test/setup.js', + include: ['**/*-hooks.test.ts?(x)'], // targeting only hooks + environment: 'happy-dom', // faster than jsdom + watch: false, // fire one time + + // patching esm to allow spying + server: { deps: { inline: ['@gear-js/react-hooks'] } }, + }, +}); From ad49992f33e3837d2491de27eb19579bbdccd445 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Wed, 18 Sep 2024 19:51:23 +0300 Subject: [PATCH 20/23] Test parameters for each hook --- js/test/demo-hooks.test.tsx | 134 ++++++++++++++++-------------------- js/vitest.config.ts | 4 +- 2 files changed, 62 insertions(+), 76 deletions(-) diff --git a/js/test/demo-hooks.test.tsx b/js/test/demo-hooks.test.tsx index ca7282f4..fc1d8e1c 100644 --- a/js/test/demo-hooks.test.tsx +++ b/js/test/demo-hooks.test.tsx @@ -2,30 +2,27 @@ import { HexString } from '@gear-js/api'; import * as GearHooks from '@gear-js/react-hooks'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook as renderReactHook } from '@testing-library/react'; +import * as fs from 'fs'; +import path from 'path'; import { ReactNode } from 'react'; -import { test, expect, vi } from 'vitest'; +import { test, expect, vi, MockInstance } from 'vitest'; +import { SailsIdlParser } from 'sails-js-parser'; +import { toLowerCaseFirst } from 'sails-js-util'; +import { Sails } from '..'; import { Program } from './demo/lib'; -import { - useCounterAddedEvent, - useCounterValueQuery, - useDogAvgWeightQuery, - useDogBarkedEvent, - usePrepareCounterAddTransaction, - usePrepareDogMakeSoundTransaction, - usePreparePingPongPingTransaction, - usePrepareReferencesSetNumTransaction, - usePrepareThisThatNoopTransaction, - useProgram, - useReferencesLastByteQuery, - useSendCounterAddTransaction, - useSendDogMakeSoundTransaction, - useSendPingPongPingTransaction, - useSendReferencesSetNumTransaction, - useSendThisThatNoopTransaction, - useThisThatThatQuery, -} from './demo/hooks'; +const { useProgram, ...demoHooks } = await import('./demo/hooks'); + +const getSails = async () => { + const idlPath = path.resolve(__dirname, '../../examples/demo/client/demo.idl'); + const idl = fs.readFileSync(idlPath, 'utf8'); + const parser = await SailsIdlParser.new(); + + return new Sails(parser).parseIdl(idl); +}; + +const SAILS = await getSails(); const QUERY_CLIENT = new QueryClient(); const useProgramSpy = vi.spyOn(GearHooks, 'useProgram'); @@ -41,69 +38,60 @@ const Providers = ({ children }: { children: ReactNode }) => ( const renderHook = (hook: (initialProps: TProps) => TReturn) => renderReactHook(hook, { wrapper: Providers }); -test('useProgram', () => { - const ARGS = { id: '0x01' as HexString, query: { enabled: true } }; - renderHook(() => useProgram(ARGS)); - - expect(useProgramSpy).toHaveBeenCalledWith({ library: Program, ...ARGS }); -}); - -test('useSendTransaction', () => { +const testHookParameters = ( + type: 'functions' | 'queries' | 'events', + getName: (value: string) => string, + spy: MockInstance, + extraArgs = {}, + getFunctionName?: (value: string) => string, +) => { const { result } = renderHook(() => useProgram({ id: '0x01' })); const program = result.current.data; - renderHook(() => useSendCounterAddTransaction({ program })); - renderHook(() => useSendDogMakeSoundTransaction({ program })); - renderHook(() => useSendPingPongPingTransaction({ program })); - renderHook(() => useSendReferencesSetNumTransaction({ program })); - renderHook(() => useSendThisThatNoopTransaction({ program })); - - expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'counter', functionName: 'add' }); - expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'dog', functionName: 'makeSound' }); - expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'pingPong', functionName: 'ping' }); - expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'references', functionName: 'setNum' }); - expect(useSendTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'thisThat', functionName: 'noop' }); -}); + Object.entries(SAILS.services).forEach(([serviceName, { [type]: functions }]) => { + Object.keys(functions).forEach((functionName) => { + const hookName = getName(`${serviceName}${functionName}`); + const useHook: unknown = demoHooks[hookName]; -test('usePrepareTransaction', () => { - const { result } = renderHook(() => useProgram({ id: '0x01' })); - const program = result.current.data; + if (typeof useHook !== 'function') throw new Error(`Hook ${hookName} not found`); - renderHook(() => usePrepareCounterAddTransaction({ program })); - renderHook(() => usePrepareDogMakeSoundTransaction({ program })); - renderHook(() => usePreparePingPongPingTransaction({ program })); - renderHook(() => usePrepareReferencesSetNumTransaction({ program })); - renderHook(() => usePrepareThisThatNoopTransaction({ program })); - - expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'counter', functionName: 'add' }); - expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'dog', functionName: 'makeSound' }); - expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'pingPong', functionName: 'ping' }); - expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'references', functionName: 'setNum' }); - expect(usePrepareTransactionSpy).toHaveBeenCalledWith({ program, serviceName: 'thisThat', functionName: 'noop' }); -}); + renderHook(() => useHook({ program, ...extraArgs })); -test('useQuery', () => { - const { result } = renderHook(() => useProgram({ id: '0x01' })); - const ARGS = { program: result.current.data, query: { enabled: true } }; + expect(spy).toHaveBeenCalledWith({ + program, + serviceName: toLowerCaseFirst(serviceName), + functionName: toLowerCaseFirst(getFunctionName ? getFunctionName(functionName) : functionName), + ...extraArgs, + }); + }); + }); +}; - renderHook(() => useCounterValueQuery({ ...ARGS, args: [] })); - renderHook(() => useDogAvgWeightQuery({ ...ARGS, args: [] })); - renderHook(() => useReferencesLastByteQuery({ ...ARGS, args: [] })); - renderHook(() => useThisThatThatQuery({ ...ARGS, args: [] })); +test('useProgram parameters forwarding', () => { + const ARGS = { id: '0x01' as HexString, query: { enabled: true } }; + renderHook(() => useProgram(ARGS)); - expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'counter', functionName: 'value', args: [] }); - expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'dog', functionName: 'avgWeight', args: [] }); - expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'references', functionName: 'lastByte', args: [] }); - expect(useQuerySpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'thisThat', functionName: 'that', args: [] }); + expect(useProgramSpy).toHaveBeenCalledWith({ library: Program, ...ARGS }); }); -test('useEvent', () => { - const { result } = renderHook(() => useProgram({ id: '0x01' })); - const ARGS = { program: result.current.data, query: { enabled: true }, onData: () => {} }; +test('useSendTransaction parameters forwarding', () => { + testHookParameters('functions', (name) => `useSend${name}Transaction`, useSendTransactionSpy); +}); - renderHook(() => useCounterAddedEvent(ARGS)); - renderHook(() => useDogBarkedEvent(ARGS)); +test('usePrepareTransaction parameters forwarding', () => { + testHookParameters('functions', (name) => `usePrepare${name}Transaction`, usePrepareTransactionSpy); +}); + +test('useQuery parameters forwarding', () => { + testHookParameters('queries', (name) => `use${name}Query`, useQuerySpy, { query: { enabled: true } }); +}); - expect(useEventSpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'counter', functionName: 'subscribeToAddedEvent' }); - expect(useEventSpy).toHaveBeenCalledWith({ ...ARGS, serviceName: 'dog', functionName: 'subscribeToBarkedEvent' }); +test('useEvent parameters forwarding', () => { + testHookParameters( + 'events', + (name) => `use${name}Event`, + useEventSpy, + { query: { enabled: true }, onData: () => {} }, + (name) => `subscribeTo${name}Event`, + ); }); diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 6bf6be09..84953f06 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -10,8 +10,6 @@ export default defineConfig({ include: ['**/*-hooks.test.ts?(x)'], // targeting only hooks environment: 'happy-dom', // faster than jsdom watch: false, // fire one time - - // patching esm to allow spying - server: { deps: { inline: ['@gear-js/react-hooks'] } }, + server: { deps: { inline: ['@gear-js/react-hooks'] } }, // patching esm to allow spying }, }); From 852e766c6f9dfcc4be9d1a7f9b23d1c99f7a3f1c Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 19 Sep 2024 18:40:03 +0300 Subject: [PATCH 21/23] Fix root package json deps --- js/package.json | 15 +- yarn.lock | 1787 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1786 insertions(+), 16 deletions(-) diff --git a/js/package.json b/js/package.json index 1322d646..899ae2bf 100644 --- a/js/package.json +++ b/js/package.json @@ -32,7 +32,8 @@ "scripts": { "prebuild": "rm -rf lib", "build": "npx rollup --config rollup.config.js", - "test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles" + "test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles", + "test-hooks": "vitest" }, "peerDependencies": { "@gear-js/api": "0.38.2", @@ -44,9 +45,19 @@ }, "devDependencies": { "@gear-js/api": "0.38.2", + "@gear-js/react-hooks": "0.13.0", "@polkadot/api": "12.0.1", "@polkadot/types": "12.0.1", - "jest": "^29.7.0" + "@tanstack/react-query": "^5.56.2", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.0.1", + "@types/react": "^18", + "@types/react-dom": "^18", + "happy-dom": "^15.7.4", + "jest": "^29.7.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "vitest": "^2.1.1" }, "files": [ "lib" diff --git a/yarn.lock b/yarn.lock index 6f5379d1..e0d98115 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,7 +15,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.2, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" dependencies: @@ -362,6 +362,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" + dependencies: + regenerator-runtime: "npm:^0.14.0" + checksum: 10c0/d6143adf5aa1ce79ed374e33fdfd74fa975055a80bc6e479672ab1eadc4e4bfd7484444e17dd063a1d180e051f3ec62b357c7a2b817e7657687b47313158c3d2 + languageName: node + linkType: hard + "@babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": version: 7.25.0 resolution: "@babel/template@npm:7.25.0" @@ -443,6 +452,167 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -523,6 +693,28 @@ __metadata: languageName: node linkType: hard +"@gear-js/react-hooks@npm:0.13.0": + version: 0.13.0 + resolution: "@gear-js/react-hooks@npm:0.13.0" + dependencies: + "@polkadot/api-derive": "npm:11.0.2" + "@polkadot/extension-inject": "npm:0.51.1" + "@polkadot/util": "npm:12.6.2" + "@substrate/connect": "npm:0.8.10" + bignumber.js: "npm:9.1.2" + nanoid: "npm:5.0.1" + react-transition-group: "npm:4.4.5" + peerDependencies: + "@gear-js/api": 0.38.1 + "@polkadot/api": 11.0.2 + "@tanstack/react-query": ^5.29.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sails-js: 0.1.8 + checksum: 10c0/a576a0e3a10fa11426d20a09eb54b2331e3bd978ca6f37c2f5433f8dd4284a6c2070a7fc28d226ad0ab80f9030e49bb709710bd009ab4bd197f47f3975586fca + languageName: node + linkType: hard + "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" @@ -1632,7 +1824,14 @@ __metadata: languageName: node linkType: hard -"@polkadot-api/json-rpc-provider@npm:0.0.1": +"@polkadot-api/json-rpc-provider-proxy@npm:^0.1.0": + version: 0.1.0 + resolution: "@polkadot-api/json-rpc-provider-proxy@npm:0.1.0" + checksum: 10c0/e4b621fbbba5ae035f36932ce2ef6024d157a1612e26d8838ba6b92a78cd4718f4f12baa55ec7c700d213f8ecbe6e14569152ba3254b341b677b9e616c749f59 + languageName: node + linkType: hard + +"@polkadot-api/json-rpc-provider@npm:0.0.1, @polkadot-api/json-rpc-provider@npm:^0.0.1": version: 0.0.1 resolution: "@polkadot-api/json-rpc-provider@npm:0.0.1" checksum: 10c0/90dc86693e7ef742c50484f4374d4b4f0eb7b5f7f618cf96a3dfed866fd18edf19132fc750b2944e8300d83c5601343f3876cbe60cd6bb1086301361d682ebd8 @@ -1649,6 +1848,16 @@ __metadata: languageName: node linkType: hard +"@polkadot-api/metadata-builders@npm:0.3.2": + version: 0.3.2 + resolution: "@polkadot-api/metadata-builders@npm:0.3.2" + dependencies: + "@polkadot-api/substrate-bindings": "npm:0.6.0" + "@polkadot-api/utils": "npm:0.1.0" + checksum: 10c0/ac536e8d5dea4c4e241839750a46d003a86e6149428dbf9bdb794907547fdab219d38c805ba5fa0ea7150a0083c214866e28d7c2ec10621be97d2f8f8b013edf + languageName: node + linkType: hard + "@polkadot-api/observable-client@npm:0.1.0": version: 0.1.0 resolution: "@polkadot-api/observable-client@npm:0.1.0" @@ -1663,6 +1872,20 @@ __metadata: languageName: node linkType: hard +"@polkadot-api/observable-client@npm:^0.3.0": + version: 0.3.2 + resolution: "@polkadot-api/observable-client@npm:0.3.2" + dependencies: + "@polkadot-api/metadata-builders": "npm:0.3.2" + "@polkadot-api/substrate-bindings": "npm:0.6.0" + "@polkadot-api/utils": "npm:0.1.0" + peerDependencies: + "@polkadot-api/substrate-client": 0.1.4 + rxjs: ">=7.8.0" + checksum: 10c0/9f93fab03c37af0483f5c8487ec5250d366eb401a2c9744c014dfb4c7aa524645ae71f6b0e60761e2bca89bdcd862c119e4ac0e798123d8ee9f037eb2f4aaef3 + languageName: node + linkType: hard + "@polkadot-api/substrate-bindings@npm:0.0.1": version: 0.0.1 resolution: "@polkadot-api/substrate-bindings@npm:0.0.1" @@ -1675,6 +1898,18 @@ __metadata: languageName: node linkType: hard +"@polkadot-api/substrate-bindings@npm:0.6.0": + version: 0.6.0 + resolution: "@polkadot-api/substrate-bindings@npm:0.6.0" + dependencies: + "@noble/hashes": "npm:^1.3.1" + "@polkadot-api/utils": "npm:0.1.0" + "@scure/base": "npm:^1.1.1" + scale-ts: "npm:^1.6.0" + checksum: 10c0/6c5d2d4f1120e95b3fb0207ea186e74302b9075671132d62d94d6abcb8b38fe081b8514384c744c3630615caa474764ebdd18968bef73d0c29203946941f1d99 + languageName: node + linkType: hard + "@polkadot-api/substrate-client@npm:0.0.1": version: 0.0.1 resolution: "@polkadot-api/substrate-client@npm:0.0.1" @@ -1682,6 +1917,16 @@ __metadata: languageName: node linkType: hard +"@polkadot-api/substrate-client@npm:^0.1.2": + version: 0.1.4 + resolution: "@polkadot-api/substrate-client@npm:0.1.4" + dependencies: + "@polkadot-api/json-rpc-provider": "npm:0.0.1" + "@polkadot-api/utils": "npm:0.1.0" + checksum: 10c0/7c9138ce52745f7e5f365f35d8caf3c192aee405ee576492eab8c47f5e9d09547a6141cc455ba21e69cf9f0f813fe6f5bcb0763342c33435a7678432961713db + languageName: node + linkType: hard + "@polkadot-api/utils@npm:0.0.1": version: 0.0.1 resolution: "@polkadot-api/utils@npm:0.0.1" @@ -1689,6 +1934,28 @@ __metadata: languageName: node linkType: hard +"@polkadot-api/utils@npm:0.1.0": + version: 0.1.0 + resolution: "@polkadot-api/utils@npm:0.1.0" + checksum: 10c0/9b24522a30d0519df2d2bbfc65f7dbc94233950f829c4a6b042e02cc43b70c0ec43a7d06056cd7084d09e32d7c42caa2695732d25f673a31430391bed116fcae + languageName: node + linkType: hard + +"@polkadot/api-augment@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/api-augment@npm:11.0.2" + dependencies: + "@polkadot/api-base": "npm:11.0.2" + "@polkadot/rpc-augment": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-augment": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/23428c9db868be38fa8229760178805090dd6fb99b5cc58f89c9710a93508beb3517e5068ef76418ccb5977be2efb1046318f668aebbcf6514fbf3a16680b5be + languageName: node + linkType: hard + "@polkadot/api-augment@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/api-augment@npm:12.0.1" @@ -1704,6 +1971,34 @@ __metadata: languageName: node linkType: hard +"@polkadot/api-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-augment@npm:12.4.2" + dependencies: + "@polkadot/api-base": "npm:12.4.2" + "@polkadot/rpc-augment": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-augment": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/4cab0d50cde43eb25d830fca93cdfe10198302d44a271aacfa274d171671ce4fa4b07bafd0886f8cf78ce10478762e337e9fe27a652080a1dc6f5823be05bcb3 + languageName: node + linkType: hard + +"@polkadot/api-base@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/api-base@npm:11.0.2" + dependencies: + "@polkadot/rpc-core": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.2" + checksum: 10c0/4e816a99abfa64984f82b4daef117c5e708f2b3abb5d6c02ce7a83fce4452edee27501554665f0156188a60deffd64f0958f00bae74e49ba60e9db5aeb71e007 + languageName: node + linkType: hard + "@polkadot/api-base@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/api-base@npm:12.0.1" @@ -1717,6 +2012,37 @@ __metadata: languageName: node linkType: hard +"@polkadot/api-base@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-base@npm:12.4.2" + dependencies: + "@polkadot/rpc-core": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.3" + checksum: 10c0/b2e7b7a3f93070b09f5992f8128a378f47a8c808a08a2890c50abcaded040ab30e8b1b5c2b693c375f2187032dc8d010d407ac14e1e39fcb984a2e0f9f05e23d + languageName: node + linkType: hard + +"@polkadot/api-derive@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/api-derive@npm:11.0.2" + dependencies: + "@polkadot/api": "npm:11.0.2" + "@polkadot/api-augment": "npm:11.0.2" + "@polkadot/api-base": "npm:11.0.2" + "@polkadot/rpc-core": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + "@polkadot/util-crypto": "npm:^12.6.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.2" + checksum: 10c0/7730eabbbc897d488cd24806b21431b297409edb0b88cc28882e51e89153d0bb16b708ff5d56c196faa6a5f14e26cbaafaa7d918e7214787a65fed5d8e4565c4 + languageName: node + linkType: hard + "@polkadot/api-derive@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/api-derive@npm:12.0.1" @@ -1735,6 +2061,49 @@ __metadata: languageName: node linkType: hard +"@polkadot/api-derive@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-derive@npm:12.4.2" + dependencies: + "@polkadot/api": "npm:12.4.2" + "@polkadot/api-augment": "npm:12.4.2" + "@polkadot/api-base": "npm:12.4.2" + "@polkadot/rpc-core": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + "@polkadot/util-crypto": "npm:^13.0.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.3" + checksum: 10c0/47f0698fa2b3f1adc03af93fbf7c533d8801bad52c7d8989ab019ce215bbd1c1e8d7a0c18d89839e86619ae9e93385cb7963feecc323dad79751de1496d0c23c + languageName: node + linkType: hard + +"@polkadot/api@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/api@npm:11.0.2" + dependencies: + "@polkadot/api-augment": "npm:11.0.2" + "@polkadot/api-base": "npm:11.0.2" + "@polkadot/api-derive": "npm:11.0.2" + "@polkadot/keyring": "npm:^12.6.2" + "@polkadot/rpc-augment": "npm:11.0.2" + "@polkadot/rpc-core": "npm:11.0.2" + "@polkadot/rpc-provider": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-augment": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/types-create": "npm:11.0.2" + "@polkadot/types-known": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + "@polkadot/util-crypto": "npm:^12.6.2" + eventemitter3: "npm:^5.0.1" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.2" + checksum: 10c0/6046e9ed90caddf034b45d7f99c082cd788928541c9e180a843ca572d4dbf82b53ea9b30e47f35173159c2cec3e016aedeedb6eb9dacbc61904760b7a1d21cdd + languageName: node + linkType: hard + "@polkadot/api@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/api@npm:12.0.1" @@ -1760,6 +2129,49 @@ __metadata: languageName: node linkType: hard +"@polkadot/api@npm:12.4.2, @polkadot/api@npm:^12.3.1": + version: 12.4.2 + resolution: "@polkadot/api@npm:12.4.2" + dependencies: + "@polkadot/api-augment": "npm:12.4.2" + "@polkadot/api-base": "npm:12.4.2" + "@polkadot/api-derive": "npm:12.4.2" + "@polkadot/keyring": "npm:^13.0.2" + "@polkadot/rpc-augment": "npm:12.4.2" + "@polkadot/rpc-core": "npm:12.4.2" + "@polkadot/rpc-provider": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-augment": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/types-create": "npm:12.4.2" + "@polkadot/types-known": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + "@polkadot/util-crypto": "npm:^13.0.2" + eventemitter3: "npm:^5.0.1" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.3" + checksum: 10c0/64e9713508193a971e7fe830d39c625101b9dc9ce987ee38118d9a2e7e913eaeb9231cd7776b4d00ac293b23052c12ca6e7867fddacb8f7ec283017ee68ad1aa + languageName: node + linkType: hard + +"@polkadot/extension-inject@npm:0.51.1": + version: 0.51.1 + resolution: "@polkadot/extension-inject@npm:0.51.1" + dependencies: + "@polkadot/api": "npm:^12.3.1" + "@polkadot/rpc-provider": "npm:^12.3.1" + "@polkadot/types": "npm:^12.3.1" + "@polkadot/util": "npm:^13.0.2" + "@polkadot/util-crypto": "npm:^13.0.2" + "@polkadot/x-global": "npm:^13.0.2" + tslib: "npm:^2.6.2" + peerDependencies: + "@polkadot/api": "*" + "@polkadot/util": "*" + checksum: 10c0/55256d80be0d7cde17f1341004e30adf1a66381f4423d4266770e43cc140d3e1ba1599fab874b8c85eaf15ba3d5f71ef96f42a349aee9888fae1072f46aaf649 + languageName: node + linkType: hard + "@polkadot/keyring@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/keyring@npm:12.6.2" @@ -1774,6 +2186,20 @@ __metadata: languageName: node linkType: hard +"@polkadot/keyring@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/keyring@npm:13.1.1" + dependencies: + "@polkadot/util": "npm:13.1.1" + "@polkadot/util-crypto": "npm:13.1.1" + tslib: "npm:^2.7.0" + peerDependencies: + "@polkadot/util": 13.1.1 + "@polkadot/util-crypto": 13.1.1 + checksum: 10c0/f746ff4dcf5bc89efbd20b1ddaf01232a2b87b7d1b1d45d76371a3b14361e4aef2045668658df39a738e2b2b70944cd0e5a5210b654778b55ef965b69fc8b2ca + languageName: node + linkType: hard + "@polkadot/networks@npm:12.6.2, @polkadot/networks@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/networks@npm:12.6.2" @@ -1785,6 +2211,30 @@ __metadata: languageName: node linkType: hard +"@polkadot/networks@npm:13.1.1, @polkadot/networks@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/networks@npm:13.1.1" + dependencies: + "@polkadot/util": "npm:13.1.1" + "@substrate/ss58-registry": "npm:^1.50.0" + tslib: "npm:^2.7.0" + checksum: 10c0/30ea310ecfbe1ab7a050b3809a86f6b4564b75d0d35e467ff16428fd4d75e3d685e2964366d9a9130ade71ea7615ac064c8d5704457c72810333d5f9d257b32b + languageName: node + linkType: hard + +"@polkadot/rpc-augment@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/rpc-augment@npm:11.0.2" + dependencies: + "@polkadot/rpc-core": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/b561f7fa13e6d5a20fd698cc62ee84c9f6550f5951e3b42c92312beafcb030c573c3130a3fdc1ba844712c11eb0fe7f96bcbeca643fb2e29c65e520fa6a61b6c + languageName: node + linkType: hard + "@polkadot/rpc-augment@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/rpc-augment@npm:12.0.1" @@ -1798,6 +2248,33 @@ __metadata: languageName: node linkType: hard +"@polkadot/rpc-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/rpc-augment@npm:12.4.2" + dependencies: + "@polkadot/rpc-core": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/8e078db8496337c16bfb474cb557aaed5cccb2c1a3b8a56ad729fea308b23745c0cf5db10212f5653b60344add2084fc5ac7521a7b08c19fd309280e539336cf + languageName: node + linkType: hard + +"@polkadot/rpc-core@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/rpc-core@npm:11.0.2" + dependencies: + "@polkadot/rpc-augment": "npm:11.0.2" + "@polkadot/rpc-provider": "npm:11.0.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.2" + checksum: 10c0/306404b061c650d0f6b3a8fce7f1a886a52449bcec9cb0f360c3706f17b3c00178904fbea0177225c2f31b546340081b1664dcf8ee50de0afe16e43372f2f2d6 + languageName: node + linkType: hard + "@polkadot/rpc-core@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/rpc-core@npm:12.0.1" @@ -1812,6 +2289,44 @@ __metadata: languageName: node linkType: hard +"@polkadot/rpc-core@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/rpc-core@npm:12.4.2" + dependencies: + "@polkadot/rpc-augment": "npm:12.4.2" + "@polkadot/rpc-provider": "npm:12.4.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.3" + checksum: 10c0/4201b1d503801a672f2ceb0e6ab90226eb03c2d668879669656d73a952c556ba32e0a85c479d87ccd0aa80ce8fbc69ddde69abee462517dabc4736b3993deca6 + languageName: node + linkType: hard + +"@polkadot/rpc-provider@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/rpc-provider@npm:11.0.2" + dependencies: + "@polkadot/keyring": "npm:^12.6.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-support": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + "@polkadot/util-crypto": "npm:^12.6.2" + "@polkadot/x-fetch": "npm:^12.6.2" + "@polkadot/x-global": "npm:^12.6.2" + "@polkadot/x-ws": "npm:^12.6.2" + "@substrate/connect": "npm:0.8.10" + eventemitter3: "npm:^5.0.1" + mock-socket: "npm:^9.3.1" + nock: "npm:^13.5.0" + tslib: "npm:^2.6.2" + dependenciesMeta: + "@substrate/connect": + optional: true + checksum: 10c0/6c9c88b6002013b36bb3f7f050d1f154a8992d05b16714c1bc5114c8279b9722f93bf362855681bb2d670ddb51f7094a56f89410b3d6ae9b1656411e2af95c61 + languageName: node + linkType: hard + "@polkadot/rpc-provider@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/rpc-provider@npm:12.0.1" @@ -1836,6 +2351,42 @@ __metadata: languageName: node linkType: hard +"@polkadot/rpc-provider@npm:12.4.2, @polkadot/rpc-provider@npm:^12.3.1": + version: 12.4.2 + resolution: "@polkadot/rpc-provider@npm:12.4.2" + dependencies: + "@polkadot/keyring": "npm:^13.0.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-support": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + "@polkadot/util-crypto": "npm:^13.0.2" + "@polkadot/x-fetch": "npm:^13.0.2" + "@polkadot/x-global": "npm:^13.0.2" + "@polkadot/x-ws": "npm:^13.0.2" + "@substrate/connect": "npm:0.8.11" + eventemitter3: "npm:^5.0.1" + mock-socket: "npm:^9.3.1" + nock: "npm:^13.5.4" + tslib: "npm:^2.6.3" + dependenciesMeta: + "@substrate/connect": + optional: true + checksum: 10c0/59968dfae8ecaed840ec61c84d50953faf14d76dbcfcf61ef4acb88c9f4ef07c0c2b9c5227cb2b63801a0895d3f10edb686ae3126269eda5635f29796fa20fdf + languageName: node + linkType: hard + +"@polkadot/types-augment@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types-augment@npm:11.0.2" + dependencies: + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/6eebea226e72f7b00763c150684f550d65d90be9d21924d682b0dbf07d269c3df1017ef9bbd92c2beee92b093245c50b3728cfa2f8acd520c626bfc8103c8e4e + languageName: node + linkType: hard + "@polkadot/types-augment@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/types-augment@npm:12.0.1" @@ -1848,6 +2399,29 @@ __metadata: languageName: node linkType: hard +"@polkadot/types-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-augment@npm:12.4.2" + dependencies: + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/9dcae5ec9fd7aaac9d3ffe2f5adb9b5c4704376018db4860215ca38805b189c5ef2f90360da0ff29d8b9a9715617bb5eabf6870bcfd8f9eeba974d6eb9b5bfab + languageName: node + linkType: hard + +"@polkadot/types-codec@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types-codec@npm:11.0.2" + dependencies: + "@polkadot/util": "npm:^12.6.2" + "@polkadot/x-bigint": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/3e841e8bd485ac2eeb2d4bdf32df1f2426d10164cf3ef8d02341fef4d7252b6465bccb06615daf2e4ed23997f220e5c0a3f8969402807d8d6e56348685a84c7e + languageName: node + linkType: hard + "@polkadot/types-codec@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/types-codec@npm:12.0.1" @@ -1859,6 +2433,28 @@ __metadata: languageName: node linkType: hard +"@polkadot/types-codec@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-codec@npm:12.4.2" + dependencies: + "@polkadot/util": "npm:^13.0.2" + "@polkadot/x-bigint": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/2a56694e6998fc2afbe4fe8a9f9805eb251e880f1343af380f70c42965d30bae2249e5a5f346e675d5f78173770ebd4fa0758ed8b9f1397db8183eb686d11842 + languageName: node + linkType: hard + +"@polkadot/types-create@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types-create@npm:11.0.2" + dependencies: + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/542416efd7836b06104a00172771bbfb54c8e953fa929eeb33df2b6200dbd8f9194eeafc91a67af614755d629a99e851742de24ea75b17d407d1ef2cb7504b21 + languageName: node + linkType: hard + "@polkadot/types-create@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/types-create@npm:12.0.1" @@ -1870,6 +2466,31 @@ __metadata: languageName: node linkType: hard +"@polkadot/types-create@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-create@npm:12.4.2" + dependencies: + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/c075d07c2d3212f0ab9772cd008bfadccde7a35f6366c6704a326f8e5199fce7e7eb7959a6bd229b69fcbc3900c522892f94b08b4cd991be6e42f2a786585d0f + languageName: node + linkType: hard + +"@polkadot/types-known@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types-known@npm:11.0.2" + dependencies: + "@polkadot/networks": "npm:^12.6.2" + "@polkadot/types": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/types-create": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/8c2d39583ff0e1fdaa37afcb1287f4d2817ebf477c4b033863dd87720c1242a37d4be9d9d7cfb736661311a3bcb09db62a6812311e8ba7b13fd995aaa0a9b646 + languageName: node + linkType: hard + "@polkadot/types-known@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/types-known@npm:12.0.1" @@ -1884,13 +2505,63 @@ __metadata: languageName: node linkType: hard +"@polkadot/types-known@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-known@npm:12.4.2" + dependencies: + "@polkadot/networks": "npm:^13.0.2" + "@polkadot/types": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/types-create": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/2e7fdd895c6478e102b91d7cb3428b75c34aa0b037ba9d2d2b97d350a19ed7bd6ea4f2c91c52eef4039ebec330fd1cd58a0f88fc30882c2a6623c0cae78b421a + languageName: node + linkType: hard + +"@polkadot/types-support@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types-support@npm:11.0.2" + dependencies: + "@polkadot/util": "npm:^12.6.2" + tslib: "npm:^2.6.2" + checksum: 10c0/ac8c799aaff015cd22351bc6ed2ea55fb86aba5944779d888a083ff75d7b56cef7d2deb606c768bcedb2478e11cb78e2b92cb6814441adc331c26e43210cbd11 + languageName: node + linkType: hard + "@polkadot/types-support@npm:12.0.1": version: 12.0.1 resolution: "@polkadot/types-support@npm:12.0.1" dependencies: "@polkadot/util": "npm:^12.6.2" tslib: "npm:^2.6.2" - checksum: 10c0/468803fadd77ac8461120898d79e6a627082ba2f03b0d2b4e2b4aec1f1d96f650b28ea42750f60bf09c2f2094a4d5f3e6b58e343b19d7cff0d04d4d217c07e9a + checksum: 10c0/468803fadd77ac8461120898d79e6a627082ba2f03b0d2b4e2b4aec1f1d96f650b28ea42750f60bf09c2f2094a4d5f3e6b58e343b19d7cff0d04d4d217c07e9a + languageName: node + linkType: hard + +"@polkadot/types-support@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-support@npm:12.4.2" + dependencies: + "@polkadot/util": "npm:^13.0.2" + tslib: "npm:^2.6.3" + checksum: 10c0/0277fe88cac0f2447b3655bb5ca32dfe7dc7e35a82d22873baf95a0272a207f73853e94b3340e7e9230945dfaa8f14f93f4ffb13c8b29d449f602e8c5fe3f3c2 + languageName: node + linkType: hard + +"@polkadot/types@npm:11.0.2": + version: 11.0.2 + resolution: "@polkadot/types@npm:11.0.2" + dependencies: + "@polkadot/keyring": "npm:^12.6.2" + "@polkadot/types-augment": "npm:11.0.2" + "@polkadot/types-codec": "npm:11.0.2" + "@polkadot/types-create": "npm:11.0.2" + "@polkadot/util": "npm:^12.6.2" + "@polkadot/util-crypto": "npm:^12.6.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.2" + checksum: 10c0/d6f9f458367f7bf84266abacbe72d9620aa02ad59ad30f213f39f12c2d0ee078160ee1e02fa6cc583f95988e32083afcea1f0000050e68bc3b0eb6f3c2bcbf0e languageName: node linkType: hard @@ -1910,6 +2581,22 @@ __metadata: languageName: node linkType: hard +"@polkadot/types@npm:12.4.2, @polkadot/types@npm:^12.3.1": + version: 12.4.2 + resolution: "@polkadot/types@npm:12.4.2" + dependencies: + "@polkadot/keyring": "npm:^13.0.2" + "@polkadot/types-augment": "npm:12.4.2" + "@polkadot/types-codec": "npm:12.4.2" + "@polkadot/types-create": "npm:12.4.2" + "@polkadot/util": "npm:^13.0.2" + "@polkadot/util-crypto": "npm:^13.0.2" + rxjs: "npm:^7.8.1" + tslib: "npm:^2.6.3" + checksum: 10c0/bdea1658a367678a158d5d6ba6224a081cfd5fb38b6d56c360321e40628a23261261c869e7ab1ac0c89c0140777f532963c46999e5fb0f13233599a32eabdf99 + languageName: node + linkType: hard + "@polkadot/util-crypto@npm:12.6.2, @polkadot/util-crypto@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/util-crypto@npm:12.6.2" @@ -1930,6 +2617,26 @@ __metadata: languageName: node linkType: hard +"@polkadot/util-crypto@npm:13.1.1, @polkadot/util-crypto@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/util-crypto@npm:13.1.1" + dependencies: + "@noble/curves": "npm:^1.3.0" + "@noble/hashes": "npm:^1.3.3" + "@polkadot/networks": "npm:13.1.1" + "@polkadot/util": "npm:13.1.1" + "@polkadot/wasm-crypto": "npm:^7.3.2" + "@polkadot/wasm-util": "npm:^7.3.2" + "@polkadot/x-bigint": "npm:13.1.1" + "@polkadot/x-randomvalues": "npm:13.1.1" + "@scure/base": "npm:^1.1.7" + tslib: "npm:^2.7.0" + peerDependencies: + "@polkadot/util": 13.1.1 + checksum: 10c0/6ce2f75fd55b9f41a99faf8c16e4a02f7d52ce4caec3d323f1cb08bd792798dd6e1b2d3b75cf4dcc2ff1ed81adcaa0d35499c48f1a653325dce01301f8ee2837 + languageName: node + linkType: hard + "@polkadot/util@npm:12.6.2, @polkadot/util@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/util@npm:12.6.2" @@ -1945,6 +2652,21 @@ __metadata: languageName: node linkType: hard +"@polkadot/util@npm:13.1.1, @polkadot/util@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/util@npm:13.1.1" + dependencies: + "@polkadot/x-bigint": "npm:13.1.1" + "@polkadot/x-global": "npm:13.1.1" + "@polkadot/x-textdecoder": "npm:13.1.1" + "@polkadot/x-textencoder": "npm:13.1.1" + "@types/bn.js": "npm:^5.1.5" + bn.js: "npm:^5.2.1" + tslib: "npm:^2.7.0" + checksum: 10c0/28a77a42bbc7a71fc8647d393ba1ca0e0e7e46968ac03c4f3d78ee7414f6af32c343c4522a588fc5b1e074f08d7b85b120247c43ff00bea971d201b52a6af0f5 + languageName: node + linkType: hard + "@polkadot/wasm-bridge@npm:7.3.2": version: 7.3.2 resolution: "@polkadot/wasm-bridge@npm:7.3.2" @@ -2035,6 +2757,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-bigint@npm:13.1.1, @polkadot/x-bigint@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/x-bigint@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + tslib: "npm:^2.7.0" + checksum: 10c0/8df11029c9956d38bd6005f1d85cf4c4d67058fdff14f534e487dc30c43003e35f4e89dc102501c216806446ec6f40615dba4bf957a484b8ede78c398bec7568 + languageName: node + linkType: hard + "@polkadot/x-fetch@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/x-fetch@npm:12.6.2" @@ -2046,6 +2778,17 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-fetch@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/x-fetch@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + node-fetch: "npm:^3.3.2" + tslib: "npm:^2.7.0" + checksum: 10c0/e6a5ad72f4f2ba9b204ba124ae2ec7b23b03ec0a857037fcd2221e465b3034b8ad48229cb78598ea955d6ea0be5126f0b1a63aad7b5fea2fb632aebcc7971ad2 + languageName: node + linkType: hard + "@polkadot/x-global@npm:12.6.2, @polkadot/x-global@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/x-global@npm:12.6.2" @@ -2055,6 +2798,15 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-global@npm:13.1.1, @polkadot/x-global@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/x-global@npm:13.1.1" + dependencies: + tslib: "npm:^2.7.0" + checksum: 10c0/07a69f24a94c6bd8934dc39f52dee620f9a0cbac368f0a8e6b5e4637f8e90ba48e110fa4cf8ac1d6b8e80f4acd41af8be5c493d89abe7fe29c0523d7aac3eefb + languageName: node + linkType: hard + "@polkadot/x-randomvalues@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-randomvalues@npm:12.6.2" @@ -2068,6 +2820,19 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-randomvalues@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-randomvalues@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + tslib: "npm:^2.7.0" + peerDependencies: + "@polkadot/util": 13.1.1 + "@polkadot/wasm-util": "*" + checksum: 10c0/425512c16d66fa9e8badcb14305b1547c11f38dbe3640c3e8fe6f5504baed80764398df783322c92d2a7e53b568414898f28917606f346a30b6ee4a9dcb97628 + languageName: node + linkType: hard + "@polkadot/x-textdecoder@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-textdecoder@npm:12.6.2" @@ -2078,6 +2843,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textdecoder@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-textdecoder@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + tslib: "npm:^2.7.0" + checksum: 10c0/bc9671db97ace14383b27de22f301d3b5621aedc74d7ebb4c723eed3b74b952850b697be50b09b8456eed6196edec71b324aa6d1dd3558515fe639a51bcc52d2 + languageName: node + linkType: hard + "@polkadot/x-textencoder@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-textencoder@npm:12.6.2" @@ -2088,6 +2863,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textencoder@npm:13.1.1": + version: 13.1.1 + resolution: "@polkadot/x-textencoder@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + tslib: "npm:^2.7.0" + checksum: 10c0/819d9dc729a8d635c0269f5a2b8dbec1350c766040946ea750f4df872e9d4be397be74e3ad5d425f3d6df51eff021a7a86966223f4c58694c0bdeadf741312a6 + languageName: node + linkType: hard + "@polkadot/x-ws@npm:^12.6.2": version: 12.6.2 resolution: "@polkadot/x-ws@npm:12.6.2" @@ -2099,6 +2884,17 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-ws@npm:^13.0.2": + version: 13.1.1 + resolution: "@polkadot/x-ws@npm:13.1.1" + dependencies: + "@polkadot/x-global": "npm:13.1.1" + tslib: "npm:^2.7.0" + ws: "npm:^8.16.0" + checksum: 10c0/6d485fb62218beee0ea38e3dc275385ad9fa64677f451833447a5e54bbf70c3827e5a4d4e7d9531988109e8f1760437f854c7cb19e2df488f35b4c20bf8a6b1e + languageName: node + linkType: hard + "@rollup/plugin-commonjs@npm:^26.0.1": version: 26.0.1 resolution: "@rollup/plugin-commonjs@npm:26.0.1" @@ -2203,6 +2999,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-android-arm64@npm:4.21.2" @@ -2210,6 +3013,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-android-arm64@npm:4.22.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-darwin-arm64@npm:4.21.2" @@ -2217,6 +3027,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.22.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-darwin-x64@npm:4.21.2" @@ -2224,6 +3041,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.22.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2" @@ -2231,6 +3055,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-musleabihf@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.2" @@ -2238,6 +3069,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.2" @@ -2245,6 +3083,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-gnu@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.2" @@ -2252,6 +3097,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2" @@ -2259,6 +3111,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.2" @@ -2266,6 +3125,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-s390x-gnu@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.2" @@ -2273,6 +3139,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.2" @@ -2280,6 +3153,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-gnu@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.2" @@ -2287,6 +3167,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.2" @@ -2294,6 +3181,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.2" @@ -2301,6 +3195,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.21.2": version: 4.21.2 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.2" @@ -2308,6 +3209,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.22.0": + version: 4.22.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.5": version: 1.1.8 resolution: "@scure/base@npm:1.1.8" @@ -2315,6 +3223,13 @@ __metadata: languageName: node linkType: hard +"@scure/base@npm:^1.1.7": + version: 1.1.9 + resolution: "@scure/base@npm:1.1.9" + checksum: 10c0/77a06b9a2db8144d22d9bf198338893d77367c51b58c72b99df990c0a11f7cadd066d4102abb15e3ca6798d1529e3765f55c4355742465e49aed7a0c01fe76e8 + languageName: node + linkType: hard + "@sigstore/bundle@npm:^2.3.2": version: 2.3.2 resolution: "@sigstore/bundle@npm:2.3.2" @@ -2405,7 +3320,7 @@ __metadata: languageName: node linkType: hard -"@substrate/connect-known-chains@npm:^1.1.4": +"@substrate/connect-known-chains@npm:^1.1.4, @substrate/connect-known-chains@npm:^1.1.5": version: 1.4.0 resolution: "@substrate/connect-known-chains@npm:1.4.0" checksum: 10c0/5072a5e560fb02538e2366cca48ae987e906e4c8f35d156bef4eba8753163403f3eb65eadcc7813fb45168b295d00d4364df441fde60b9551ea9491fd4ff4759 @@ -2424,6 +3339,18 @@ __metadata: languageName: node linkType: hard +"@substrate/connect@npm:0.8.11": + version: 0.8.11 + resolution: "@substrate/connect@npm:0.8.11" + dependencies: + "@substrate/connect-extension-protocol": "npm:^2.0.0" + "@substrate/connect-known-chains": "npm:^1.1.5" + "@substrate/light-client-extension-helpers": "npm:^1.0.0" + smoldot: "npm:2.0.26" + checksum: 10c0/ad37dc5d6c806b95a346d42a94b1968b1aa3056ef7dd1a9af60670ab1fe6ecbc61ae52ae74e2b5a93a75b61db812bbe0c3409eb207bd4b438bec02d3554d6daa + languageName: node + linkType: hard + "@substrate/light-client-extension-helpers@npm:^0.0.6": version: 0.0.6 resolution: "@substrate/light-client-extension-helpers@npm:0.0.6" @@ -2441,13 +3368,84 @@ __metadata: languageName: node linkType: hard -"@substrate/ss58-registry@npm:^1.44.0": +"@substrate/light-client-extension-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "@substrate/light-client-extension-helpers@npm:1.0.0" + dependencies: + "@polkadot-api/json-rpc-provider": "npm:^0.0.1" + "@polkadot-api/json-rpc-provider-proxy": "npm:^0.1.0" + "@polkadot-api/observable-client": "npm:^0.3.0" + "@polkadot-api/substrate-client": "npm:^0.1.2" + "@substrate/connect-extension-protocol": "npm:^2.0.0" + "@substrate/connect-known-chains": "npm:^1.1.5" + rxjs: "npm:^7.8.1" + peerDependencies: + smoldot: 2.x + checksum: 10c0/41b692c4f8ec8ee5e67f7c184ea0556c92d2755401efd20c9ee440d0d1d76e00972b76c92514cc6850855a55bbf062b301f1188eeb3b926a7fc1adb914298e94 + languageName: node + linkType: hard + +"@substrate/ss58-registry@npm:^1.44.0, @substrate/ss58-registry@npm:^1.50.0": version: 1.50.0 resolution: "@substrate/ss58-registry@npm:1.50.0" checksum: 10c0/49178248445d88b2f06f6e45e7890bd292f91b9d5d6bfa2788f27b5d9e3a08d3f18462440ea905b2fe7fa60dafb690d40ce1f549929bdbbe48562be622748717 languageName: node linkType: hard +"@tanstack/query-core@npm:5.56.2": + version: 5.56.2 + resolution: "@tanstack/query-core@npm:5.56.2" + checksum: 10c0/54ff55f02b01f6ba089f4965bfd46f430c18ce7e11d874de04c4d58cc8f698598b41e1c017ba029d08ae75e321e546b26f1ea7f788474db265eeba46e780f2f6 + languageName: node + linkType: hard + +"@tanstack/react-query@npm:^5.56.2": + version: 5.56.2 + resolution: "@tanstack/react-query@npm:5.56.2" + dependencies: + "@tanstack/query-core": "npm:5.56.2" + peerDependencies: + react: ^18 || ^19 + checksum: 10c0/6e883b4ca1948f990215b7bce194251faf13a79c6ecf3f3c660af6c6788ed113ab629cefdafb496dfb04866f12dd48d7314e936b75c881b6749127b6496ac8fd + languageName: node + linkType: hard + +"@testing-library/dom@npm:^10.4.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + chalk: "npm:^4.1.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + pretty-format: "npm:^27.0.2" + checksum: 10c0/0352487720ecd433400671e773df0b84b8268fb3fe8e527cdfd7c11b1365b398b4e0eddba6e7e0c85e8d615f48257753283fccec41f6b986fd6c85f15eb5f84f + languageName: node + linkType: hard + +"@testing-library/react@npm:^16.0.1": + version: 16.0.1 + resolution: "@testing-library/react@npm:16.0.1" + dependencies: + "@babel/runtime": "npm:^7.12.5" + peerDependencies: + "@testing-library/dom": ^10.0.0 + "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10c0/67d05dec5ad5a2e6f92b6a3234af785435c7bb62bdbf12f3bfc89c9bca0c871a189e88c4ba023ed4cea504704c87c6ac7e86e24a3962df6c521ae89b62f48ff7 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.11 resolution: "@tsconfig/node10@npm:1.0.11" @@ -2502,6 +3500,13 @@ __metadata: languageName: node linkType: hard +"@types/aria-query@npm:^5.0.1": + version: 5.0.4 + resolution: "@types/aria-query@npm:5.0.4" + checksum: 10c0/dc667bc6a3acc7bba2bccf8c23d56cb1f2f4defaa704cfef595437107efaa972d3b3db9ec1d66bc2711bfc35086821edd32c302bffab36f2e79b97f312069f08 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -2642,6 +3647,32 @@ __metadata: languageName: node linkType: hard +"@types/prop-types@npm:*": + version: 15.7.13 + resolution: "@types/prop-types@npm:15.7.13" + checksum: 10c0/1b20fc67281902c6743379960247bc161f3f0406ffc0df8e7058745a85ea1538612109db0406290512947f9632fe9e10e7337bf0ce6338a91d6c948df16a7c61 + languageName: node + linkType: hard + +"@types/react-dom@npm:^18": + version: 18.3.0 + resolution: "@types/react-dom@npm:18.3.0" + dependencies: + "@types/react": "npm:*" + checksum: 10c0/6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b + languageName: node + linkType: hard + +"@types/react@npm:*, @types/react@npm:^18": + version: 18.3.7 + resolution: "@types/react@npm:18.3.7" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10c0/460f40eadf1fd035344b2ff9061d5c2314db9403f76d05fff7724c78543737c95829e1628567c63d27b542647867eca5b6f284dfd38f1d3b70754f32c4cbecb7 + languageName: node + linkType: hard + "@types/resolve@npm:1.20.2": version: 1.20.2 resolution: "@types/resolve@npm:1.20.2" @@ -2795,6 +3826,88 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/expect@npm:2.1.1" + dependencies: + "@vitest/spy": "npm:2.1.1" + "@vitest/utils": "npm:2.1.1" + chai: "npm:^5.1.1" + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/2a467bcd37378b653040cca062a665f382087eb9f69cff670848a0c207a8458f27211c408c75b7e563e069a2e6d533c78f24e1a317c259646b948813342dbf3d + languageName: node + linkType: hard + +"@vitest/mocker@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/mocker@npm:2.1.1" + dependencies: + "@vitest/spy": "npm:^2.1.0-beta.1" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.11" + peerDependencies: + "@vitest/spy": 2.1.1 + msw: ^2.3.5 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/e0681bb75bf7255ce49f720d193c9c795a64d42fef13c7af5c157514ebce88a5b89dbf702aa0929d4cefaed3db73351bd3ade3ccabecc09a23a872d9c55be50d + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.1, @vitest/pretty-format@npm:^2.1.1": + version: 2.1.1 + resolution: "@vitest/pretty-format@npm:2.1.1" + dependencies: + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/21057465a794a037a7af2c48397531eadf9b2d8a7b4d1ee5af9081cf64216cd0039b9e06317319df79aa2240fed1dbb6767b530deae2bd4b42d6fb974297e97d + languageName: node + linkType: hard + +"@vitest/runner@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/runner@npm:2.1.1" + dependencies: + "@vitest/utils": "npm:2.1.1" + pathe: "npm:^1.1.2" + checksum: 10c0/a6d1424d6224d8a60ed0bbf7cdacb165ef36bc71cc957ad2c11ed1989fa5106636173369f0d8e1fa3f319a965091e52c8ce21203fce4bafe772632ccc2bd65a6 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/snapshot@npm:2.1.1" + dependencies: + "@vitest/pretty-format": "npm:2.1.1" + magic-string: "npm:^0.30.11" + pathe: "npm:^1.1.2" + checksum: 10c0/e9dadee87a2f489883dec0360b55b2776d2a07e460bf2430b34867cd4e9f34b09b3e219a23bc8c3e1359faefdd166072d3305b66a0bea475c7d616470b7d841c + languageName: node + linkType: hard + +"@vitest/spy@npm:2.1.1, @vitest/spy@npm:^2.1.0-beta.1": + version: 2.1.1 + resolution: "@vitest/spy@npm:2.1.1" + dependencies: + tinyspy: "npm:^3.0.0" + checksum: 10c0/b251be1390c105b68aa95270159c4583c3e1a0f7a2e1f82db8b7fadedc3cb459c5ef9286033a1ae764810e00715552fc80afe4507cd8b0065934fb1a64926e06 + languageName: node + linkType: hard + +"@vitest/utils@npm:2.1.1": + version: 2.1.1 + resolution: "@vitest/utils@npm:2.1.1" + dependencies: + "@vitest/pretty-format": "npm:2.1.1" + loupe: "npm:^3.1.1" + tinyrainbow: "npm:^1.2.0" + checksum: 10c0/b724c7f23591860bd24cd8e6d0cd803405f4fbff746db160a948290742144463287566a05ca400deb56817603b5185c4429707947869c3d453805860b5e3a3e5 + languageName: node + linkType: hard + "@yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" @@ -3009,6 +4122,15 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:5.3.0": + version: 5.3.0 + resolution: "aria-query@npm:5.3.0" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/2bff0d4eba5852a9dd578ecf47eaef0e82cc52569b48469b0aac2db5145db0b17b7a58d9e01237706d1e14b7a1b0ac9b78e9c97027ad97679dd8f91b85da1469 + languageName: node + linkType: hard + "array-differ@npm:^3.0.0": version: 3.0.0 resolution: "array-differ@npm:3.0.0" @@ -3044,6 +4166,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: 10c0/bbbcb117ac6480138f8c93cf7f535614282dea9dc828f540cdece85e3c665e8f78958b96afac52f29ff883c72638e6a87d469ecc9fe5bc902df03ed24a55dba8 + languageName: node + linkType: hard + "async@npm:^3.2.3": version: 3.2.6 resolution: "async@npm:3.2.6" @@ -3169,6 +4298,13 @@ __metadata: languageName: node linkType: hard +"bignumber.js@npm:9.1.2": + version: 9.1.2 + resolution: "bignumber.js@npm:9.1.2" + checksum: 10c0/e17786545433f3110b868725c449fa9625366a6e675cd70eb39b60938d6adbd0158cb4b3ad4f306ce817165d37e63f4aa3098ba4110db1d9a3b9f66abfbaf10d + languageName: node + linkType: hard + "bin-links@npm:^4.0.4": version: 4.0.4 resolution: "bin-links@npm:4.0.4" @@ -3290,6 +4426,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + "cacache@npm:^18.0.0, cacache@npm:^18.0.3": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -3349,6 +4492,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.1.1": + version: 5.1.1 + resolution: "chai@npm:5.1.1" + dependencies: + assertion-error: "npm:^2.0.1" + check-error: "npm:^2.1.1" + deep-eql: "npm:^5.0.1" + loupe: "npm:^3.1.0" + pathval: "npm:^2.0.0" + checksum: 10c0/e7f00e5881e3d5224f08fe63966ed6566bd9fdde175863c7c16dd5240416de9b34c4a0dd925f4fd64ad56256ca6507d32cf6131c49e1db65c62578eb31d4566c + languageName: node + linkType: hard + "chalk@npm:4.1.0": version: 4.1.0 resolution: "chalk@npm:4.1.0" @@ -3394,6 +4550,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: 10c0/979f13eccab306cf1785fa10941a590b4e7ea9916ea2a4f8c87f0316fc3eab07eabefb6e587424ef0f88cbcd3805791f172ea739863ca3d7ce2afc54641c7f0e + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -3812,6 +4975,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.0.2": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + "dargs@npm:^7.0.0": version: 7.0.0 resolution: "dargs@npm:7.0.0" @@ -3845,7 +5015,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.2": +"debug@npm:^4.3.2, debug@npm:^4.3.6": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -3886,6 +5056,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 10c0/7102cf3b7bb719c6b9c0db2e19bf0aa9318d141581befe8c7ce8ccd39af9eaa4346e5e05adef7f9bd7015da0f13a3a25dcfe306ef79dc8668aedbecb658dd247 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -3930,6 +5107,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -3967,6 +5151,23 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.5.9": + version: 0.5.16 + resolution: "dom-accessibility-api@npm:0.5.16" + checksum: 10c0/b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 + languageName: node + linkType: hard + +"dom-helpers@npm:^5.0.1": + version: 5.2.1 + resolution: "dom-helpers@npm:5.2.1" + dependencies: + "@babel/runtime": "npm:^7.8.7" + csstype: "npm:^3.0.2" + checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c + languageName: node + linkType: hard + "dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" @@ -4072,6 +5273,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -4104,6 +5312,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -4258,6 +5546,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -4618,7 +5915,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -4628,7 +5925,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -4658,6 +5955,13 @@ __metadata: languageName: node linkType: hard +"get-func-name@npm:^2.0.1": + version: 2.0.2 + resolution: "get-func-name@npm:2.0.2" + checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df + languageName: node + linkType: hard + "get-package-type@npm:^0.1.0": version: 0.1.0 resolution: "get-package-type@npm:0.1.0" @@ -4890,6 +6194,17 @@ __metadata: languageName: node linkType: hard +"happy-dom@npm:^15.7.4": + version: 15.7.4 + resolution: "happy-dom@npm:15.7.4" + dependencies: + entities: "npm:^4.5.0" + webidl-conversions: "npm:^7.0.0" + whatwg-mimetype: "npm:^3.0.0" + checksum: 10c0/406b6b86d52e5dc7bc2fbf0d1c0507a2d954f35dc0af5230f933ad1542646260cb46c1a763d064da0bcf1fbe806efbf10e28bad1c6865c7cde125269358047c0 + languageName: node + linkType: hard + "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" @@ -5932,7 +7247,7 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^4.0.0": +"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed @@ -6345,6 +7660,26 @@ __metadata: languageName: node linkType: hard +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": + version: 1.4.0 + resolution: "loose-envify@npm:1.4.0" + dependencies: + js-tokens: "npm:^3.0.0 || ^4.0.0" + bin: + loose-envify: cli.js + checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e + languageName: node + linkType: hard + +"loupe@npm:^3.1.0, loupe@npm:^3.1.1": + version: 3.1.1 + resolution: "loupe@npm:3.1.1" + dependencies: + get-func-name: "npm:^2.0.1" + checksum: 10c0/99f88badc47e894016df0c403de846fedfea61154aadabbf776c8428dd59e8d8378007135d385d737de32ae47980af07d22ba7bec5ef7beebd721de9baa0a0af + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" @@ -6370,7 +7705,16 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10, magic-string@npm:^0.30.3": +"lz-string@npm:^1.5.0": + version: 1.5.0 + resolution: "lz-string@npm:1.5.0" + bin: + lz-string: bin/bin.js + checksum: 10c0/36128e4de34791838abe979b19927c26e67201ca5acf00880377af7d765b38d1c60847e01c5ec61b1a260c48029084ab3893a3925fd6e48a04011364b089991b + languageName: node + linkType: hard + +"magic-string@npm:^0.30.10, magic-string@npm:^0.30.11, magic-string@npm:^0.30.3": version: 0.30.11 resolution: "magic-string@npm:0.30.11" dependencies: @@ -6757,6 +8101,24 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:5.0.1": + version: 5.0.1 + resolution: "nanoid@npm:5.0.1" + bin: + nanoid: bin/nanoid.js + checksum: 10c0/7d5d267d8b1b14fe51f4fea41a7fc3baefad881438f776d6693eeb73139ea1afa69a60a220c18cf3ec6f1b51bf44a6a4dfcca4778ae113d8b221da7de03a40fa + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -6778,7 +8140,7 @@ __metadata: languageName: node linkType: hard -"nock@npm:^13.5.0": +"nock@npm:^13.5.0, nock@npm:^13.5.4": version: 13.5.5 resolution: "nock@npm:13.5.5" dependencies: @@ -7109,6 +8471,13 @@ __metadata: languageName: node linkType: hard +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 + languageName: node + linkType: hard + "once@npm:^1.3.0, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" @@ -7480,7 +8849,21 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": +"pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: 10c0/64ee0a4e587fb0f208d9777a6c56e4f9050039268faaaaecd50e959ef01bf847b7872785c36483fa5cdcdbdfdb31fef2ff222684d4fc21c330ab60395c681897 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 10c0/602e4ee347fba8a599115af2ccd8179836a63c925c23e04bd056d0674a64b39e3a081b643cc7bc0b84390517df2d800a46fcc5598d42c155fe4977095c2f77c5 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0": version: 1.1.0 resolution: "picocolors@npm:1.1.0" checksum: 10c0/86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 @@ -7548,6 +8931,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.43": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10c0/929f68b5081b7202709456532cee2a145c1843d391508c5a09de2517e8c4791638f71dd63b1898dba6712f8839d7a6da046c72a5e44c162e908f5911f57b5f44 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -7555,6 +8949,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:^27.0.2": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" + dependencies: + ansi-regex: "npm:^5.0.1" + ansi-styles: "npm:^5.0.0" + react-is: "npm:^17.0.1" + checksum: 10c0/0cbda1031aa30c659e10921fa94e0dd3f903ecbbbe7184a729ad66f2b6e7f17891e8c7d7654c458fa4ccb1a411ffb695b4f17bbcd3fe075fabe181027c4040ed + languageName: node + linkType: hard + "pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" @@ -7648,6 +9053,17 @@ __metadata: languageName: node linkType: hard +"prop-types@npm:^15.6.2": + version: 15.8.1 + resolution: "prop-types@npm:15.8.1" + dependencies: + loose-envify: "npm:^1.4.0" + object-assign: "npm:^4.1.1" + react-is: "npm:^16.13.1" + checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 + languageName: node + linkType: hard + "propagate@npm:^2.0.0": version: 2.0.1 resolution: "propagate@npm:2.0.1" @@ -7697,6 +9113,32 @@ __metadata: languageName: node linkType: hard +"react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + scheduler: "npm:^0.23.2" + peerDependencies: + react: ^18.3.1 + checksum: 10c0/a752496c1941f958f2e8ac56239172296fcddce1365ce45222d04a1947e0cc5547df3e8447f855a81d6d39f008d7c32eab43db3712077f09e3f67c4874973e85 + languageName: node + linkType: hard + +"react-is@npm:^16.13.1": + version: 16.13.1 + resolution: "react-is@npm:16.13.1" + checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 + languageName: node + linkType: hard + +"react-is@npm:^17.0.1": + version: 17.0.2 + resolution: "react-is@npm:17.0.2" + checksum: 10c0/2bdb6b93fbb1820b024b496042cce405c57e2f85e777c9aabd55f9b26d145408f9f74f5934676ffdc46f3dcff656d78413a6e43968e7b3f92eea35b3052e9053 + languageName: node + linkType: hard + "react-is@npm:^18.0.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" @@ -7704,6 +9146,30 @@ __metadata: languageName: node linkType: hard +"react-transition-group@npm:4.4.5": + version: 4.4.5 + resolution: "react-transition-group@npm:4.4.5" + dependencies: + "@babel/runtime": "npm:^7.5.5" + dom-helpers: "npm:^5.0.1" + loose-envify: "npm:^1.4.0" + prop-types: "npm:^15.6.2" + peerDependencies: + react: ">=16.6.0" + react-dom: ">=16.6.0" + checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 + languageName: node + linkType: hard + +"react@npm:^18.3.1": + version: 18.3.1 + resolution: "react@npm:18.3.1" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/283e8c5efcf37802c9d1ce767f302dd569dd97a70d9bb8c7be79a789b9902451e0d16334b05d73299b20f048cbc3c7d288bbbde10b701fa194e2089c237dbea3 + languageName: node + linkType: hard + "read-cmd-shim@npm:4.0.0, read-cmd-shim@npm:^4.0.0": version: 4.0.0 resolution: "read-cmd-shim@npm:4.0.0" @@ -7810,6 +9276,13 @@ __metadata: languageName: node linkType: hard +"regenerator-runtime@npm:^0.14.0": + version: 0.14.1 + resolution: "regenerator-runtime@npm:0.14.1" + checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -7949,6 +9422,69 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0": + version: 4.22.0 + resolution: "rollup@npm:4.22.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.22.0" + "@rollup/rollup-android-arm64": "npm:4.22.0" + "@rollup/rollup-darwin-arm64": "npm:4.22.0" + "@rollup/rollup-darwin-x64": "npm:4.22.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.22.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.22.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.22.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.22.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.22.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.22.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.22.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.22.0" + "@rollup/rollup-linux-x64-musl": "npm:4.22.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.22.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.22.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.22.0" + "@types/estree": "npm:1.0.5" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/8dd70e7f8d1f8f1a40328634ced7438daca5a7da113d60881bc743a8a601f23d6922488b33754f47c8acea29fda1b3085040ff261f9ee6820cfb4370b4a89528 + languageName: node + linkType: hard + "rollup@npm:^4.21.2": version: 4.21.2 resolution: "rollup@npm:4.21.2" @@ -8109,9 +9645,19 @@ __metadata: resolution: "sails-js@workspace:js" dependencies: "@gear-js/api": "npm:0.38.2" + "@gear-js/react-hooks": "npm:0.13.0" "@polkadot/api": "npm:12.0.1" "@polkadot/types": "npm:12.0.1" + "@tanstack/react-query": "npm:^5.56.2" + "@testing-library/dom": "npm:^10.4.0" + "@testing-library/react": "npm:^16.0.1" + "@types/react": "npm:^18" + "@types/react-dom": "npm:^18" + happy-dom: "npm:^15.7.4" jest: "npm:^29.7.0" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + vitest: "npm:^2.1.1" peerDependencies: "@gear-js/api": 0.38.2 "@polkadot/api": 12.0.1 @@ -8157,6 +9703,15 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" + dependencies: + loose-envify: "npm:^1.1.0" + checksum: 10c0/26383305e249651d4c58e6705d5f8425f153211aef95f15161c151f7b8de885f24751b377e4a0b3dd42cce09aad3f87a61dab7636859c0d89b7daf1a1e2a5c78 + languageName: node + linkType: hard + "semver@npm:2 || 3 || 4 || 5, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" @@ -8216,6 +9771,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 10c0/3def8f8e516fbb34cb6ae415b07ccc5d9c018d85b4b8611e3dc6f8be6d1899f693a4382913c9ed51a06babb5201639d76453ab297d1c54a456544acf5c892e34 + languageName: node + linkType: hard + "signal-exit@npm:3.0.7, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -8274,6 +9836,15 @@ __metadata: languageName: node linkType: hard +"smoldot@npm:2.0.26": + version: 2.0.26 + resolution: "smoldot@npm:2.0.26" + dependencies: + ws: "npm:^8.8.1" + checksum: 10c0/a4788fb92e5ed6e8c3d171d00474712c6f98f62cae68543f1029e7976a64ce9c8126956e50d6bd89482df8568f8ac043d5eb50b63f44f9a6062cbc49f0ef2dad + languageName: node + linkType: hard + "socks-proxy-agent@npm:^8.0.3": version: 8.0.4 resolution: "socks-proxy-agent@npm:8.0.4" @@ -8304,6 +9875,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -8405,6 +9983,20 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 10c0/89a1416668f950236dd5ac9f9a6b2588e1b9b62b1b6ad8dff1bfc5d1a15dbf0aafc9b52d2226d00c28dffff212da464eaeebfc6b7578b9d180cef3e3782c5983 + languageName: node + linkType: hard + +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 10c0/60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -8633,6 +10225,41 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10c0/c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.0": + version: 0.3.0 + resolution: "tinyexec@npm:0.3.0" + checksum: 10c0/138a4f4241aea6b6312559508468ab275a31955e66e2f57ed206e0aaabecee622624f208c5740345f0a66e33478fd065e359ed1eb1269eb6fd4fa25d44d0ba3b + languageName: node + linkType: hard + +"tinypool@npm:^1.0.0": + version: 1.0.1 + resolution: "tinypool@npm:1.0.1" + checksum: 10c0/90939d6a03f1519c61007bf416632dc1f0b9c1a9dd673c179ccd9e36a408437384f984fc86555a5d040d45b595abc299c3bb39d354439e98a090766b5952e73d + languageName: node + linkType: hard + +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: 10c0/7f78a4b997e5ba0f5ecb75e7ed786f30bab9063716e7dff24dd84013fb338802e43d176cb21ed12480561f5649a82184cf31efb296601a29d38145b1cdb4c192 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.0": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10c0/55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -8788,7 +10415,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": +"tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.7.0": version: 2.7.0 resolution: "tslib@npm:2.7.0" checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 @@ -9027,6 +10654,112 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:2.1.1": + version: 2.1.1 + resolution: "vite-node@npm:2.1.1" + dependencies: + cac: "npm:^6.7.14" + debug: "npm:^4.3.6" + pathe: "npm:^1.1.2" + vite: "npm:^5.0.0" + bin: + vite-node: vite-node.mjs + checksum: 10c0/8a8b958df3d48af915e07e7efb042ee4c036ca0b73d2c411dc29254fd3533ada0807ce5096d8339894d3e786418b7d1a9c4ae02718c6aca11b5098de2b14c336 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": + version: 5.4.6 + resolution: "vite@npm:5.4.6" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/5f87be3a10e970eaf9ac52dfab39cf9fff583036685252fb64570b6d7bfa749f6d221fb78058f5ef4b5664c180d45a8e7a7ff68d7f3770e69e24c7c68b958bde + languageName: node + linkType: hard + +"vitest@npm:^2.1.1": + version: 2.1.1 + resolution: "vitest@npm:2.1.1" + dependencies: + "@vitest/expect": "npm:2.1.1" + "@vitest/mocker": "npm:2.1.1" + "@vitest/pretty-format": "npm:^2.1.1" + "@vitest/runner": "npm:2.1.1" + "@vitest/snapshot": "npm:2.1.1" + "@vitest/spy": "npm:2.1.1" + "@vitest/utils": "npm:2.1.1" + chai: "npm:^5.1.1" + debug: "npm:^4.3.6" + magic-string: "npm:^0.30.11" + pathe: "npm:^1.1.2" + std-env: "npm:^3.7.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.0" + tinypool: "npm:^1.0.0" + tinyrainbow: "npm:^1.2.0" + vite: "npm:^5.0.0" + vite-node: "npm:2.1.1" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.1 + "@vitest/ui": 2.1.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/77a67092338613376dadd8f6f6872383db8409402ce400ac1de48efd87a7214183e798484a3eb2310221c03554e37a00f9fdbc91e49194e7c68e009a5589f494 + languageName: node + linkType: hard + "walk-up-path@npm:^3.0.1": version: 3.0.1 resolution: "walk-up-path@npm:3.0.1" @@ -9066,6 +10799,20 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: 10c0/323895a1cda29a5fb0b9ca82831d2c316309fede0365047c4c323073e3239067a304a09a1f4b123b9532641ab604203f33a1403b5ca6a62ef405bcd7a204080f + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -9098,6 +10845,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: "npm:^2.0.0" + stackback: "npm:0.0.2" + bin: + why-is-node-running: cli.js + checksum: 10c0/1cde0b01b827d2cf4cb11db962f3958b9175d5d9e7ac7361d1a7b0e2dc6069a263e69118bd974c4f6d0a890ef4eedfe34cf3d5167ec14203dbc9a18620537054 + languageName: node + linkType: hard + "wide-align@npm:1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -9217,7 +10976,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.15.1, ws@npm:^8.8.1": +"ws@npm:^8.15.1, ws@npm:^8.16.0, ws@npm:^8.8.1": version: 8.18.0 resolution: "ws@npm:8.18.0" peerDependencies: From 4a1afff0db11b8c5fdc9bf375d937dc81bda693e Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Thu, 19 Sep 2024 18:51:19 +0300 Subject: [PATCH 22/23] Fix jest tests --- js/cli/rollup.config.js | 1 + js/jest.config.ts | 23 +++++++---------------- js/package.json | 4 ++-- js/vitest.config.ts | 7 +++++-- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/js/cli/rollup.config.js b/js/cli/rollup.config.js index 284b5c2e..b9a96923 100644 --- a/js/cli/rollup.config.js +++ b/js/cli/rollup.config.js @@ -25,6 +25,7 @@ function updateConfigVersions() { config.versions['polkadot-api'] = sailsJs.peerDependencies['@polkadot/api']; config.versions['sails-js'] = sailsJs.version; config.versions['typescript'] = rootPkgJson.devDependencies.typescript; + config.versions['@gear-js/react-hooks'] = sailsJs.devDependencies['@gear-js/react-hooks']; writeFileSync('src/config.json', JSON.stringify(config, null, 2)); }, diff --git a/js/jest.config.ts b/js/jest.config.ts index 8218c423..038266b4 100644 --- a/js/jest.config.ts +++ b/js/jest.config.ts @@ -1,31 +1,22 @@ import type { Config } from '@jest/types'; -import { createDefaultEsmPreset } from 'ts-jest'; const config: Config.InitialOptions = { - ...createDefaultEsmPreset(), globalSetup: './test/setup.js', clearMocks: true, coverageProvider: 'v8', testEnvironment: 'node', verbose: true, - + preset: 'ts-jest/presets/js-with-babel', + transformIgnorePatterns: ['node_modules/(?!@polkadot)/'], + extensionsToTreatAsEsm: ['.ts'], moduleNameMapper: { '^(\\.{1,2}/.*)\\.js$': '$1', - - // manually resolving hooks to esm, cuz somehow jest resolves it to cjs? - // if main property in a package.json is pointing to esm, there's no problem whatsoever. - // maybe it has something to do with the package folder structure - '^@gear-js/react-hooks$': '/../node_modules/@gear-js/react-hooks/dist/esm/index.mjs', }, - - testTimeout: 15_000, - - // cuz hooks testEnvironment is jsdom. there was a problem with rxjs for example - // https://github.com/microsoft/accessibility-insights-web/pull/5421#issuecomment-1109168149 - // https://jest-archive-august-2023.netlify.app/docs/28.x/upgrading-to-jest28/#packagejson-exports - testEnvironmentOptions: { - customExportConditions: ['node'], + transform: { + '^.+\\.tsx?$': ['ts-jest', { useESM: true }], }, + testTimeout: 15_000, + testPathIgnorePatterns: ['demo-hooks.test.tsx'], // ignore hooks test }; export default config; diff --git a/js/package.json b/js/package.json index 899ae2bf..ea66f6bd 100644 --- a/js/package.json +++ b/js/package.json @@ -32,8 +32,8 @@ "scripts": { "prebuild": "rm -rf lib", "build": "npx rollup --config rollup.config.js", - "test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles", - "test-hooks": "vitest" + "test-hooks": "vitest", + "test": "yarn node --no-warnings --experimental-vm-modules $(yarn bin jest) --detectOpenHandles && yarn run test-hooks" }, "peerDependencies": { "@gear-js/api": "0.38.2", diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 84953f06..5830487f 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -3,10 +3,13 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ // resolving manually cuz vitest is using nodejs resolution, remove after hooks update // https://github.com/vitest-dev/vitest/discussions/4233 - resolve: { alias: { '@gear-js/react-hooks': '@gear-js/react-hooks/dist/esm/index.mjs' } }, + resolve: { + alias: { + '@gear-js/react-hooks': '@gear-js/react-hooks/dist/esm/index.mjs', + }, + }, test: { - // globalSetup: 'test/setup.js', include: ['**/*-hooks.test.ts?(x)'], // targeting only hooks environment: 'happy-dom', // faster than jsdom watch: false, // fire one time From 2e6b90586a3ff9af34ab81559385fe71c55bd746 Mon Sep 17 00:00:00 2001 From: Nikita Yutanov Date: Fri, 20 Sep 2024 00:18:00 +0300 Subject: [PATCH 23/23] Add types tests --- js/cli/rollup.config.js | 2 +- js/cli/src/generate/hooks-gen.ts | 34 ++-- js/test/demo-hooks.test.tsx | 263 ++++++++++++++++++++++++++----- js/vitest.config.ts | 11 +- 4 files changed, 245 insertions(+), 65 deletions(-) diff --git a/js/cli/rollup.config.js b/js/cli/rollup.config.js index b9a96923..2e445074 100644 --- a/js/cli/rollup.config.js +++ b/js/cli/rollup.config.js @@ -25,7 +25,7 @@ function updateConfigVersions() { config.versions['polkadot-api'] = sailsJs.peerDependencies['@polkadot/api']; config.versions['sails-js'] = sailsJs.version; config.versions['typescript'] = rootPkgJson.devDependencies.typescript; - config.versions['@gear-js/react-hooks'] = sailsJs.devDependencies['@gear-js/react-hooks']; + config.versions['gear-js-hooks'] = sailsJs.devDependencies['@gear-js/react-hooks']; writeFileSync('src/config.json', JSON.stringify(config, null, 2)); }, diff --git a/js/cli/src/generate/hooks-gen.ts b/js/cli/src/generate/hooks-gen.ts index 62434823..22ff291d 100644 --- a/js/cli/src/generate/hooks-gen.ts +++ b/js/cli/src/generate/hooks-gen.ts @@ -22,7 +22,7 @@ export class HooksGenerator extends BaseGenerator { useProgramEvent, UseProgramParameters as useSailsProgramParameters, UseProgramQueryParameters, - UseProgramEventParameters`, + UseProgramEventParameters` ) // TODO: combine with above after hooks update .import( @@ -34,7 +34,7 @@ export class HooksGenerator extends BaseGenerator { FunctionName, QueryName, QueryReturn, - EventReturn`, + EventReturn` ) .import(`./${LIB_FILE_NAME}`, 'Program'); }; @@ -62,9 +62,9 @@ export class HooksGenerator extends BaseGenerator { .line('QueryReturn', false) .reduceIndent() .line('>,', false) - .line("'program' | 'serviceName' | 'functionName'", false) + .line("'serviceName' | 'functionName'", false) .reduceIndent() - .line('> & ProgramParameter') + .line('>') .line() .line('type UseEventParameters<', false) .increaseIndent() @@ -81,16 +81,16 @@ export class HooksGenerator extends BaseGenerator { .line('EventCallbackArgs>', false) .reduceIndent() .line('>,', false) - .line("'program' | 'serviceName' | 'functionName'", false) + .line("'serviceName' | 'functionName'", false) .reduceIndent() - .line('> & ProgramParameter') + .line('>') .line(); }; private generateUseProgram = () => this._out .block('export function useProgram(parameters: UseProgramParameters)', () => - this._out.line('return useSailsProgram({ library: Program, ...parameters })'), + this._out.line('return useSailsProgram({ library: Program, ...parameters })') ) .line(); @@ -101,9 +101,9 @@ export class HooksGenerator extends BaseGenerator { .block(`export function ${name}({ program }: ProgramParameter)`, () => this._out.line( `return useSendProgramTransaction({ program, serviceName: '${toLowerCaseFirst( - serviceName, - )}', functionName: '${toLowerCaseFirst(functionName)}' })`, - ), + serviceName + )}', functionName: '${toLowerCaseFirst(functionName)}' })` + ) ) .line(); }; @@ -115,9 +115,9 @@ export class HooksGenerator extends BaseGenerator { .block(`export function ${name}({ program }: ProgramParameter)`, () => this._out.line( `return usePrepareProgramTransaction({ program, serviceName: '${toLowerCaseFirst( - serviceName, - )}', functionName: '${toLowerCaseFirst(functionName)}' })`, - ), + serviceName + )}', functionName: '${toLowerCaseFirst(functionName)}' })` + ) ) .line(); }; @@ -132,8 +132,8 @@ export class HooksGenerator extends BaseGenerator { `export function ${name}(parameters: UseQueryParameters<'${formattedServiceName}', '${formattedFunctionName}'>)`, () => this._out.line( - `return useProgramQuery({ ...parameters, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}' })`, - ), + `return useProgramQuery({ ...parameters, serviceName: '${formattedServiceName}', functionName: '${formattedFunctionName}' })` + ) ) .line(); }; @@ -148,8 +148,8 @@ export class HooksGenerator extends BaseGenerator { `export function ${name}(parameters: UseEventParameters<'${formattedServiceName}', '${functionName}'>)`, () => this._out.line( - `return useProgramEvent({...parameters, serviceName: '${formattedServiceName}', functionName: '${functionName}' })`, - ), + `return useProgramEvent({...parameters, serviceName: '${formattedServiceName}', functionName: '${functionName}' })` + ) ) .line(); }; diff --git a/js/test/demo-hooks.test.tsx b/js/test/demo-hooks.test.tsx index fc1d8e1c..2a45d9c0 100644 --- a/js/test/demo-hooks.test.tsx +++ b/js/test/demo-hooks.test.tsx @@ -1,18 +1,35 @@ import { HexString } from '@gear-js/api'; -import * as GearHooks from '@gear-js/react-hooks'; +import * as gearHooks from '@gear-js/react-hooks'; +import type { UseProgramParameters, UseProgramQueryParameters } from '@gear-js/react-hooks'; +import type { + GenericTransactionReturn, + SignAndSendOptions, + TransactionReturn, +} from '@gear-js/react-hooks/dist/esm/hooks/sails/types'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { renderHook as renderReactHook } from '@testing-library/react'; +import { renderHook as renderReactHook, waitFor } from '@testing-library/react'; import * as fs from 'fs'; import path from 'path'; import { ReactNode } from 'react'; -import { test, expect, vi, MockInstance } from 'vitest'; +import { test, expect, vi, MockInstance, expectTypeOf, describe } from 'vitest'; import { SailsIdlParser } from 'sails-js-parser'; import { toLowerCaseFirst } from 'sails-js-util'; -import { Sails } from '..'; -import { Program } from './demo/lib'; +import { ActorId, NonZeroU32, Sails } from '..'; +import { DoThatParam, Program, ReferenceCount } from './demo/lib'; +import { + useCounterAddedEvent, + useDogPositionQuery, + useDogWalkedEvent, + usePrepareCounterAddTransaction, + usePrepareReferencesIncrTransaction, + useSendDogWalkTransaction, + useSendThisThatDoThatTransaction, + useThisThatThatQuery, +} from './demo/hooks'; const { useProgram, ...demoHooks } = await import('./demo/hooks'); +const { ApiProvider } = gearHooks; const getSails = async () => { const idlPath = path.resolve(__dirname, '../../examples/demo/client/demo.idl'); @@ -22,17 +39,19 @@ const getSails = async () => { return new Sails(parser).parseIdl(idl); }; -const SAILS = await getSails(); -const QUERY_CLIENT = new QueryClient(); - -const useProgramSpy = vi.spyOn(GearHooks, 'useProgram'); -const useSendTransactionSpy = vi.spyOn(GearHooks, 'useSendProgramTransaction'); -const usePrepareTransactionSpy = vi.spyOn(GearHooks, 'usePrepareProgramTransaction'); -const useQuerySpy = vi.spyOn(GearHooks, 'useProgramQuery'); -const useEventSpy = vi.spyOn(GearHooks, 'useProgramEvent'); +const apiArgs = { endpoint: 'ws://127.0.0.1:9944' }; +const { services } = await getSails(); +const queryClient = new QueryClient(); +const useProgramSpy = vi.spyOn(gearHooks, 'useProgram'); +const useSendTransactionSpy = vi.spyOn(gearHooks, 'useSendProgramTransaction'); +const usePrepareTransactionSpy = vi.spyOn(gearHooks, 'usePrepareProgramTransaction'); +const useQuerySpy = vi.spyOn(gearHooks, 'useProgramQuery'); +const useEventSpy = vi.spyOn(gearHooks, 'useProgramEvent'); const Providers = ({ children }: { children: ReactNode }) => ( - {children} + + {children} + ); const renderHook = (hook: (initialProps: TProps) => TReturn) => @@ -43,55 +62,217 @@ const testHookParameters = ( getName: (value: string) => string, spy: MockInstance, extraArgs = {}, - getFunctionName?: (value: string) => string, + getFunctionName: (value: string) => string = (value) => value ) => { const { result } = renderHook(() => useProgram({ id: '0x01' })); const program = result.current.data; + const args = { program, ...extraArgs }; - Object.entries(SAILS.services).forEach(([serviceName, { [type]: functions }]) => { - Object.keys(functions).forEach((functionName) => { + Object.entries(services).forEach(([serviceName, service]) => + Object.keys(service[type]).forEach((functionName) => { const hookName = getName(`${serviceName}${functionName}`); const useHook: unknown = demoHooks[hookName]; if (typeof useHook !== 'function') throw new Error(`Hook ${hookName} not found`); - renderHook(() => useHook({ program, ...extraArgs })); + renderHook(() => useHook(args)); expect(spy).toHaveBeenCalledWith({ - program, + ...args, serviceName: toLowerCaseFirst(serviceName), - functionName: toLowerCaseFirst(getFunctionName ? getFunctionName(functionName) : functionName), - ...extraArgs, + functionName: toLowerCaseFirst(getFunctionName(functionName)), }); - }); - }); + }) + ); }; -test('useProgram parameters forwarding', () => { - const ARGS = { id: '0x01' as HexString, query: { enabled: true } }; - renderHook(() => useProgram(ARGS)); +describe('useProgram', () => { + test('parameters forwarding', () => { + const args = { id: '0x01' as HexString, query: { enabled: true } }; + renderHook(() => useProgram(args)); - expect(useProgramSpy).toHaveBeenCalledWith({ library: Program, ...ARGS }); + expect(useProgramSpy).toHaveBeenCalledWith({ library: Program, ...args }); + }); + + test('program instance return', async () => { + const { result } = renderHook(() => useProgram({ id: '0x01' })); + + await waitFor(() => expect(result.current.data).toBeInstanceOf(Program)); + }); + + test('parameters type', () => { + expectTypeOf(useProgram) + .parameter(0) + .toEqualTypeOf<{ id: HexString; query?: UseProgramParameters['query'] }>(); + }); }); -test('useSendTransaction parameters forwarding', () => { - testHookParameters('functions', (name) => `useSend${name}Transaction`, useSendTransactionSpy); +describe('useSendTransaction', () => { + test('parameters forwarding', () => { + testHookParameters('functions', (name) => `useSend${name}Transaction`, useSendTransactionSpy); + }); + + test('parameters type', () => { + expectTypeOf(useSendDogWalkTransaction).parameter(0).toEqualTypeOf<{ program: Program | undefined }>(); + expectTypeOf(useSendThisThatDoThatTransaction).parameter(0).toEqualTypeOf<{ program: Program | undefined }>(); + }); + + test('mutation args type', () => { + const { result: programResult } = renderHook(() => useProgram({ id: '0x01' })); + const program = programResult.current.data; + + const { result } = renderHook(() => useSendDogWalkTransaction({ program })); + const { sendTransaction } = result.current; + + const { result: anotherResult } = renderHook(() => useSendThisThatDoThatTransaction({ program })); + const { sendTransaction: anotherSendTransaction } = anotherResult.current; + + expectTypeOf(sendTransaction) + .parameter(0) + .extract>() + .toMatchTypeOf<{ args: [number, number] }>(); + + expectTypeOf(anotherSendTransaction) + .parameter(0) + .extract>() + .toMatchTypeOf<{ args: [DoThatParam] }>(); + }); + + test('mutation return type', () => { + const { result: programResult } = renderHook(() => useProgram({ id: '0x01' })); + const program = programResult.current.data; + + const { result } = renderHook(() => useSendDogWalkTransaction({ program: programResult.current.data })); + const { sendTransactionAsync } = result.current; + + const { result: anotherResult } = renderHook(() => useSendThisThatDoThatTransaction({ program })); + const { sendTransactionAsync: anotherSendTransactionAsync } = anotherResult.current; + + expectTypeOf(sendTransactionAsync) + .returns.resolves.pick('awaited') + .toMatchTypeOf<{ awaited: { response: null } }>(); + + expectTypeOf(anotherSendTransactionAsync) + .returns.resolves.pick('awaited') + .toMatchTypeOf<{ awaited: { response: { ok: [ActorId, NonZeroU32] } | { err: [string] } } }>(); + }); }); -test('usePrepareTransaction parameters forwarding', () => { - testHookParameters('functions', (name) => `usePrepare${name}Transaction`, usePrepareTransactionSpy); +describe('usePrepareTransaction', () => { + test('parameters forwarding', () => { + testHookParameters('functions', (name) => `usePrepare${name}Transaction`, usePrepareTransactionSpy); + }); + + test('parameters type', () => { + expectTypeOf(usePrepareCounterAddTransaction).parameter(0).toEqualTypeOf<{ program: Program | undefined }>(); + expectTypeOf(usePrepareReferencesIncrTransaction).parameter(0).toEqualTypeOf<{ program: Program | undefined }>(); + }); + + test('mutation args type', () => { + const { result: programResult } = renderHook(() => useProgram({ id: '0x01' })); + const program = programResult.current.data; + + const { result } = renderHook(() => usePrepareCounterAddTransaction({ program })); + const { prepareTransaction } = result.current; + + const { result: anotherResult } = renderHook(() => usePrepareReferencesIncrTransaction({ program })); + const { prepareTransaction: anotherPrepareTransaction } = anotherResult.current; + + expectTypeOf(prepareTransaction).parameter(0).toMatchTypeOf<{ args: [number] }>(); + expectTypeOf(anotherPrepareTransaction).parameter(0).toMatchTypeOf<{ args: [] }>(); + }); + + test('mutation return type', async () => { + const { result: programResult } = renderHook(() => useProgram({ id: '0x01' })); + const program = programResult.current.data; + + const { result } = renderHook(() => usePrepareCounterAddTransaction({ program })); + const { prepareTransactionAsync } = result.current; + + const { result: anotherResult } = renderHook(() => usePrepareReferencesIncrTransaction({ program })); + const { prepareTransactionAsync: anotherPrepareTransactionAsync } = anotherResult.current; + + expectTypeOf(prepareTransactionAsync) + .returns.resolves.pick('transaction') + .toEqualTypeOf<{ transaction: TransactionReturn<(value: number) => GenericTransactionReturn> }>(); + + expectTypeOf(anotherPrepareTransactionAsync) + .returns.resolves.pick('transaction') + .toEqualTypeOf<{ transaction: TransactionReturn<() => GenericTransactionReturn> }>(); + }); }); -test('useQuery parameters forwarding', () => { - testHookParameters('queries', (name) => `use${name}Query`, useQuerySpy, { query: { enabled: true } }); +describe('useQuery', () => { + test('parameters forwarding', () => { + testHookParameters('queries', (name) => `use${name}Query`, useQuerySpy, { query: { enabled: true } }); + }); + + test('parameters type', () => { + expectTypeOf(useDogPositionQuery) + .parameter(0) + .toEqualTypeOf< + Omit< + UseProgramQueryParameters< + Program, + 'dog', + 'position', + [originAddress?: string, value?: string | number | bigint, atBlock?: HexString], + [number, number] + >, + 'serviceName' | 'functionName' + > + >(); + + expectTypeOf(useThisThatThatQuery) + .parameter(0) + .toEqualTypeOf< + Omit< + UseProgramQueryParameters< + Program, + 'thisThat', + 'that', + [originAddress?: string, value?: string | number | bigint, atBlock?: HexString], + { ok: string } | { err: string } + >, + 'serviceName' | 'functionName' + > + >(); + }); + + test('query return type', () => { + const { result: programResult } = renderHook(() => useProgram({ id: '0x01' })); + const program = programResult.current.data; + + const { result } = renderHook(() => useDogPositionQuery({ program, args: [] })); + const { data } = result.current; + + const { result: anotherResult } = renderHook(() => useThisThatThatQuery({ program, args: [] })); + const { data: anotherData } = anotherResult.current; + + expectTypeOf(data).toEqualTypeOf<[number, number]>(); + expectTypeOf(anotherData).toEqualTypeOf<{ ok: string } | { err: string }>(); + }); }); -test('useEvent parameters forwarding', () => { - testHookParameters( - 'events', - (name) => `use${name}Event`, - useEventSpy, - { query: { enabled: true }, onData: () => {} }, - (name) => `subscribeTo${name}Event`, - ); +describe('useEvent', () => { + test('parameters forwarding', () => { + testHookParameters( + 'events', + (name) => `use${name}Event`, + useEventSpy, + { query: { enabled: true } }, + (name) => `subscribeTo${name}Event` + ); + }); + + test('parameters + onData args type', () => { + expectTypeOf(useCounterAddedEvent) + .parameter(0) + .toEqualTypeOf<{ program: Program | undefined; onData: (value: number) => void }>(); + + expectTypeOf(useDogWalkedEvent).parameter(0).toEqualTypeOf<{ + program: Program | undefined; + onData: (value: { from: [number, number]; to: [number, number] }) => void; + }>(); + }); }); diff --git a/js/vitest.config.ts b/js/vitest.config.ts index 5830487f..fdff97f5 100644 --- a/js/vitest.config.ts +++ b/js/vitest.config.ts @@ -1,18 +1,17 @@ import { defineConfig } from 'vitest/config'; +const HOOKS_REGEX = '**/*-hooks.test.ts?(x)'; + export default defineConfig({ // resolving manually cuz vitest is using nodejs resolution, remove after hooks update // https://github.com/vitest-dev/vitest/discussions/4233 - resolve: { - alias: { - '@gear-js/react-hooks': '@gear-js/react-hooks/dist/esm/index.mjs', - }, - }, + resolve: { alias: { '@gear-js/react-hooks': '@gear-js/react-hooks/dist/esm/index.mjs' } }, test: { - include: ['**/*-hooks.test.ts?(x)'], // targeting only hooks + include: [HOOKS_REGEX], // targeting only hooks environment: 'happy-dom', // faster than jsdom watch: false, // fire one time server: { deps: { inline: ['@gear-js/react-hooks'] } }, // patching esm to allow spying + typecheck: { enabled: true, include: [HOOKS_REGEX], ignoreSourceErrors: true }, // test types }, });