diff --git a/.github/workflows/qrcode-sdk-ci.yml b/.github/workflows/qrcode-sdk-ci.yml
new file mode 100644
index 000000000..cc91e6ed8
--- /dev/null
+++ b/.github/workflows/qrcode-sdk-ci.yml
@@ -0,0 +1,253 @@
+name: QRCode SDK CI
+
+env:
+ # Build environment versions
+ NODE_VERSION: 22
+ # Cache versioning - increment these to bust caches when needed
+ GH_CACHE_VERSION: v1 # Global cache version
+ GH_YARN_CACHE_VERSION: v1 # Yarn-specific cache version
+ GH_SDK_CACHE_VERSION: v1 # SDK build cache version
+
+on:
+ pull_request:
+ paths:
+ - "sdk/qrcode/**"
+ - "common/**"
+ - ".github/workflows/qrcode-sdk-ci.yml"
+ - ".github/actions/**"
+ push:
+ branches: [main, develop]
+ paths:
+ - "sdk/qrcode/**"
+ - "common/**"
+
+jobs:
+ # Build dependencies once and cache for other jobs
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Cache Yarn dependencies
+ id: yarn-cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .yarn/cache
+ node_modules
+ sdk/qrcode/node_modules
+ common/node_modules
+ key: ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-
+
+ - name: Install Dependencies
+ uses: ./.github/actions/yarn-install
+
+ - name: Build dependencies
+ shell: bash
+ run: |
+ yarn workspace @selfxyz/common build
+ yarn workspace @selfxyz/qrcode build
+
+ - name: Cache build artifacts
+ uses: actions/cache/save@v4
+ with:
+ path: |
+ common/dist
+ sdk/qrcode/dist
+ key: qrcode-sdk-build-${{ env.GH_SDK_CACHE_VERSION }}-${{ github.sha }}
+
+ # Quality checks job
+ quality-checks:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Cache Yarn dependencies
+ id: yarn-cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .yarn/cache
+ node_modules
+ sdk/qrcode/node_modules
+ common/node_modules
+ key: ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-
+
+ - name: Install Dependencies
+ uses: ./.github/actions/yarn-install
+
+ - name: Restore build artifacts
+ uses: actions/cache/restore@v4
+ with:
+ path: |
+ common/dist
+ sdk/qrcode/dist
+ key: qrcode-sdk-build-${{ env.GH_SDK_CACHE_VERSION }}-${{ github.sha }}
+ fail-on-cache-miss: true
+
+ - name: Run linter
+ run: yarn workspace @selfxyz/qrcode lint:imports:check
+
+ - name: Check Prettier formatting
+ run: yarn workspace @selfxyz/qrcode lint
+
+ - name: Type checking
+ run: yarn workspace @selfxyz/qrcode types
+
+ - name: Log cache status
+ run: |
+ echo "Cache hit results:"
+ echo "- Yarn cache hit: ${{ steps.yarn-cache.outputs.cache-hit }}"
+
+ # Build verification job
+ build-verification:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Cache Yarn dependencies
+ id: yarn-cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .yarn/cache
+ node_modules
+ sdk/qrcode/node_modules
+ common/node_modules
+ key: ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-
+
+ - name: Install Dependencies
+ uses: ./.github/actions/yarn-install
+
+ - name: Restore build artifacts
+ uses: actions/cache/restore@v4
+ with:
+ path: |
+ common/dist
+ sdk/qrcode/dist
+ key: qrcode-sdk-build-${{ env.GH_SDK_CACHE_VERSION }}-${{ github.sha }}
+ fail-on-cache-miss: true
+
+ - name: Verify build output
+ run: |
+ echo "Checking build output structure..."
+ ls -la sdk/qrcode/dist/
+ echo "Checking ESM build..."
+ ls -la sdk/qrcode/dist/esm/
+ echo "Checking CJS build..."
+ ls -la sdk/qrcode/dist/cjs/
+ echo "Checking type definitions..."
+ if ! find sdk/qrcode/dist/esm -maxdepth 1 -name '*.d.ts' | grep -q .; then
+ echo "No .d.ts files found in dist/esm"; exit 1;
+ fi
+ find sdk/qrcode/dist/esm -maxdepth 1 -name '*.d.ts' -ls
+
+ - name: Test package exports
+ run: |
+ echo "Testing package exports..."
+ node -e "
+ const pkg = require('./sdk/qrcode/package.json');
+ console.log('Package exports:', JSON.stringify(pkg.exports, null, 2));
+ "
+
+ - name: Verify bundle size
+ run: yarn workspace @selfxyz/qrcode size-limit
+
+ - name: Log cache status
+ run: |
+ echo "Cache hit results:"
+ echo "- Yarn cache hit: ${{ steps.yarn-cache.outputs.cache-hit }}"
+
+ # Integration test job
+ integration-test:
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ env.NODE_VERSION }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ env.NODE_VERSION }}
+
+ - name: Enable Corepack
+ run: corepack enable
+
+ - name: Cache Yarn dependencies
+ id: yarn-cache
+ uses: actions/cache@v4
+ with:
+ path: |
+ .yarn/cache
+ node_modules
+ sdk/qrcode/node_modules
+ common/node_modules
+ key: ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-${{ hashFiles('yarn.lock') }}
+ restore-keys: |
+ ${{ runner.os }}-${{ env.GH_YARN_CACHE_VERSION }}-node${{ env.NODE_VERSION }}-yarn-
+
+ - name: Install Dependencies
+ uses: ./.github/actions/yarn-install
+
+ - name: Restore build artifacts
+ uses: actions/cache/restore@v4
+ with:
+ path: |
+ common/dist
+ sdk/qrcode/dist
+ key: qrcode-sdk-build-${{ env.GH_SDK_CACHE_VERSION }}-${{ github.sha }}
+ fail-on-cache-miss: true
+
+ - name: Run tests
+ run: yarn workspace @selfxyz/qrcode test
+
+ - name: Test package import
+ run: |
+ echo "Testing package import..."
+ node -e "
+ try {
+ const { SelfQRcode, SelfQRcodeWrapper, countries } = require('./sdk/qrcode/dist/cjs/index.cjs');
+ console.log('ā
Package import successful');
+ console.log('Exported components:', Object.keys({ SelfQRcode, SelfQRcodeWrapper, countries }));
+ } catch (error) {
+ console.error('ā Package import failed:', error.message);
+ process.exit(1);
+ }
+ "
+
+ - name: Log cache status
+ run: |
+ echo "Cache hit results:"
+ echo "- Yarn cache hit: ${{ steps.yarn-cache.outputs.cache-hit }}"
diff --git a/app/scripts/bundle-analyze-ci.cjs b/app/scripts/bundle-analyze-ci.cjs
index 1205797ed..718e24b02 100755
--- a/app/scripts/bundle-analyze-ci.cjs
+++ b/app/scripts/bundle-analyze-ci.cjs
@@ -25,8 +25,8 @@ function formatBytes(bytes) {
return Math.round((bytes / Math.pow(1024, i)) * 100) / 100 + ' ' + sizes[i];
}
-function checkBundleSize(bundleSize, platform) {
- const thresholdMB = BUNDLE_THRESHOLDS_MB[platform];
+function checkBundleSize(bundleSize, targetPlatform) {
+ const thresholdMB = BUNDLE_THRESHOLDS_MB[targetPlatform];
const thresholdBytes = thresholdMB * 1024 * 1024;
console.log(`\nš¦ Bundle size: ${formatBytes(bundleSize)}`);
diff --git a/app/scripts/mobile-deploy-confirm.cjs b/app/scripts/mobile-deploy-confirm.cjs
index 98980a9e3..ccf3b9e79 100755
--- a/app/scripts/mobile-deploy-confirm.cjs
+++ b/app/scripts/mobile-deploy-confirm.cjs
@@ -353,7 +353,7 @@ function displayPlatformVersions(platform, versions) {
const currentBuild = versions.ios.build;
const nextBuild = versions.versionJson
? versions.versionJson.ios.build + 1
- : parseInt(currentBuild) + 1;
+ : parseInt(currentBuild, 10) + 1;
const lastDeployed = versions.versionJson
? getTimeAgo(versions.versionJson.ios.lastDeployed)
: 'Unknown';
@@ -371,7 +371,7 @@ function displayPlatformVersions(platform, versions) {
const currentBuild = versions.android.versionCode;
const nextBuild = versions.versionJson
? versions.versionJson.android.build + 1
- : parseInt(currentBuild) + 1;
+ : parseInt(currentBuild, 10) + 1;
const lastDeployed = versions.versionJson
? getTimeAgo(versions.versionJson.android.lastDeployed)
: 'Unknown';
@@ -391,7 +391,7 @@ function displayPlatformVersions(platform, versions) {
if (versions.versionJson) {
if (platform === PLATFORMS.IOS || platform === PLATFORMS.BOTH) {
const jsonBuild = versions.versionJson.ios.build;
- const actualBuild = parseInt(versions.ios.build);
+ const actualBuild = parseInt(versions.ios.build, 10);
if (jsonBuild !== actualBuild) {
console.log(
`\n${CONSOLE_SYMBOLS.WARNING} iOS build mismatch: version.json has ${jsonBuild}, but Xcode has ${actualBuild}`,
@@ -401,7 +401,7 @@ function displayPlatformVersions(platform, versions) {
if (platform === PLATFORMS.ANDROID || platform === PLATFORMS.BOTH) {
const jsonBuild = versions.versionJson.android.build;
- const actualBuild = parseInt(versions.android.versionCode);
+ const actualBuild = parseInt(versions.android.versionCode, 10);
if (jsonBuild !== actualBuild) {
console.log(
`\n${CONSOLE_SYMBOLS.WARNING} Android build mismatch: version.json has ${jsonBuild}, but gradle has ${actualBuild}`,
diff --git a/app/scripts/tests/tree-shaking.test.cjs b/app/scripts/tests/tree-shaking.test.cjs
index 369f88c87..7b42511b6 100644
--- a/app/scripts/tests/tree-shaking.test.cjs
+++ b/app/scripts/tests/tree-shaking.test.cjs
@@ -24,7 +24,7 @@ describe('Tree Shaking Infrastructure Tests', () => {
assert(stats.isFile(), `${script} should be a file`);
// Check if file is executable (has execute permission)
- const isExecutable = (stats.mode & parseInt('111', 8)) !== 0;
+ const isExecutable = (stats.mode & 0o111) !== 0;
assert(isExecutable, `${script} should be executable`);
});
});
diff --git a/app/src/providers/authProvider.web.tsx b/app/src/providers/authProvider.web.tsx
index e73d13e92..bdae61fc7 100644
--- a/app/src/providers/authProvider.web.tsx
+++ b/app/src/providers/authProvider.web.tsx
@@ -191,10 +191,10 @@ export const AuthProvider = ({
} else {
return { success: false, error: 'No private key provided' };
}
- } catch (error: unknown) {
+ } catch (err: unknown) {
return {
success: false,
- error: error instanceof Error ? error.message : String(error),
+ error: err instanceof Error ? err.message : String(err),
};
}
})();
diff --git a/app/src/screens/prove/ProofRequestStatusScreen.tsx b/app/src/screens/prove/ProofRequestStatusScreen.tsx
index 4f1393ad7..ea26c270a 100644
--- a/app/src/screens/prove/ProofRequestStatusScreen.tsx
+++ b/app/src/screens/prove/ProofRequestStatusScreen.tsx
@@ -86,9 +86,11 @@ const SuccessScreen: React.FC = () => {
if (isFocused && !countdownStarted && selfApp?.deeplinkCallback) {
if (selfApp?.deeplinkCallback) {
try {
- new URL(selfApp.deeplinkCallback);
- setCountdown(5);
- setCountdownStarted(true);
+ const url = new URL(selfApp.deeplinkCallback);
+ if (url) {
+ setCountdown(5);
+ setCountdownStarted(true);
+ }
} catch (error) {
console.warn(
'Invalid deep link URL provided:',
diff --git a/app/tests/src/providers/passportDataProvider.test.tsx b/app/tests/src/providers/passportDataProvider.test.tsx
index 915cc0a1a..e5da56c24 100644
--- a/app/tests/src/providers/passportDataProvider.test.tsx
+++ b/app/tests/src/providers/passportDataProvider.test.tsx
@@ -180,12 +180,15 @@ describe('PassportDataProvider', () => {
);
const updateCount = getByTestId('update-count');
- const initialCount = parseInt(updateCount.props.children);
+ const initialCount = parseInt(updateCount.props.children, 10);
// Wait for updates to occur
await waitFor(
() => {
- const newCount = parseInt(getByTestId('update-count').props.children);
+ const newCount = parseInt(
+ getByTestId('update-count').props.children,
+ 10,
+ );
expect(newCount).toBeGreaterThan(initialCount);
},
{ timeout: 1000 },
diff --git a/common/index.ts b/common/index.ts
index f44d23dc9..497c15cf5 100644
--- a/common/index.ts
+++ b/common/index.ts
@@ -35,6 +35,7 @@ export {
ID_CARD_ATTESTATION_ID,
PASSPORT_ATTESTATION_ID,
PCR0_MANAGER_ADDRESS,
+ REDIRECT_URL,
RPC_URL,
TREE_URL,
TREE_URL_STAGING,
diff --git a/common/tsup.config.ts b/common/tsup.config.ts
index 368437429..08c8f22f4 100644
--- a/common/tsup.config.ts
+++ b/common/tsup.config.ts
@@ -86,17 +86,20 @@ export default defineConfig([
},
format: ['esm'],
outDir: path.resolve(__dirname, 'dist/esm'),
+ outExtension: ({ format }) => ({ js: format === 'cjs' ? '.cjs' : '.js' }),
dts: false, // Generated separately via build:types script
splitting: false,
clean: true, // Clean only on first build
sourcemap: true,
target: 'es2020',
+ platform: 'neutral',
external: [
/^@openpassport/,
/^asn1/,
/^axios/,
/^buffer/,
/^chai/,
+ /^child_process/,
/^country-/,
/^elliptic/,
/^ethers/,
@@ -194,17 +197,20 @@ export default defineConfig([
},
format: ['cjs'],
outDir: path.resolve(__dirname, 'dist/cjs'),
+ outExtension: ({ format }) => ({ js: format === 'cjs' ? '.cjs' : '.js' }),
dts: false, // Only generate types once (in ESM build)
splitting: false,
clean: false, // Don't clean after ESM build
sourcemap: true,
target: 'es2020',
+ platform: 'neutral',
external: [
/^@openpassport/,
/^asn1/,
/^axios/,
/^buffer/,
/^chai/,
+ /^child_process/,
/^country-/,
/^elliptic/,
/^ethers/,
diff --git a/sdk/qrcode/.eslintrc.cjs b/sdk/qrcode/.eslintrc.cjs
new file mode 100644
index 000000000..36cc39bd8
--- /dev/null
+++ b/sdk/qrcode/.eslintrc.cjs
@@ -0,0 +1,36 @@
+module.exports = {
+ root: true,
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ ecmaVersion: 2021,
+ sourceType: 'module',
+ },
+ plugins: ['simple-import-sort', 'import', 'sort-exports'],
+ extends: [
+ 'eslint:recommended',
+ 'plugin:@typescript-eslint/recommended',
+ 'plugin:import/recommended',
+ 'plugin:import/typescript',
+ 'prettier',
+ ],
+ settings: {
+ 'import/resolver': {
+ typescript: {
+ alwaysTryTypes: true,
+ project: './tsconfig.json',
+ },
+ },
+ },
+ rules: {
+ 'simple-import-sort/imports': 'error',
+ 'sort-exports/sort-exports': [
+ 'error',
+ { sortDir: 'asc', ignoreCase: false, sortExportKindFirst: 'type' },
+ ],
+ '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],
+ 'import/first': 'error',
+ 'import/no-duplicates': 'error',
+ 'import/newline-after-import': 'error',
+ },
+ ignorePatterns: ['dist/', 'node_modules/'],
+};
diff --git a/sdk/qrcode/.prettierrc b/sdk/qrcode/.prettierrc
index 41334fc47..0f3774b1b 100644
--- a/sdk/qrcode/.prettierrc
+++ b/sdk/qrcode/.prettierrc
@@ -1,11 +1,17 @@
{
- "arrowParens": "avoid",
- "bracketSameLine": false,
- "bracketSpacing": true,
- "singleQuote": true,
- "trailingComma": "all",
+ "printWidth": 100,
"tabWidth": 2,
"useTabs": false,
- "semi": true,
- "endOfLine": "auto"
+ "singleQuote": true,
+ "quoteProps": "as-needed",
+ "jsxSingleQuote": false,
+ "trailingComma": "es5",
+ "bracketSpacing": true,
+ "bracketSameLine": false,
+ "arrowParens": "always",
+ "proseWrap": "preserve",
+ "htmlWhitespaceSensitivity": "css",
+ "endOfLine": "lf",
+ "embeddedLanguageFormatting": "auto",
+ "singleAttributePerLine": false
}
diff --git a/sdk/qrcode/.size-limit.json b/sdk/qrcode/.size-limit.json
index 304e9e21e..5bc972207 100644
--- a/sdk/qrcode/.size-limit.json
+++ b/sdk/qrcode/.size-limit.json
@@ -1,26 +1,25 @@
[
{
- "path": "./dist/index.js",
- "name": "import SelfQRcodeWrapper from '@selfxyz/qrcode'",
- "import": "{ default }",
- "limit": "800 ms"
+ "path": "./dist/cjs/index.cjs",
+ "name": "Full bundle",
+ "limit": "80 s"
},
{
- "path": "./dist/index.js",
- "name": "import { SelfAppBuilder } from '@selfxyz/qrcode'",
- "import": "{ SelfAppBuilder }",
- "limit": "800 ms"
+ "path": "./dist/cjs/index.cjs",
+ "name": "SelfQRcodeWrapper import",
+ "import": "SelfQRcodeWrapper",
+ "limit": "80 s"
},
{
- "path": "./dist/index.js",
- "name": "import { SelfQRcode } from '@selfxyz/qrcode'",
- "import": "{ SelfQRcode }",
- "limit": "800 ms"
+ "path": "./dist/cjs/index.cjs",
+ "name": "SelfQRcode import",
+ "import": "SelfQRcode",
+ "limit": "80 s"
},
{
- "path": "./dist/index.js",
- "name": "import { countries } from '@selfxyz/qrcode'",
- "import": "{ countries }",
- "limit": "800 ms"
+ "path": "./dist/cjs/index.cjs",
+ "name": "countries import",
+ "import": "countries",
+ "limit": "80 s"
}
]
diff --git a/sdk/qrcode/README.md b/sdk/qrcode/README.md
index ecabf1262..62f8e6b48 100644
--- a/sdk/qrcode/README.md
+++ b/sdk/qrcode/README.md
@@ -168,9 +168,7 @@ function VerificationPage() {
size={350}
/>
-
- User ID: {userId.substring(0, 8)}...
-
+ User ID: {userId.substring(0, 8)}...
);
}
diff --git a/sdk/qrcode/components/LED.tsx b/sdk/qrcode/components/LED.tsx
index c7857f1ac..c3a90fed0 100644
--- a/sdk/qrcode/components/LED.tsx
+++ b/sdk/qrcode/components/LED.tsx
@@ -1,5 +1,7 @@
import React from 'react';
+
import { QRcodeSteps } from '../utils/utils.js';
+
interface LEDProps {
size?: number;
connectionStatus?: number;
@@ -9,10 +11,7 @@ const green = '#31F040';
const blue = '#424AD8';
const gray = '#95a5a6';
-const LED: React.FC = ({
- size = 8,
- connectionStatus = QRcodeSteps.DISCONNECTED,
-}) => {
+const LED: React.FC = ({ size = 8, connectionStatus = QRcodeSteps.DISCONNECTED }) => {
const getColor = () => {
if (connectionStatus >= QRcodeSteps.MOBILE_CONNECTED) {
return green;
diff --git a/sdk/qrcode/components/SelfQRcode.tsx b/sdk/qrcode/components/SelfQRcode.tsx
index 15e4eb48b..8cd70316d 100644
--- a/sdk/qrcode/components/SelfQRcode.tsx
+++ b/sdk/qrcode/components/SelfQRcode.tsx
@@ -1,24 +1,17 @@
-import React, { useEffect, useState, useRef } from 'react';
-import { BounceLoader } from 'react-spinners';
+import type { SelfApp } from '@selfxyz/common';
+import { getUniversalLink, REDIRECT_URL, WS_DB_RELAYER } from '@selfxyz/common';
import Lottie from 'lottie-react';
+import { QRCodeSVG } from 'qrcode.react';
+import React, { useEffect, useRef, useState } from 'react';
+import { BounceLoader } from 'react-spinners';
+import { v4 as uuidv4 } from 'uuid';
+
import CHECK_ANIMATION from '../animations/check_animation.json' with { type: 'json' };
import X_ANIMATION from '../animations/x_animation.json' with { type: 'json' };
-import LED from './LED.js';
-import { REDIRECT_URL, WS_DB_RELAYER } from '@selfxyz/common/constants';
-import { v4 as uuidv4 } from 'uuid';
+import { containerStyle, ledContainerStyle, qrContainerStyle } from '../utils/styles.js';
import { QRcodeSteps } from '../utils/utils.js';
-import {
- containerStyle,
- ledContainerStyle,
- qrContainerStyle,
-} from '../utils/styles.js';
-import { QRCodeSVG } from 'qrcode.react';
import { initWebSocket } from '../utils/websocket.js';
-import {
- getUniversalLink,
- SelfAppBuilder,
-} from '@selfxyz/common/utils/appType';
-import type { SelfApp } from '@selfxyz/common/utils/appType';
+import LED from './LED.js';
interface SelfQRcodeProps {
selfApp: SelfApp;
@@ -53,7 +46,6 @@ const SelfQRcode = ({
darkMode = false,
}: SelfQRcodeProps) => {
const [proofStep, setProofStep] = useState(QRcodeSteps.WAITING_FOR_MOBILE);
- const [proofVerified, setProofVerified] = useState(false);
const [sessionId, setSessionId] = useState('');
const socketRef = useRef | null>(null);
@@ -73,7 +65,7 @@ const SelfQRcode = ({
type,
setProofStep,
onSuccess,
- onError,
+ onError
);
}
@@ -149,4 +141,4 @@ const SelfQRcode = ({
};
// Also export other components/types that might be needed
-export { SelfQRcodeWrapper, SelfQRcode, SelfApp, SelfAppBuilder };
+export { SelfQRcode, SelfQRcodeWrapper };
diff --git a/sdk/qrcode/index.ts b/sdk/qrcode/index.ts
index 40c312c81..d5d0ec059 100644
--- a/sdk/qrcode/index.ts
+++ b/sdk/qrcode/index.ts
@@ -1,13 +1,11 @@
-import {
- SelfQRcode,
- SelfAppBuilder,
- SelfQRcodeWrapper,
-} from './components/SelfQRcode.js';
-import type { SelfApp } from './components/SelfQRcode.js';
-import { WebAppInfo } from './utils/websocket.js';
-import { countries } from '@selfxyz/common/constants/countries';
+import type { SelfApp } from '@selfxyz/common';
+import { countries } from '@selfxyz/common';
-export { SelfQRcodeWrapper, SelfQRcode, SelfAppBuilder, countries };
-export type { SelfApp };
+import { SelfQRcode, SelfQRcodeWrapper } from './components/SelfQRcode.js';
+import type { WebAppInfo } from './utils/websocket.js';
+export type { SelfApp };
export type { WebAppInfo };
+
+export { SelfQRcode, SelfQRcodeWrapper };
+export { countries };
diff --git a/sdk/qrcode/package.json b/sdk/qrcode/package.json
index 5950090d9..5bf3ca366 100644
--- a/sdk/qrcode/package.json
+++ b/sdk/qrcode/package.json
@@ -17,28 +17,55 @@
"type": "module",
"exports": {
".": {
- "import": {
- "types": "./dist/index.d.ts",
- "default": "./dist/index.js"
- },
- "require": {
- "types": "./dist/index.d.cts",
- "default": "./dist/index.cjs"
- }
+ "import": "./dist/esm/index.js",
+ "require": "./dist/cjs/index.cjs",
+ "types": "./dist/esm/index.d.ts"
+ },
+ "./components/LED": {
+ "import": "./dist/esm/components/LED.js",
+ "require": "./dist/cjs/components/LED.cjs",
+ "types": "./dist/esm/components/LED.d.ts"
+ },
+ "./components/SelfQRcode": {
+ "import": "./dist/esm/components/SelfQRcode.js",
+ "require": "./dist/cjs/components/SelfQRcode.cjs",
+ "types": "./dist/esm/components/SelfQRcode.d.ts"
+ },
+ "./utils/utils": {
+ "import": "./dist/esm/utils/utils.js",
+ "require": "./dist/cjs/utils/utils.cjs",
+ "types": "./dist/esm/utils/utils.d.ts"
+ },
+ "./utils/styles": {
+ "import": "./dist/esm/utils/styles.js",
+ "require": "./dist/cjs/utils/styles.cjs",
+ "types": "./dist/esm/utils/styles.d.ts"
+ },
+ "./utils/websocket": {
+ "import": "./dist/esm/utils/websocket.js",
+ "require": "./dist/cjs/utils/websocket.cjs",
+ "types": "./dist/esm/utils/websocket.d.ts"
}
},
- "main": "dist/index.cjs",
- "module": "dist/index.js",
- "types": "dist/index.d.cts",
+ "main": "dist/cjs/index.cjs",
+ "module": "dist/esm/index.js",
+ "types": "dist/esm/index.d.ts",
"files": [
"dist"
],
"scripts": {
- "build": "tsup --config tsup.config.ts",
+ "build": "tsup && yarn build:types && yarn postbuild",
+ "postbuild": "node ./scripts/postBuild.mjs",
"build:deps": "yarn workspaces foreach --from @selfxyz/qrcode --topological-dev --recursive run build",
+ "build:types": "tsc -p tsconfig.json --emitDeclarationOnly",
+ "build:watch": "tsup --watch",
"format": "prettier --write .",
"install-sdk": "yarn workspace focus @selfxyz/qrcode",
"lint": "prettier --check .",
+ "lint:imports": "eslint . --fix",
+ "lint:imports:check": "eslint .",
+ "nice": "yarn format && yarn lint:imports",
+ "nice:check": "yarn lint && yarn lint:imports:check",
"prepublishOnly": "yarn build",
"publish": "yarn npm publish --access public",
"test": "echo 'no tests found'",
@@ -65,6 +92,15 @@
"@types/react": "^18.3.4",
"@types/react-dom": "^18.3.0",
"@types/uuid": "^10.0.0",
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "@typescript-eslint/parser": "^8.0.0",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-import-resolver-typescript": "^4.4.4",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-prettier": "^5.1.3",
+ "eslint-plugin-simple-import-sort": "^12.1.1",
+ "eslint-plugin-sort-exports": "^0.9.1",
"mocha": "^10.3.0",
"prettier": "^3.3.3",
"react": "^18.0.0",
diff --git a/sdk/qrcode/scripts/postBuild.mjs b/sdk/qrcode/scripts/postBuild.mjs
new file mode 100644
index 000000000..245baed91
--- /dev/null
+++ b/sdk/qrcode/scripts/postBuild.mjs
@@ -0,0 +1,59 @@
+import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+import { shimConfigs } from './shimConfigs.js';
+
+const __dirname = path.dirname(fileURLToPath(import.meta.url));
+const DIST = path.resolve(__dirname, '..', 'dist');
+
+const packageJsonPath = path.resolve(__dirname, '..', 'package.json');
+const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
+
+writeFileSync(path.join(DIST, 'esm', 'package.json'), JSON.stringify({ type: 'module' }, null, 4));
+writeFileSync(
+ path.join(DIST, 'cjs', 'package.json'),
+ JSON.stringify({ type: 'commonjs' }, null, 4)
+);
+
+const distPackageJson = {
+ name: '@selfxyz/qrcode',
+ version: packageJson.version,
+ type: 'module',
+ exports: {
+ '.': './esm/index.js',
+ './components/LED': './esm/components/LED.js',
+ './components/SelfQRcode': './esm/components/SelfQRcode.js',
+ './utils/utils': './esm/utils/utils.js',
+ './utils/styles': './esm/utils/styles.js',
+ './utils/websocket': './esm/utils/websocket.js',
+ },
+};
+writeFileSync(path.join(DIST, 'package.json'), JSON.stringify(distPackageJson, null, 4));
+
+function createShim(shimPath, targetPath) {
+ const shimDir = path.join(DIST, shimPath);
+ mkdirSync(shimDir, { recursive: true });
+ const cjsTargetPath = targetPath.replace('/esm/', '/cjs/').replace('.js', '.cjs');
+
+ // ESM shim (matches dist/type: module)
+ writeFileSync(
+ path.join(shimDir, 'index.js'),
+ [
+ `export * from '${targetPath.replace('.js', '')}';`,
+ // If some targets have a default export, optionally re-export it:
+ // `export { default } from '${targetPath.replace('.js', '')}';`,
+ '',
+ ].join('\n')
+ );
+
+ // Optional: CJS shim for deep require path consumers
+ writeFileSync(path.join(shimDir, 'index.cjs'), `module.exports = require('${cjsTargetPath}');`);
+
+ writeFileSync(
+ path.join(shimDir, 'index.d.ts'),
+ `export * from '${targetPath.replace('.js', '')}';`
+ );
+}
+
+shimConfigs.forEach((c) => createShim(c.shimPath, c.targetPath));
diff --git a/sdk/qrcode/scripts/shimConfigs.js b/sdk/qrcode/scripts/shimConfigs.js
new file mode 100644
index 000000000..6f75ef0b6
--- /dev/null
+++ b/sdk/qrcode/scripts/shimConfigs.js
@@ -0,0 +1,27 @@
+export const shimConfigs = [
+ {
+ shimPath: 'components/LED',
+ targetPath: '../../esm/components/LED.js',
+ name: 'components/LED',
+ },
+ {
+ shimPath: 'components/SelfQRcode',
+ targetPath: '../../esm/components/SelfQRcode.js',
+ name: 'components/SelfQRcode',
+ },
+ {
+ shimPath: 'utils/utils',
+ targetPath: '../../esm/utils/utils.js',
+ name: 'utils/utils',
+ },
+ {
+ shimPath: 'utils/styles',
+ targetPath: '../../esm/utils/styles.js',
+ name: 'utils/styles',
+ },
+ {
+ shimPath: 'utils/websocket',
+ targetPath: '../../esm/utils/websocket.js',
+ name: 'utils/websocket',
+ },
+];
diff --git a/sdk/qrcode/tsconfig.cjs.json b/sdk/qrcode/tsconfig.cjs.json
new file mode 100644
index 000000000..b5250564a
--- /dev/null
+++ b/sdk/qrcode/tsconfig.cjs.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "module": "CommonJS",
+ "outDir": "./dist/cjs",
+ "declaration": false,
+ "emitDeclarationOnly": false
+ }
+}
diff --git a/sdk/qrcode/tsup.config.ts b/sdk/qrcode/tsup.config.ts
index f3ad9abbc..b49f53b95 100644
--- a/sdk/qrcode/tsup.config.ts
+++ b/sdk/qrcode/tsup.config.ts
@@ -1,15 +1,63 @@
-import type { Options } from 'tsup';
+import path from 'path';
+import { defineConfig } from 'tsup';
+import { fileURLToPath } from 'url';
-const env = process.env.NODE_ENV;
+// Shared entry map to keep ESM/CJS builds in sync
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
-export const tsup: Options = {
- splitting: true,
- clean: true, // clean up the dist folder
- dts: true, // generate dts files
- format: ['cjs', 'esm'], // generate cjs and esm files
- skipNodeModulesBundle: true,
- entryPoints: ['index.ts', 'animations/**/*', 'components/**/*', 'utils/**/*'],
- watch: env === 'development',
- target: 'es2020',
- outDir: 'dist',
+const entries = {
+ index: 'index.ts',
+ 'components/LED': 'components/LED.tsx',
+ 'components/SelfQRcode': 'components/SelfQRcode.tsx',
+ 'utils/utils': 'utils/utils.ts',
+ 'utils/styles': 'utils/styles.ts',
+ 'utils/websocket': 'utils/websocket.ts',
};
+
+export default defineConfig([
+ {
+ tsconfig: './tsconfig.json',
+ entry: entries,
+ format: ['esm'],
+ outDir: path.resolve(__dirname, 'dist/esm'),
+ outExtension: ({ format }) => ({ js: format === 'cjs' ? '.cjs' : '.js' }),
+ dts: false,
+ splitting: false,
+ clean: true,
+ sourcemap: true,
+ target: 'es2020',
+ platform: 'neutral',
+ external: [
+ /^react/,
+ /^react-dom/,
+ /^react\/jsx-runtime$/,
+ /^lottie-react/,
+ /^qrcode.react/,
+ /^socket.io-client/,
+ /^node-forge/,
+ ],
+ },
+ {
+ tsconfig: './tsconfig.cjs.json',
+ entry: entries,
+ format: ['cjs'],
+ outDir: path.resolve(__dirname, 'dist/cjs'),
+ outExtension: ({ format }) => ({ js: format === 'cjs' ? '.cjs' : '.js' }),
+ dts: false,
+ splitting: false,
+ clean: false,
+ sourcemap: true,
+ target: 'es2020',
+ platform: 'neutral',
+ external: [
+ /^react/,
+ /^react-dom/,
+ /^react\/jsx-runtime$/,
+ /^lottie-react/,
+ /^qrcode.react/,
+ /^socket.io-client/,
+ /^node-forge/,
+ ],
+ },
+]);
diff --git a/sdk/qrcode/utils/styles.ts b/sdk/qrcode/utils/styles.ts
index c435d1c98..df025b1d3 100644
--- a/sdk/qrcode/utils/styles.ts
+++ b/sdk/qrcode/utils/styles.ts
@@ -17,4 +17,6 @@ const qrContainerStyle = (size: number): React.CSSProperties => ({
justifyContent: 'center',
});
-export { containerStyle, ledContainerStyle, qrContainerStyle };
+export { containerStyle };
+export { ledContainerStyle };
+export { qrContainerStyle };
diff --git a/sdk/qrcode/utils/websocket.ts b/sdk/qrcode/utils/websocket.ts
index bfadd4180..5f374436d 100644
--- a/sdk/qrcode/utils/websocket.ts
+++ b/sdk/qrcode/utils/websocket.ts
@@ -1,6 +1,8 @@
-import io, { Socket } from 'socket.io-client';
+import type { SelfApp } from '@selfxyz/common';
+import type { Socket } from 'socket.io-client';
+import { io } from 'socket.io-client';
+
import { QRcodeSteps } from './utils.js';
-import { SelfApp } from '@selfxyz/common/utils/appType';
export interface WebAppInfo {
appName: string;
@@ -12,19 +14,14 @@ export interface WebAppInfo {
console.log('[WebSocket] Initializing websocket module.');
const validateWebSocketUrl = (websocketUrl: string) => {
- if (
- websocketUrl.includes('localhost') ||
- websocketUrl.includes('127.0.0.1')
- ) {
+ if (websocketUrl.includes('localhost') || websocketUrl.includes('127.0.0.1')) {
throw new Error('localhost websocket URLs are not allowed');
}
};
const newSocket = (websocketUrl: string, sessionId: string) => {
const fullUrl = `${websocketUrl}/websocket`;
- console.log(
- `[WebSocket] Creating new socket. URL: ${fullUrl}, sessionId: ${sessionId}`,
- );
+ console.log(`[WebSocket] Creating new socket. URL: ${fullUrl}, sessionId: ${sessionId}`);
return io(fullUrl, {
path: '/',
query: { sessionId, clientType: 'web' },
@@ -40,20 +37,15 @@ const handleWebSocketMessage =
type: 'websocket' | 'deeplink',
setProofStep: (step: number) => void,
onSuccess: () => void,
- onError: (data: { error_code?: string; reason?: string }) => void,
+ onError: (data: { error_code?: string; reason?: string }) => void
) =>
- async (data: any) => {
- console.log(
- '[WebSocket] Received mobile status:',
- data.status,
- 'for session:',
- sessionId,
- );
+ async (data: { status: string; error_code?: string; reason?: string }) => {
+ console.log('[WebSocket] Received mobile status:', data.status, 'for session:', sessionId);
switch (data.status) {
case 'mobile_connected':
console.log(
'[WebSocket] Mobile device connected. Emitting self_app event with payload:',
- selfApp,
+ selfApp
);
setProofStep(QRcodeSteps.MOBILE_CONNECTED);
if (type === 'websocket') {
@@ -95,26 +87,24 @@ export function initWebSocket(
type: 'websocket' | 'deeplink',
setProofStep: (step: number) => void,
onSuccess: () => void,
- onError: (data: { error_code?: string; reason?: string }) => void,
+ onError: (data: { error_code?: string; reason?: string }) => void
) {
validateWebSocketUrl(websocketUrl);
const sessionId = selfApp.sessionId;
- console.log(
- `[WebSocket] Initializing WebSocket connection for sessionId: ${sessionId}`,
- );
+ console.log(`[WebSocket] Initializing WebSocket connection for sessionId: ${sessionId}`);
const socket = newSocket(websocketUrl, sessionId);
socket.on('connect', () => {
console.log(
- `[WebSocket] Connected with id: ${socket.id}, transport: ${socket.io.engine.transport.name}`,
+ `[WebSocket] Connected with id: ${socket.id}, transport: ${socket.io.engine.transport.name}`
);
});
- socket.on('connect_error', error => {
+ socket.on('connect_error', (error) => {
console.error('[WebSocket] Connection error:', error);
});
- socket.on('mobile_status', data => {
+ socket.on('mobile_status', (data) => {
console.log('[WebSocket] Raw mobile_status event received:', data);
handleWebSocketMessage(
socket,
@@ -123,20 +113,18 @@ export function initWebSocket(
type,
setProofStep,
onSuccess,
- onError,
+ onError
)(data);
});
socket.on('disconnect', (reason: string) => {
console.log(
- `[WebSocket] Disconnected. Reason: ${reason}, Last transport: ${socket.io.engine.transport?.name}`,
+ `[WebSocket] Disconnected. Reason: ${reason}, Last transport: ${socket.io.engine.transport?.name}`
);
});
return () => {
- console.log(
- `[WebSocket] Cleaning up connection for sessionId: ${sessionId}`,
- );
+ console.log(`[WebSocket] Cleaning up connection for sessionId: ${sessionId}`);
if (socket) {
socket.disconnect();
}
diff --git a/yarn.lock b/yarn.lock
index d8b93dbbc..6669255e4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5074,6 +5074,15 @@ __metadata:
"@types/react": "npm:^18.3.4"
"@types/react-dom": "npm:^18.3.0"
"@types/uuid": "npm:^10.0.0"
+ "@typescript-eslint/eslint-plugin": "npm:^8.0.0"
+ "@typescript-eslint/parser": "npm:^8.0.0"
+ eslint: "npm:^8.57.0"
+ eslint-config-prettier: "npm:^9.1.0"
+ eslint-import-resolver-typescript: "npm:^4.4.4"
+ eslint-plugin-import: "npm:^2.29.1"
+ eslint-plugin-prettier: "npm:^5.1.3"
+ eslint-plugin-simple-import-sort: "npm:^12.1.1"
+ eslint-plugin-sort-exports: "npm:^0.9.1"
js-sha1: "npm:^0.7.0"
js-sha256: "npm:^0.11.0"
js-sha512: "npm:^0.9.0"
@@ -9928,6 +9937,27 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/eslint-plugin@npm:^8.0.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/eslint-plugin@npm:8.39.0"
+ dependencies:
+ "@eslint-community/regexpp": "npm:^4.10.0"
+ "@typescript-eslint/scope-manager": "npm:8.39.0"
+ "@typescript-eslint/type-utils": "npm:8.39.0"
+ "@typescript-eslint/utils": "npm:8.39.0"
+ "@typescript-eslint/visitor-keys": "npm:8.39.0"
+ graphemer: "npm:^1.4.0"
+ ignore: "npm:^7.0.0"
+ natural-compare: "npm:^1.4.0"
+ ts-api-utils: "npm:^2.1.0"
+ peerDependencies:
+ "@typescript-eslint/parser": ^8.39.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/c735a99622e2a4a95d89fa02cc47e65279f61972a68b62f58c32a384e766473289b6234cdaa34b5caa9372d4bdf1b22ad34b45feada482c4ed7320784fa19312
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/parser@npm:^7.0.0, @typescript-eslint/parser@npm:^7.1.1, @typescript-eslint/parser@npm:^7.18.0":
version: 7.18.0
resolution: "@typescript-eslint/parser@npm:7.18.0"
@@ -9946,6 +9976,22 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/parser@npm:^8.0.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/parser@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/scope-manager": "npm:8.39.0"
+ "@typescript-eslint/types": "npm:8.39.0"
+ "@typescript-eslint/typescript-estree": "npm:8.39.0"
+ "@typescript-eslint/visitor-keys": "npm:8.39.0"
+ debug: "npm:^4.3.4"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/cb437362ea80303e728eccada1ba630769e90d863471d2cb65abbeda540679f93a566bb4ecdcd3aca39c01f48f865a70aed3e94fbaacc6a81e79bb804c596f0b
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/project-service@npm:8.34.1":
version: 8.34.1
resolution: "@typescript-eslint/project-service@npm:8.34.1"
@@ -9959,6 +10005,19 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/project-service@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/project-service@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/tsconfig-utils": "npm:^8.39.0"
+ "@typescript-eslint/types": "npm:^8.39.0"
+ debug: "npm:^4.3.4"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/67ac21bcc715d8e3281b8cab36a7e285b01244a48817ea74910186e76e714918dd2e939b465d0e4e9a30c4ceffa6c8946eb9b1f0ec0dab6708c4416d3a66e731
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/scope-manager@npm:5.62.0":
version: 5.62.0
resolution: "@typescript-eslint/scope-manager@npm:5.62.0"
@@ -9989,6 +10048,16 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/scope-manager@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/scope-manager@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.39.0"
+ "@typescript-eslint/visitor-keys": "npm:8.39.0"
+ checksum: 10c0/ae61721e85fa67f64cab02db88599a6e78e9395dd13c211ab60c5728abdf01b9ceb970c0722671d1958e83c8f00a8ee4f9b3a5c462ea21fb117729b73d53a7e7
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/tsconfig-utils@npm:8.34.1, @typescript-eslint/tsconfig-utils@npm:^8.34.1":
version: 8.34.1
resolution: "@typescript-eslint/tsconfig-utils@npm:8.34.1"
@@ -9998,6 +10067,15 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/tsconfig-utils@npm:8.39.0, @typescript-eslint/tsconfig-utils@npm:^8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/tsconfig-utils@npm:8.39.0"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/1437c0004d4d852128c72559232470e82c9b9635156c6d8eec7be7c5b08c01e9528cda736587bdaba0d5c71f2f5480855c406f224eab45ba81c6850210280fc3
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/type-utils@npm:7.18.0":
version: 7.18.0
resolution: "@typescript-eslint/type-utils@npm:7.18.0"
@@ -10015,6 +10093,22 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/type-utils@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/type-utils@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.39.0"
+ "@typescript-eslint/typescript-estree": "npm:8.39.0"
+ "@typescript-eslint/utils": "npm:8.39.0"
+ debug: "npm:^4.3.4"
+ ts-api-utils: "npm:^2.1.0"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/918de86cc99e90a74a02ee5dfe26f0d7a22872ac00d84e59630a15f50fa9688c2db545c8bf26ba8923c72a74c09386b994d0b7da3dac4104da4ca8c80b4353ac
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/types@npm:5.62.0":
version: 5.62.0
resolution: "@typescript-eslint/types@npm:5.62.0"
@@ -10036,6 +10130,13 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/types@npm:8.39.0, @typescript-eslint/types@npm:^8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/types@npm:8.39.0"
+ checksum: 10c0/4240b01b218f3ef8a4f6343cb78cd531c12b2a134b6edd6ab67a9de4d1808790bc468f7579d5d38e507a206457d14a5e8970f6f74d29b9858633f77258f7e43b
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/typescript-estree@npm:5.62.0":
version: 5.62.0
resolution: "@typescript-eslint/typescript-estree@npm:5.62.0"
@@ -10093,6 +10194,26 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/typescript-estree@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/typescript-estree@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/project-service": "npm:8.39.0"
+ "@typescript-eslint/tsconfig-utils": "npm:8.39.0"
+ "@typescript-eslint/types": "npm:8.39.0"
+ "@typescript-eslint/visitor-keys": "npm:8.39.0"
+ debug: "npm:^4.3.4"
+ fast-glob: "npm:^3.3.2"
+ is-glob: "npm:^4.0.3"
+ minimatch: "npm:^9.0.4"
+ semver: "npm:^7.6.0"
+ ts-api-utils: "npm:^2.1.0"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/9eaf44af35b7bd8a8298909c0b2153f4c69e582b86f84dbe4a58c6afb6496253e955ee2b6ff0517e7717a6e8557537035ce631e0aa10fa848354a15620c387d2
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/utils@npm:7.18.0":
version: 7.18.0
resolution: "@typescript-eslint/utils@npm:7.18.0"
@@ -10107,6 +10228,21 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/utils@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/utils@npm:8.39.0"
+ dependencies:
+ "@eslint-community/eslint-utils": "npm:^4.7.0"
+ "@typescript-eslint/scope-manager": "npm:8.39.0"
+ "@typescript-eslint/types": "npm:8.39.0"
+ "@typescript-eslint/typescript-estree": "npm:8.39.0"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/61956004dea90835b9f8de581019bc4f360dd44cebb9e0f8014ede39fc7cbc71d7d0093a65547bea004a865a1eff81dfd822520ba0a37e636f359291c27e1bd2
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/utils@npm:^5.10.0":
version: 5.62.0
resolution: "@typescript-eslint/utils@npm:5.62.0"
@@ -10170,6 +10306,16 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/visitor-keys@npm:8.39.0":
+ version: 8.39.0
+ resolution: "@typescript-eslint/visitor-keys@npm:8.39.0"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.39.0"
+ eslint-visitor-keys: "npm:^4.2.1"
+ checksum: 10c0/657766d4e9ad01e8fd8e8fd39f8f3d043ecdffb78f1ab9653acbed3c971e221b1f680e90752394308c532703211f9f441bb449f62c0f61a48750b24ccb4379ef
+ languageName: node
+ linkType: hard
+
"@ungap/structured-clone@npm:^1.2.0":
version: 1.3.0
resolution: "@ungap/structured-clone@npm:1.3.0"
@@ -14492,6 +14638,21 @@ __metadata:
languageName: node
linkType: hard
+"eslint-import-context@npm:^0.1.8":
+ version: 0.1.9
+ resolution: "eslint-import-context@npm:0.1.9"
+ dependencies:
+ get-tsconfig: "npm:^4.10.1"
+ stable-hash-x: "npm:^0.2.0"
+ peerDependencies:
+ unrs-resolver: ^1.0.0
+ peerDependenciesMeta:
+ unrs-resolver:
+ optional: true
+ checksum: 10c0/07851103443b70af681c5988e2702e681ff9b956e055e11d4bd9b2322847fa0d9e8da50c18fc7cb1165106b043f34fbd0384d7011c239465c4645c52132e56f3
+ languageName: node
+ linkType: hard
+
"eslint-import-resolver-node@npm:^0.3.9":
version: 0.3.9
resolution: "eslint-import-resolver-node@npm:0.3.9"
@@ -14527,6 +14688,30 @@ __metadata:
languageName: node
linkType: hard
+"eslint-import-resolver-typescript@npm:^4.4.4":
+ version: 4.4.4
+ resolution: "eslint-import-resolver-typescript@npm:4.4.4"
+ dependencies:
+ debug: "npm:^4.4.1"
+ eslint-import-context: "npm:^0.1.8"
+ get-tsconfig: "npm:^4.10.1"
+ is-bun-module: "npm:^2.0.0"
+ stable-hash-x: "npm:^0.2.0"
+ tinyglobby: "npm:^0.2.14"
+ unrs-resolver: "npm:^1.7.11"
+ peerDependencies:
+ eslint: "*"
+ eslint-plugin-import: "*"
+ eslint-plugin-import-x: "*"
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+ checksum: 10c0/3bf8ad77c21660f77a0e455555ab179420f68ae7a132906c85a217ccce51cb6680cf70027cab32a358d193e5b9e476f6ba2e595585242aa97d4f6435ca22104e
+ languageName: node
+ linkType: hard
+
"eslint-module-utils@npm:^2.12.1":
version: 2.12.1
resolution: "eslint-module-utils@npm:2.12.1"
@@ -16100,7 +16285,7 @@ __metadata:
languageName: node
linkType: hard
-"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.7.5":
+"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.7.5":
version: 4.10.1
resolution: "get-tsconfig@npm:4.10.1"
dependencies:
@@ -16857,6 +17042,13 @@ __metadata:
languageName: node
linkType: hard
+"ignore@npm:^7.0.0":
+ version: 7.0.5
+ resolution: "ignore@npm:7.0.5"
+ checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d
+ languageName: node
+ linkType: hard
+
"image-size@npm:^1.0.2":
version: 1.2.1
resolution: "image-size@npm:1.2.1"
@@ -23683,6 +23875,13 @@ __metadata:
languageName: node
linkType: hard
+"stable-hash-x@npm:^0.2.0":
+ version: 0.2.0
+ resolution: "stable-hash-x@npm:0.2.0"
+ checksum: 10c0/c757df58366ee4bb266a9486b8932eab7c1ba730469eaf4b68d2dee404814e9f84089c44c9b5205f8c7d99a0ab036cce2af69139ce5ed44b635923c011a8aea8
+ languageName: node
+ linkType: hard
+
"stable-hash@npm:^0.0.5":
version: 0.0.5
resolution: "stable-hash@npm:0.0.5"
@@ -25411,7 +25610,7 @@ __metadata:
languageName: node
linkType: hard
-"unrs-resolver@npm:^1.6.2":
+"unrs-resolver@npm:^1.6.2, unrs-resolver@npm:^1.7.11":
version: 1.11.1
resolution: "unrs-resolver@npm:1.11.1"
dependencies: