diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 1ace5e01..4fa3a0f2 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -14,7 +14,7 @@ jobs: id: metadata uses: dependabot/fetch-metadata@08eff52bf64351f401fb50d4972fa95b9f2c2d1b with: - github-token: "${{ secrets.GITHUB_TOKEN }}" + github-token: '${{ secrets.GITHUB_TOKEN }}' - name: Enable auto-merge for Dependabot Patch / Minor PRs if: steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' run: gh pr review --approve "$PR_URL" && gh pr merge --auto --squash "$PR_URL" diff --git a/builder/package.json b/builder/package.json index 1f249f21..fb5b6179 100644 --- a/builder/package.json +++ b/builder/package.json @@ -17,6 +17,7 @@ "yaml": "^2.8.0" }, "devDependencies": { + "@types/minimist": "^1.2.5", "@types/node": "^22.13.15", "tsup": "^8.4.0" } diff --git a/library/factories/package.json b/library/factories/package.json index 534c5ee0..4d89e24d 100644 --- a/library/factories/package.json +++ b/library/factories/package.json @@ -13,7 +13,7 @@ }, "devDependencies": { "@types/react": "^19.0.12", - "@w3ux/types": "^2.1.13", + "@w3ux/types": "^2.2.3", "builder": "workspace:*", "gulp": "^5.0.0", "gulp-sourcemaps": "^3.0.0", diff --git a/library/hooks/package.json b/library/hooks/package.json index 84ee5867..28fe8830 100644 --- a/library/hooks/package.json +++ b/library/hooks/package.json @@ -13,7 +13,7 @@ }, "devDependencies": { "@types/react": "^19.0.12", - "@w3ux/types": "^2.1.13", + "@w3ux/types": "^2.2.3", "builder": "workspace:*", "gulp": "^5.0.0", "gulp-sourcemaps": "^3.0.0", diff --git a/library/observables-connect/package.json b/library/observables-connect/package.json index 47a8e4c0..17a2afa6 100644 --- a/library/observables-connect/package.json +++ b/library/observables-connect/package.json @@ -13,7 +13,7 @@ "@w3ux/utils": "^2.0.10" }, "devDependencies": { - "@w3ux/types": "^2.1.13", + "@w3ux/types": "^2.2.3", "builder": "workspace:*", "gulp": "^5.0.0", "gulp-sourcemaps": "^3.0.0", diff --git a/library/observables-connect/src/accounts/get.ts b/library/observables-connect/src/accounts/get.ts index 2390ad7d..bb855edd 100644 --- a/library/observables-connect/src/accounts/get.ts +++ b/library/observables-connect/src/accounts/get.ts @@ -12,7 +12,7 @@ export const getAccountsFromExtensions = async ( try { const results = await Promise.allSettled( Array.from(extensions.values()).map(({ extension }) => - extension.accounts.get() + extension!.accounts.get() ) ) @@ -21,7 +21,7 @@ export const getAccountsFromExtensions = async ( for (let i = 0; i < results.length; i++) { const result = results[i] const source = extensionEntries[i][0] - const signer = extensionEntries[i][1].extension.signer + const signer = extensionEntries[i][1].extension!.signer if (result.status === 'fulfilled' && signer) { const { value } = result diff --git a/library/observables-connect/src/extensions/discover.ts b/library/observables-connect/src/extensions/discover.ts index c335e925..7f246a9e 100644 --- a/library/observables-connect/src/extensions/discover.ts +++ b/library/observables-connect/src/extensions/discover.ts @@ -7,7 +7,8 @@ import { _extensionsStatus, _gettingExtensions } from '../subjects' // Gets extensions from injectedWeb3 export const getExtensions = async () => { _gettingExtensions.next(true) - let injectedWeb3Interval: ReturnType | null = null + let injectedWeb3Interval: ReturnType | undefined = + undefined // Format installed extensions const formatInstalled = () => diff --git a/library/observables-connect/src/extensions/enable.ts b/library/observables-connect/src/extensions/enable.ts index 0c0f88f5..c8cff30f 100644 --- a/library/observables-connect/src/extensions/enable.ts +++ b/library/observables-connect/src/extensions/enable.ts @@ -38,8 +38,8 @@ const doEnable = async ( (id) => withTimeoutThrow( 1000, - window.injectedWeb3[id].enable(dappName) - ) as Promise + window.injectedWeb3![id].enable(dappName) + ) as Promise ) ) @@ -60,6 +60,7 @@ const formatEnabledExtensions = ( }) } else if (result.status === 'rejected') { extensionsState.set(id, { + extension: null, connected: false, error: result.reason, }) diff --git a/library/observables-connect/src/extensions/init.ts b/library/observables-connect/src/extensions/init.ts index 237a09f1..9f202450 100644 --- a/library/observables-connect/src/extensions/init.ts +++ b/library/observables-connect/src/extensions/init.ts @@ -35,7 +35,7 @@ export const initExtensions = async ( newStatus[id] = 'connected' }) Array.from(withError.entries()).forEach(([id, { error }]) => { - if (error.startsWith('Error')) { + if (error?.startsWith('Error')) { // Extension not found - remove from state if (error.substring(0, 17) === 'NotInstalledError') { delete newStatus[id] diff --git a/library/observables-connect/src/extensions/reconnect.ts b/library/observables-connect/src/extensions/reconnect.ts index 21c76041..e4f12f9d 100644 --- a/library/observables-connect/src/extensions/reconnect.ts +++ b/library/observables-connect/src/extensions/reconnect.ts @@ -26,14 +26,14 @@ export const reconnectExtensions = async (dappName: string, ss58: number) => { // If available, subscribe to accounts for each connected extension for (const [id, { extension }] of Array.from(connected.entries())) { - if (typeof extension.accounts.subscribe === 'function') { - const unsub = extension.accounts.subscribe((accounts) => { + if (typeof extension!.accounts.subscribe === 'function') { + const unsub = extension!.accounts.subscribe((accounts) => { processExtensionAccounts( { source: id, ss58, }, - extension.signer, + extension!.signer, accounts ) }) diff --git a/library/react-connect-kit/package.json b/library/react-connect-kit/package.json index 2b02a8e7..f188ac7b 100644 --- a/library/react-connect-kit/package.json +++ b/library/react-connect-kit/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@types/react": "^19.0.12", - "@w3ux/types": "^2.2.1", + "@w3ux/types": "^2.2.3", "builder": "workspace:*", "gulp": "^5.0.0", "gulp-sourcemaps": "^3.0.0", diff --git a/library/react-odometer/src/index.tsx b/library/react-odometer/src/index.tsx index 9e714623..0718f9cc 100644 --- a/library/react-odometer/src/index.tsx +++ b/library/react-odometer/src/index.tsx @@ -1,6 +1,7 @@ /* @license Copyright 2024 w3ux authors & contributors SPDX-License-Identifier: GPL-3.0-only */ +import type { RefObject } from 'react' import { createRef, useEffect, useRef, useState } from 'react' import './index.css' import type { Digit, DigitRef, Direction, Props, Status } from './types' @@ -48,7 +49,9 @@ export const Odometer = ({ const [digitRefs, setDigitRefs] = useState([]) // Store refs of each `all` digit. - const [allDigitRefs, setAllDigitRefs] = useState>({}) + const [allDigitRefs, setAllDigitRefs] = useState< + Record> + >({}) // Keep track of active transitions. const activeTransitionCounter = useRef(0) @@ -59,7 +62,10 @@ export const Odometer = ({ // Phase 0: populate `allDigitRefs`. useEffect(() => { - const all: Record = Object.fromEntries( + const all: Record< + string, + RefObject + > = Object.fromEntries( Object.values(allDigits).map((v) => [`d_${v}`, createRef()]) ) @@ -105,7 +111,7 @@ export const Odometer = ({ } }, [status, digitRefs]) - const odometerCurrent: Element = odometerRef?.current + const odometerCurrent: HTMLSpanElement | null = odometerRef.current let lineHeight = odometerCurrent ? window.getComputedStyle(odometerCurrent).lineHeight : 'inherit' diff --git a/library/react-polkicon/src/utils.tsx b/library/react-polkicon/src/utils.tsx index dca37537..a84542ce 100644 --- a/library/react-polkicon/src/utils.tsx +++ b/library/react-polkicon/src/utils.tsx @@ -126,8 +126,10 @@ export const getCircleCoordinates = (): Coordinate[] => { * In effect, this function acts like a weighted random selector. Each scheme has a chance of being * picked based on its `freq` relative to the total frequency across all schemes. */ -const findScheme = (d: number): Scheme => - Object.values(SCHEMA).find((scheme) => (d -= scheme.freq) < 0) +const findScheme = (d: number): Scheme => { + const schemes = Object.values(SCHEMA) + return schemes.find((scheme) => (d -= scheme.freq) < 0) ?? schemes[0] +} /** * Converts an address string into a unique identifier by first encoding and decoding the address diff --git a/library/types/package.json b/library/types/package.json index 71bb4cfb..3dbe45f6 100644 --- a/library/types/package.json +++ b/library/types/package.json @@ -1,7 +1,7 @@ { "name": "@w3ux/types-source", "license": "GPL-3.0-only", - "version": "2.2.1", + "version": "2.2.3", "type": "module", "scripts": { "clear": "rm -rf node_modules dist tsconfig.tsbuildinfo", diff --git a/library/types/src/extensions.ts b/library/types/src/extensions.ts index cbcb4dc6..3b672b12 100644 --- a/library/types/src/extensions.ts +++ b/library/types/src/extensions.ts @@ -45,7 +45,7 @@ export type ExtensionEnableStatus = export type ExtensionEnableResults = Map export interface ExtensionEnableResult { - extension?: ExtensionInterface + extension: ExtensionInterface | null connected: boolean error?: string } diff --git a/library/utils/src/base.ts b/library/utils/src/base.ts index 1b3a06f6..4667e622 100644 --- a/library/utils/src/base.ts +++ b/library/utils/src/base.ts @@ -92,7 +92,7 @@ export const camelize = (str: string) => { } const w = toWords(str)?.map((a) => a.toLowerCase()) - return simpleCamelCase(w) + return simpleCamelCase(w || []) } /** @@ -161,7 +161,7 @@ export const rmCommas = (val: string): string => val.replace(/,/g, '') * @name rmDecimals * @summary Removes the decimal point and decimals from a string. */ -export const rmDecimals = (str) => str.split('.')[0] +export const rmDecimals = (str: string) => str.split('.')[0] /** * @name shuffle diff --git a/library/utils/src/unit.ts b/library/utils/src/unit.ts index 92bbf754..cc7e3c19 100644 --- a/library/utils/src/unit.ts +++ b/library/utils/src/unit.ts @@ -235,6 +235,14 @@ export const removeVarFromUrlHash = (key: string) => { */ export const sortWithNull = (ascending: boolean) => (a: unknown, b: unknown) => { + // if both items are undefined, treat them as equal + if (typeof a === 'undefined' && typeof b === 'undefined') { + return 0 + } + // if either item is undefined, sort it last + if (typeof a === 'undefined' || typeof b === 'undefined') { + return typeof a === 'undefined' ? 1 : -1 + } // equal items sort equally if (a === b) { return 0 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8491d90..86f3e716 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,6 +101,9 @@ importers: specifier: ^2.8.0 version: 2.8.0 devDependencies: + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 '@types/node': specifier: ^22.13.15 version: 22.15.29 @@ -145,8 +148,8 @@ importers: specifier: ^19.0.12 version: 19.1.6 '@w3ux/types': - specifier: ^2.1.13 - version: 2.2.1 + specifier: ^2.2.3 + version: 2.2.3 builder: specifier: workspace:* version: link:../../builder @@ -185,8 +188,8 @@ importers: specifier: ^19.0.12 version: 19.1.6 '@w3ux/types': - specifier: ^2.1.13 - version: 2.2.1 + specifier: ^2.2.3 + version: 2.2.3 builder: specifier: workspace:* version: link:../../builder @@ -225,8 +228,8 @@ importers: version: 7.8.2 devDependencies: '@w3ux/types': - specifier: ^2.1.13 - version: 2.2.1 + specifier: ^2.2.3 + version: 2.2.3 builder: specifier: workspace:* version: link:../../builder @@ -274,8 +277,8 @@ importers: specifier: ^19.0.12 version: 19.1.6 '@w3ux/types': - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^2.2.3 + version: 2.2.3 builder: specifier: workspace:* version: link:../../builder @@ -1086,6 +1089,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1309,8 +1315,8 @@ packages: peerDependencies: rxjs: ^7.8.2 - '@w3ux/types@2.2.1': - resolution: {integrity: sha512-4SmN8QAZSAKN5N9OVNyc4zMOrewvaXTLiw3HZg7X1EAD3xz0AftWr/iZwCAlC1PhprF4gQexIOly24qwIg+Kaw==} + '@w3ux/types@2.2.3': + resolution: {integrity: sha512-6i2qfTDZX+nQxMRQujskM5DWcr8ANRLRmxZhDXjkUvRQ8rwbWxd8l/pS0GPhGmQOdP6Dx3tx3oY44FeN0V0Pug==} '@w3ux/utils@2.0.10': resolution: {integrity: sha512-utJhLwZyCTxQDxtlZIskPsM7FgckNllBT1Z/XGgAITt0UxqHhMW4mJr7TViV9s4GHCaFhBYwhUrb5PpoDgnZNw==} @@ -4359,6 +4365,8 @@ snapshots: '@types/json5@0.0.29': {} + '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': optional: true @@ -4619,7 +4627,7 @@ snapshots: - react - utf-8-validate - '@w3ux/types@2.2.1': {} + '@w3ux/types@2.2.3': {} '@w3ux/utils@2.0.10': dependencies: diff --git a/tsconfig.base.json b/tsconfig.base.json index a2cd310a..9ed714a6 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -11,7 +11,7 @@ "resolveJsonModule": true, "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "strict": false + "strict": true }, "exclude": ["**/node_modules", "**/dist", "vite.config.js"] }