From 8b65eb2e4ca7039b52c0387bce039acc9622c495 Mon Sep 17 00:00:00 2001 From: Sven Mitt Date: Wed, 25 Mar 2026 09:26:15 +0200 Subject: [PATCH 1/2] build: export Error classes, add barrel file support to rollup WE2-1179 Signed-off-by: Sven Mitt --- README.md | 54 ++++- package-lock.json | 286 +++++++++++++++++------ package.json | 3 +- rollup.config.mjs | 4 + src/config.ts | 2 +- src/errors/ActionPendingError.ts | 3 +- src/errors/IntegrationError.ts | 27 +++ src/errors/MissingParameterError.ts | 3 +- src/errors/NativeInvalidArgumentError.ts | 3 +- src/errors/index.ts | 8 +- src/web-eid.ts | 28 ++- 11 files changed, 331 insertions(+), 90 deletions(-) create mode 100644 src/errors/IntegrationError.ts diff --git a/README.md b/README.md index aa7234c..266a1d0 100644 --- a/README.md +++ b/README.md @@ -745,7 +745,57 @@ Errors returned by the library have a `code` property which contains the program To avoid typos, you can use the `ErrorCode` enum to refer to the codes. **Example** +The `examples` directory contains fully working applications demonstrating authentication and digital signing. + +There is two approaches to handle errors: ```ts +// by Error instance +const onLogin = async () => { + setLoading(true) + setAlert(undefined) + + try { + await loginWithIdCard() + navigate('/sign') + } catch (error) { + if (error instanceof UserTimeoutError) { + setAlert("ID-card authentication timed out, please try again"); + } else if (error instanceof UserCancelledError) { + setAlert("ID-card authentication was cancelled by the user"); + } else if (error instanceof ExtensionUnavailableError) { + setAlert("Web eID browser extension is not available, please install it or enable it to continue"); + } else if (error instanceof NativeUnavailableError) { + setAlert("Web eID native application is not installed, please install it to continue"); + } else if (error instanceof VersionInvalidError) { + setAlert("Web eID native application did not provide a valid version string during handshake, please report a bug"); + } else if (error instanceof VersionMismatchError) { + if (error.requiresUpdate?.extension) { + setAlert("Please update the Web eID browser extension"); + } else if (error.requiresUpdate?.nativeApp) { + setAlert("Please update the Web eID native application"); + } else { + setAlert("Please update the Web eID native application and browser extension"); + } + } else if (error instanceof ContextInsecureError) { + setAlert("Web eID requires a secure HTTPS connection. Please contact the website administrator"); + } else if (error instanceof NativeFatalError) { + setAlert("Please try again. If the problem persists, contact support"); + } else if (error instanceof IntegrationError) { + setAlert(`An internal error occurred. Please contact support! ${error.message} (${error.code})`); + } else if (error instanceof UnknownError) { + setAlert(`An unknown error occurred. Please try again and contact support if the problem persists! ${error.message} (${error.code})`); + } else { + const errorMessage = error instanceof Error ? error.message : String(error); + const errorCode = isKnownWebEidError(error) ? ` (${(error as any).code})` : ""; + setAlert(`An unknown error occurred. Please try again and contact support if the problem persists! ${errorMessage}${errorCode}`); + } + + } finally { + setLoading(false) + } +} + +// Or by Error.code try { const { certificate, @@ -760,9 +810,9 @@ try { showError("Signing certificate retrieval timed out, please try again!"); break; } - + // other cases - + default: { showError( "An unknown error occurred. " + diff --git a/package-lock.json b/package-lock.json index 176124a..eb79a0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "@web-eid/web-eid-library", - "version": "2.1.0-beta.1", + "version": "2.1.0-beta.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@web-eid/web-eid-library", - "version": "2.1.0-beta.1", + "version": "2.1.0-beta.2", "license": "MIT", "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", "@stylistic/eslint-plugin": "^5.9.0", "@types/jest": "^29.5.14", @@ -1272,10 +1273,11 @@ } }, "node_modules/@jest/environment-jsdom-abstract/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1592,6 +1594,31 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-terser": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", @@ -1614,6 +1641,49 @@ } } }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", @@ -2040,9 +2110,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -2180,6 +2250,13 @@ "undici-types": "~6.20.0" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -2399,9 +2476,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -2734,9 +2811,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -3537,9 +3614,9 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -3673,9 +3750,9 @@ "license": "ISC" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3925,6 +4002,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4428,10 +4512,11 @@ } }, "node_modules/jest-environment-jsdom/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -5480,9 +5565,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -5765,16 +5850,16 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/rimraf/node_modules/glob": { @@ -5925,9 +6010,9 @@ } }, "node_modules/rollup-plugin-license/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "optional": true, @@ -5986,10 +6071,11 @@ } }, "node_modules/serialize-javascript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", - "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=20.0.0" } @@ -6356,9 +6442,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -7716,9 +7802,9 @@ } }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true }, "pretty-format": { @@ -7959,6 +8045,19 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@rollup/plugin-node-resolve": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz", + "integrity": "sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, "@rollup/plugin-terser": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz", @@ -7970,6 +8069,31 @@ "terser": "^5.17.4" } }, + "@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true + } + } + }, "@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", @@ -8196,9 +8320,9 @@ "dev": true }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true } } @@ -8319,6 +8443,12 @@ "undici-types": "~6.20.0" } }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -8448,9 +8578,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -8675,9 +8805,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -9203,9 +9333,9 @@ } }, "flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true }, "fs.realpath": { @@ -9287,9 +9417,9 @@ "dev": true }, "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -9454,6 +9584,12 @@ "is-extglob": "^2.1.1" } }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9805,9 +9941,9 @@ } }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true }, "pretty-format": { @@ -10576,9 +10712,9 @@ "dev": true }, "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true }, "pirates": { @@ -10754,9 +10890,9 @@ } }, "brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "requires": { "balanced-match": "^4.0.2" @@ -10862,9 +10998,9 @@ } }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "optional": true, "peer": true @@ -10908,9 +11044,9 @@ "dev": true }, "serialize-javascript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", - "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "dev": true }, "shebang-command": { @@ -11172,9 +11308,9 @@ "requires": {} }, "picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true } } diff --git a/package.json b/package.json index b5e8596..49b4216 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@web-eid/web-eid-library", - "version": "2.1.0-beta.1", + "version": "2.1.0-beta.2", "description": "", "scripts": { "lint": "eslint", @@ -77,6 +77,7 @@ "author": "Tanel Metsar", "license": "MIT", "devDependencies": { + "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", "@stylistic/eslint-plugin": "^5.9.0", "@types/jest": "^29.5.14", diff --git a/rollup.config.mjs b/rollup.config.mjs index 9905f93..04b5387 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -2,6 +2,7 @@ import path from "path"; import cleanup from "rollup-plugin-cleanup"; import license from "rollup-plugin-license"; +import resolve from "@rollup/plugin-node-resolve"; import terser from "@rollup/plugin-terser"; export default { @@ -17,6 +18,9 @@ export default { }, }, }), + resolve({ + extensions: [".js"], + }), ], output: [ diff --git a/src/config.ts b/src/config.ts index b258c51..742299f 100644 --- a/src/config.ts +++ b/src/config.ts @@ -21,7 +21,7 @@ */ export default Object.freeze({ - VERSION: "2.1.0-beta.1", + VERSION: "2.1.0-beta.2", EXTENSION_HANDSHAKE_TIMEOUT: 1000, // 1 second NATIVE_APP_HANDSHAKE_TIMEOUT: 5 * 1000, // 5 seconds DEFAULT_USER_INTERACTION_TIMEOUT: 2 * 60 * 1000, // 2 minutes diff --git a/src/errors/ActionPendingError.ts b/src/errors/ActionPendingError.ts index e7ad5f9..35a2506 100644 --- a/src/errors/ActionPendingError.ts +++ b/src/errors/ActionPendingError.ts @@ -21,8 +21,9 @@ */ import ErrorCode from "./ErrorCode"; +import IntegrationError from "./IntegrationError"; -export default class ActionPendingError extends Error { +export default class ActionPendingError extends IntegrationError { public code: ErrorCode; constructor(message = "same action for Web-eID browser extension is already pending") { diff --git a/src/errors/IntegrationError.ts b/src/errors/IntegrationError.ts new file mode 100644 index 0000000..da5e3b1 --- /dev/null +++ b/src/errors/IntegrationError.ts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2020-2026 Estonian Information System Authority + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export default class IntegrationError extends Error { + constructor(message?: string) { + super(message); + } +} diff --git a/src/errors/MissingParameterError.ts b/src/errors/MissingParameterError.ts index 01be9a3..b79a747 100644 --- a/src/errors/MissingParameterError.ts +++ b/src/errors/MissingParameterError.ts @@ -21,8 +21,9 @@ */ import ErrorCode from "./ErrorCode"; +import IntegrationError from "./IntegrationError"; -export default class MissingParameterError extends Error { +export default class MissingParameterError extends IntegrationError { public code: ErrorCode; constructor(message?: string) { diff --git a/src/errors/NativeInvalidArgumentError.ts b/src/errors/NativeInvalidArgumentError.ts index 4decd80..5f9266f 100644 --- a/src/errors/NativeInvalidArgumentError.ts +++ b/src/errors/NativeInvalidArgumentError.ts @@ -21,8 +21,9 @@ */ import ErrorCode from "./ErrorCode"; +import IntegrationError from "./IntegrationError"; -export default class NativeInvalidArgumentError extends Error { +export default class NativeInvalidArgumentError extends IntegrationError { public code: ErrorCode; constructor(message = "native application received an invalid argument") { diff --git a/src/errors/index.ts b/src/errors/index.ts index db8d8e5..a8334ec 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,10 +1,8 @@ -import ActionPendingError from './ActionPendingError'; import ActionTimeoutError from './ActionTimeoutError'; import ContextInsecureError from './ContextInsecureError'; import ExtensionUnavailableError from './ExtensionUnavailableError'; -import MissingParameterError from './MissingParameterError'; +import IntegrationError from './IntegrationError'; import NativeFatalError from './NativeFatalError'; -import NativeInvalidArgumentError from './NativeInvalidArgumentError'; import NativeUnavailableError from './NativeUnavailableError'; import UnknownError from './UnknownError'; import UserCancelledError from './UserCancelledError'; @@ -13,13 +11,11 @@ import VersionInvalidError from './VersionInvalidError'; import VersionMismatchError from './VersionMismatchError'; export { - ActionPendingError, ActionTimeoutError, ContextInsecureError, ExtensionUnavailableError, - MissingParameterError, + IntegrationError, NativeFatalError, - NativeInvalidArgumentError, NativeUnavailableError, UnknownError, UserCancelledError, diff --git a/src/web-eid.ts b/src/web-eid.ts index 44c715d..4c06439 100644 --- a/src/web-eid.ts +++ b/src/web-eid.ts @@ -43,6 +43,19 @@ import Action from "./models/Action"; import ActionOptions from "./models/ActionOptions"; import ErrorCode from "./errors/ErrorCode"; import MissingParameterError from "./errors/MissingParameterError"; +import { + ActionTimeoutError, + ContextInsecureError, + ExtensionUnavailableError, + IntegrationError, + NativeFatalError, + NativeUnavailableError, + UnknownError, + UserCancelledError, + UserTimeoutError, + VersionInvalidError, + VersionMismatchError, +} from "./errors"; import WebExtensionService from "./services/WebExtensionService"; import config from "./config"; import sleep from "./utils/sleep"; @@ -206,11 +219,22 @@ export async function sign( export { Action, - ErrorCode, ActionOptions, + ActionTimeoutError, + ContextInsecureError, + ErrorCode, + ExtensionUnavailableError, + IntegrationError, LibraryAuthenticateResponse, LibraryGetSigningCertificateResponse, LibrarySignResponse, - LibraryStatusResponse + LibraryStatusResponse, + NativeFatalError, + NativeUnavailableError, + UnknownError, + UserCancelledError, + UserTimeoutError, + VersionInvalidError, + VersionMismatchError, }; export { config }; From 6856dbef028234915f8f38d588dc9c0e48cc842c Mon Sep 17 00:00:00 2001 From: Sven Mitt Date: Wed, 1 Apr 2026 12:41:37 +0300 Subject: [PATCH 2/2] chore: fix stylistic rules to eslint config WE2-1179 Signed-off-by: Sven Mitt --- .editorconfig | 3 +- eslint.config.mjs | 18 +++++++-- src/errors/KnownErrorConstructors.ts | 2 +- src/errors/index.ts | 42 ++++++++++----------- src/models/index.ts | 4 +- src/utils/__tests__/errorSerializer-test.ts | 4 +- src/web-eid.ts | 2 +- 7 files changed, 42 insertions(+), 33 deletions(-) diff --git a/.editorconfig b/.editorconfig index 5f9ce88..4fa16a7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,7 +7,8 @@ indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true -max_line_length = 120 +max_line_length = 160 +quote_type = double [*.md] trim_trailing_whitespace = false diff --git a/eslint.config.mjs b/eslint.config.mjs index 02c76d6..a62a4ca 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -53,13 +53,16 @@ const overrides = { rules: { "sort-imports": ["error", { allowSeparatedGroups: true }], - "@stylistic/js/quotes": "error", + "@stylistic/js/quotes": ["error", "double"], "@stylistic/js/key-spacing": ["error", { "align": "value" }], "@stylistic/js/comma-dangle": ["error", "always-multiline"], "@stylistic/js/object-curly-spacing": ["error", "always"], "@stylistic/js/array-bracket-spacing": "error", "@stylistic/js/indent": ["error", 2, { "SwitchCase": 1 }], "@stylistic/js/semi": "error", + "@stylistic/js/eol-last": ["warn", "always"], + "@stylistic/js/linebreak-style": ["error", "unix"], + "@stylistic/js/max-len": ["error", { code: 160 }], }, }, @@ -74,14 +77,21 @@ const overrides = { }, rules: { - "@typescript-eslint/array-type": ["error", { default: "generic" }], - "@stylistic/ts/semi": "error", + "@typescript-eslint/array-type": ["error", { default: "generic" }], + "@stylistic/ts/semi": "error", + "@stylistic/ts/quotes": ["error", "double"], + "@stylistic/ts/comma-dangle": ["error", "always-multiline"], + "@stylistic/ts/object-curly-spacing": ["error", "always"], + "@stylistic/ts/indent": ["error", 2, { "SwitchCase": 1 }], + "@stylistic/ts/eol-last": ["error", "always"], + "@stylistic/ts/linebreak-style": ["error", "unix"], + "@stylistic/ts/max-len": ["error", { code: 160 }], }, }, }; export default [ - { ignores: ["dist/", "node_modules/"] }, + { ignores: ["dist/", "node_modules/", "examples/"] }, { name: "eslint/recommended", diff --git a/src/errors/KnownErrorConstructors.ts b/src/errors/KnownErrorConstructors.ts index 9027e64..4573512 100644 --- a/src/errors/KnownErrorConstructors.ts +++ b/src/errors/KnownErrorConstructors.ts @@ -49,4 +49,4 @@ type KnownErrorConstructors | typeof VersionMismatchError | typeof UnknownError; -export default KnownErrorConstructors; \ No newline at end of file +export default KnownErrorConstructors; diff --git a/src/errors/index.ts b/src/errors/index.ts index a8334ec..9166839 100644 --- a/src/errors/index.ts +++ b/src/errors/index.ts @@ -1,25 +1,25 @@ -import ActionTimeoutError from './ActionTimeoutError'; -import ContextInsecureError from './ContextInsecureError'; -import ExtensionUnavailableError from './ExtensionUnavailableError'; -import IntegrationError from './IntegrationError'; -import NativeFatalError from './NativeFatalError'; -import NativeUnavailableError from './NativeUnavailableError'; -import UnknownError from './UnknownError'; -import UserCancelledError from './UserCancelledError'; -import UserTimeoutError from './UserTimeoutError'; -import VersionInvalidError from './VersionInvalidError'; -import VersionMismatchError from './VersionMismatchError'; +import ActionTimeoutError from "./ActionTimeoutError"; +import ContextInsecureError from "./ContextInsecureError"; +import ExtensionUnavailableError from "./ExtensionUnavailableError"; +import IntegrationError from "./IntegrationError"; +import NativeFatalError from "./NativeFatalError"; +import NativeUnavailableError from "./NativeUnavailableError"; +import UnknownError from "./UnknownError"; +import UserCancelledError from "./UserCancelledError"; +import UserTimeoutError from "./UserTimeoutError"; +import VersionInvalidError from "./VersionInvalidError"; +import VersionMismatchError from "./VersionMismatchError"; export { - ActionTimeoutError, - ContextInsecureError, - ExtensionUnavailableError, + ActionTimeoutError, + ContextInsecureError, + ExtensionUnavailableError, IntegrationError, - NativeFatalError, - NativeUnavailableError, - UnknownError, - UserCancelledError, - UserTimeoutError, - VersionInvalidError, - VersionMismatchError, + NativeFatalError, + NativeUnavailableError, + UnknownError, + UserCancelledError, + UserTimeoutError, + VersionInvalidError, + VersionMismatchError, }; diff --git a/src/models/index.ts b/src/models/index.ts index f6f3bc1..c70d6c3 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -1,5 +1,3 @@ import { default as ActionOptions } from "./ActionOptions"; -export { - ActionOptions -}; +export { ActionOptions }; diff --git a/src/utils/__tests__/errorSerializer-test.ts b/src/utils/__tests__/errorSerializer-test.ts index 4f7f5ef..34063b4 100644 --- a/src/utils/__tests__/errorSerializer-test.ts +++ b/src/utils/__tests__/errorSerializer-test.ts @@ -22,7 +22,7 @@ import { serializeError, - deserializeError + deserializeError, } from ".././errorSerializer"; import ActionPendingError from "../../errors/ActionPendingError"; @@ -184,7 +184,7 @@ describe("errorSerializer", () => { const originalError = new VersionMismatchError( "Update required for native app", versions, - requiresUpdate + requiresUpdate, ); const serialized = serializeError(originalError); diff --git a/src/web-eid.ts b/src/web-eid.ts index 4c06439..3b0c091 100644 --- a/src/web-eid.ts +++ b/src/web-eid.ts @@ -104,7 +104,7 @@ export async function status(): Promise { export async function authenticate( challengeNonce: string, - options?: ActionOptions + options?: ActionOptions, ): Promise { await extensionLoadDelay();