diff --git a/packages/customWidgets/signature-web/CHANGELOG.md b/packages/customWidgets/signature-web/CHANGELOG.md index ca69414171..5abd3fc2bd 100644 --- a/packages/customWidgets/signature-web/CHANGELOG.md +++ b/packages/customWidgets/signature-web/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Added + +- We added a license file and a readme documenting all open source dependencies used in this package. + ## [1.0.7] - 2025-01-15 ### Changed diff --git a/packages/customWidgets/signature-web/dependencies.json b/packages/customWidgets/signature-web/dependencies.json new file mode 100644 index 0000000000..02109ab171 --- /dev/null +++ b/packages/customWidgets/signature-web/dependencies.json @@ -0,0 +1 @@ +[{ "classnames": { "version": "2.5.1", "url": null } }, { "signature_pad": { "version": "4.0.0", "url": null } }] diff --git a/packages/customWidgets/signature-web/dependencies.txt b/packages/customWidgets/signature-web/dependencies.txt new file mode 100644 index 0000000000..518002b148 --- /dev/null +++ b/packages/customWidgets/signature-web/dependencies.txt @@ -0,0 +1,67 @@ +Name: classnames +Version: 2.5.1 +License: MIT +Private: false +Description: A simple utility for conditionally joining classNames together +Repository: git+https://github.com/JedWatson/classnames.git +Author: Jed Watson +Homepage: https://github.com/JedWatson/classnames#readme +License Copyright: +=== + +The MIT License (MIT) + +Copyright (c) 2018 Jed Watson + +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. + +--- + +Name: signature_pad +Version: 4.0.0 +License: MIT +Private: false +Description: Library for drawing smooth signatures. +Repository: git+https://github.com/szimek/signature_pad.git +Author: Szymon Nowak (https://github.com/szimek) +Homepage: https://github.com/szimek/signature_pad +License Copyright: +=== + +MIT License + +Copyright (c) 2018 Szymon Nowak + +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. diff --git a/packages/customWidgets/signature-web/package.json b/packages/customWidgets/signature-web/package.json index fc6557ddce..6c731feef2 100644 --- a/packages/customWidgets/signature-web/package.json +++ b/packages/customWidgets/signature-web/package.json @@ -1,7 +1,7 @@ { "name": "@mendix/signature-web", "widgetName": "Signature", - "version": "1.0.7", + "version": "1.0.8", "description": "A signature pad for capturing signatures", "copyright": "© Mendix Technology BV 2025. All rights reserved.", "license": "Apache-2.0", @@ -37,8 +37,7 @@ }, "dependencies": { "classnames": "^2.5.1", - "react-resize-detector": "^9.1.1", - "signature_pad": "4.0.0" + "signature_pad": "5.1.3" }, "devDependencies": { "@mendix/automation-utils": "workspace:*", diff --git a/packages/customWidgets/signature-web/scripts/generate-dependencies.js b/packages/customWidgets/signature-web/scripts/generate-dependencies.js new file mode 100755 index 0000000000..d094ec90a5 --- /dev/null +++ b/packages/customWidgets/signature-web/scripts/generate-dependencies.js @@ -0,0 +1,268 @@ +#!/usr/bin/env node + +const { execSync } = require("child_process"); +const fs = require("fs"); +const path = require("path"); + +/** + * Generate dependencies.json and dependencies.txt from package.json using pnpm to get actual installed versions + * + * Usage: node generate-dependencies.js [path-to-package.json] + */ + +function getPackageJsonPath() { + const arg = process.argv[2]; + if (arg) { + return path.resolve(arg); + } + // Default to package.json in current directory + return path.resolve(process.cwd(), "package.json"); +} + +function readPackageJson(packageJsonPath) { + if (!fs.existsSync(packageJsonPath)) { + console.error(`Error: package.json not found at ${packageJsonPath}`); + process.exit(1); + } + + try { + const content = fs.readFileSync(packageJsonPath, "utf8"); + return JSON.parse(content); + } catch (error) { + console.error(`Error reading or parsing package.json: ${error.message}`); + process.exit(1); + } +} + +function getInstalledVersion(packageName, packageDir) { + try { + // Use pnpm list to get the actual installed version + // --depth 0 to only show direct dependencies + // --json for parseable output + const output = execSync(`pnpm list "${packageName}" --depth 0 --json`, { + cwd: packageDir, + encoding: "utf8", + stdio: ["pipe", "pipe", "pipe"] + }); + + const result = JSON.parse(output); + + // pnpm list returns an array of project results + if (Array.isArray(result) && result.length > 0) { + const dependencies = result[0].dependencies || {}; + if (dependencies[packageName]) { + const version = dependencies[packageName].version; + // Remove any leading 'v' if present + return version.replace(/^v/, ""); + } + } + + return null; + } catch (error) { + // If pnpm list fails, try reading from node_modules + try { + const nodeModulesPath = path.join(packageDir, "node_modules", packageName, "package.json"); + if (fs.existsSync(nodeModulesPath)) { + const pkgContent = JSON.parse(fs.readFileSync(nodeModulesPath, "utf8")); + return pkgContent.version; + } + } catch (innerError) { + // Ignore + } + + console.warn(`Warning: Could not determine installed version for ${packageName}`); + return null; + } +} + +function getPackageMetadata(packageName, version) { + try { + // Use pnpm view to get package metadata from npm registry + const output = execSync(`pnpm view "${packageName}@${version}" --json`, { + encoding: "utf8", + stdio: ["pipe", "pipe", "pipe"] + }); + + const metadata = JSON.parse(output); + + return { + name: metadata.name || packageName, + version: metadata.version || version, + license: metadata.license || "UNKNOWN", + private: metadata.private || false, + description: metadata.description || "", + repository: formatRepository(metadata.repository), + author: metadata.author || "", + homepage: metadata.homepage || "" + }; + } catch (error) { + console.warn(`Warning: Could not fetch metadata for ${packageName}@${version}`); + return { + name: packageName, + version: version, + license: "UNKNOWN", + private: false, + description: "", + repository: "", + author: "", + homepage: "" + }; + } +} + +function formatRepository(repo) { + if (!repo) return "undefined"; + if (typeof repo === "string") return repo; + if (repo.url) return repo.url; + return "undefined"; +} + +function getLicenseText(packageName, version, packageDir) { + // Try to find LICENSE file in node_modules + const possiblePaths = [ + path.join(packageDir, "node_modules", packageName, "LICENSE"), + path.join(packageDir, "node_modules", packageName, "LICENSE.md"), + path.join(packageDir, "node_modules", packageName, "LICENSE.txt"), + path.join(packageDir, "node_modules", packageName, "license"), + path.join(packageDir, "node_modules", packageName, "license.md"), + path.join(packageDir, "node_modules", packageName, "license.txt") + ]; + + for (const licensePath of possiblePaths) { + if (fs.existsSync(licensePath)) { + try { + return fs.readFileSync(licensePath, "utf8").trim(); + } catch (error) { + // Continue to next path + } + } + } + + // If not found in node_modules, try pnpm's virtual store + const pnpmStorePath = path.join( + packageDir, + "..", + "..", + "node_modules", + ".pnpm", + `${packageName}@${version}`, + "node_modules", + packageName + ); + + for (const filename of ["LICENSE", "LICENSE.md", "LICENSE.txt", "license", "license.md", "license.txt"]) { + const licensePath = path.join(pnpmStorePath, filename); + if (fs.existsSync(licensePath)) { + try { + return fs.readFileSync(licensePath, "utf8").trim(); + } catch (error) { + // Continue + } + } + } + + return null; +} + +function generateDependenciesJson(packageJsonPath) { + const packageJson = readPackageJson(packageJsonPath); + const packageDir = path.dirname(packageJsonPath); + + const dependencies = packageJson.dependencies || {}; + const dependencyNames = Object.keys(dependencies); + + if (dependencyNames.length === 0) { + console.log("No dependencies found in package.json"); + return { jsonData: [], detailedData: [] }; + } + + console.log(`Found ${dependencyNames.length} dependencies, resolving versions...`); + + const jsonData = []; + const detailedData = []; + + for (const depName of dependencyNames) { + const version = getInstalledVersion(depName, packageDir); + + if (version) { + // Add to JSON format + jsonData.push({ + [depName]: { + version: version, + url: null + } + }); + + // Fetch metadata for TXT format + const metadata = getPackageMetadata(depName, version); + const licenseText = getLicenseText(depName, version, packageDir); + + detailedData.push({ + ...metadata, + licenseText + }); + + console.log(` ✓ ${depName}@${version}`); + } else { + console.warn(` ✗ ${depName} - version not found`); + } + } + + return { jsonData, detailedData }; +} + +function generateDependenciesTxt(detailedData) { + const sections = []; + + for (const dep of detailedData) { + const lines = []; + + lines.push(`Name: ${dep.name}`); + lines.push(`Version: ${dep.version}`); + lines.push(`License: ${dep.license}`); + lines.push(`Private: ${dep.private}`); + lines.push(`Description: ${dep.description}`); + lines.push(`Repository: ${dep.repository}`); + + if (dep.author) { + lines.push(`Author: ${dep.author}`); + } + + if (dep.homepage) { + lines.push(`Homepage: ${dep.homepage}`); + } + + if (dep.licenseText) { + lines.push("License Copyright:"); + lines.push("==="); + lines.push(""); + lines.push(dep.licenseText); + } + + sections.push(lines.join("\n")); + } + + return sections.join("\n\n---\n\n"); +} + +function main() { + const packageJsonPath = getPackageJsonPath(); + const jsonOutputPath = path.join(process.cwd(), "dependencies.json"); + const txtOutputPath = path.join(process.cwd(), "dependencies.txt"); + + console.log(`Reading package.json from: ${packageJsonPath}`); + + const { jsonData, detailedData } = generateDependenciesJson(packageJsonPath); + + // Write dependencies.json + fs.writeFileSync(jsonOutputPath, JSON.stringify(jsonData)); + console.log(`\n✓ Generated dependencies.json at: ${jsonOutputPath}`); + console.log(` Total dependencies: ${jsonData.length}`); + + // Write dependencies.txt + const txtContent = generateDependenciesTxt(detailedData); + fs.writeFileSync(txtOutputPath, txtContent + "\n"); + console.log(`✓ Generated dependencies.txt at: ${txtOutputPath}`); +} + +main(); diff --git a/packages/customWidgets/signature-web/src/components/Signature.tsx b/packages/customWidgets/signature-web/src/components/Signature.tsx index 41d368ba0b..23f2f552f6 100644 --- a/packages/customWidgets/signature-web/src/components/Signature.tsx +++ b/packages/customWidgets/signature-web/src/components/Signature.tsx @@ -1,9 +1,6 @@ import { PureComponent, ReactNode } from "react"; - -// @ts-expect-error signature_pad has no types -import SignaturePad, { IOptions } from "signature_pad"; +import SignaturePad, { Options } from "signature_pad"; import classNames from "classnames"; -import ReactResizeDetector from "react-resize-detector"; import { Alert } from "./Alert"; import { Grid } from "./Grid"; @@ -31,8 +28,7 @@ export type penOptions = "fountain" | "ballpoint" | "marker"; export class Signature extends PureComponent { private canvasNode: HTMLCanvasElement | null = null; - // @ts-expect-error signature_pad has no types - private signaturePad: SignaturePad; + private signaturePad: SignaturePad | undefined; render(): ReactNode { const { className, alertMessage, wrapperStyle } = this.props; @@ -43,6 +39,7 @@ export class Signature extends PureComponent { className={classNames("widget-signature", className)} classNameInner="widget-signature-wrapper form-control mx-textarea-input mx-textarea" style={wrapperStyle} + onResize={this.onResize} > {alertMessage} @@ -52,7 +49,6 @@ export class Signature extends PureComponent { this.canvasNode = node; }} /> - ); } @@ -61,15 +57,19 @@ export class Signature extends PureComponent { if (this.canvasNode) { this.signaturePad = new SignaturePad(this.canvasNode, { penColor: this.props.penColor, - onEnd: this.handleSignEnd, ...this.signaturePadOptions() }); + this.signaturePad.addEventListener("endStroke", this.handleSignEnd); if (this.props.readOnly) { this.signaturePad.off(); } } } + componentWillUnmount(): void { + this.signaturePad?.removeEventListener("endStroked", this.handleSignEnd); + } + UNSAFE_componentWillReceiveProps(nextProps: SignatureProps): void { if (this.signaturePad) { const { clearSignature, readOnly } = this.props; @@ -87,7 +87,7 @@ export class Signature extends PureComponent { } private onResize = (): void => { - if (this.canvasNode) { + if (this.canvasNode && this.signaturePad) { const data = this.signaturePad.toData(); this.canvasNode.width = this.canvasNode && this.canvasNode.parentElement ? this.canvasNode.parentElement.offsetWidth : 0; @@ -98,8 +98,8 @@ export class Signature extends PureComponent { } }; - private signaturePadOptions(): IOptions { - let options: IOptions = {}; + private signaturePadOptions(): Options { + let options: Options = {}; if (this.props.penType === "fountain") { options = { minWidth: 0.6, maxWidth: 2.6, velocityFilterWeight: 0.6 }; } else if (this.props.penType === "ballpoint") { @@ -111,7 +111,7 @@ export class Signature extends PureComponent { } private handleSignEnd = (): void => { - if (this.props.onSignEndAction) { + if (this.props.onSignEndAction && this.signaturePad) { this.props.onSignEndAction(this.signaturePad.toDataURL()); } }; diff --git a/packages/customWidgets/signature-web/src/components/SizeContainer.ts b/packages/customWidgets/signature-web/src/components/SizeContainer.ts index 5c2eae89bf..1292751c64 100644 --- a/packages/customWidgets/signature-web/src/components/SizeContainer.ts +++ b/packages/customWidgets/signature-web/src/components/SizeContainer.ts @@ -1,5 +1,6 @@ import { createElement, CSSProperties, FC, PropsWithChildren } from "react"; import classNames from "classnames"; +import { useResizeObserver } from "../utils/useResizeObserver"; export type HeightUnitType = "percentageOfWidth" | "percentageOfParent" | "pixels"; @@ -17,6 +18,7 @@ export interface SizeProps extends Dimensions, PropsWithChildren { classNameInner?: string; readOnly?: boolean; style?: CSSProperties; + onResize?: () => void; } export const SizeContainer: FC = ({ @@ -28,12 +30,16 @@ export const SizeContainer: FC = ({ height, children, style, - readOnly = false + readOnly = false, + onResize }) => { + const ref = useResizeObserver(() => onResize?.()); + const styleWidth = widthUnit === "percentage" ? `${width}%` : `${width}px`; return createElement( "div", { + ref, className: classNames(className, "size-box"), style: { position: "relative", diff --git a/packages/customWidgets/signature-web/src/components/__tests__/SizeContainer.spec.ts b/packages/customWidgets/signature-web/src/components/__tests__/SizeContainer.spec.ts index a4058880c2..8966e3206c 100644 --- a/packages/customWidgets/signature-web/src/components/__tests__/SizeContainer.spec.ts +++ b/packages/customWidgets/signature-web/src/components/__tests__/SizeContainer.spec.ts @@ -21,31 +21,7 @@ describe("Grid", () => { it("renders structure correctly", () => { const grid = renderGrid(defaultProps); - expect(grid.getElement()).toEqual( - createElement( - "div", - { - className: "widget-signature size-box", - style: { - position: "relative", - width: "500px", - height: "300px" - } - }, - createElement("div", { - className: "size-box-inner", - readOnly: defaultProps.readOnly, - disabled: defaultProps.readOnly, - style: { - position: "absolute", - top: "0", - right: "0", - bottom: "0", - left: "0" - } - }) - ) - ); + expect(grid.getElement()).toMatchSnapshot(); }); it("with percentage units renders the structure correctly", () => { @@ -57,32 +33,7 @@ describe("Grid", () => { height: 50 }); - expect(grid.getElement()).toEqual( - createElement( - "div", - { - className: "widget-signature size-box", - style: { - position: "relative", - width: "80%", - height: "auto", - paddingBottom: "40%" - } - }, - createElement("div", { - className: "size-box-inner", - readOnly: defaultProps.readOnly, - disabled: defaultProps.readOnly, - style: { - position: "absolute", - top: "0", - right: "0", - bottom: "0", - left: "0" - } - }) - ) - ); + expect(grid.getElement()).toMatchSnapshot(); }); it("with percentage of parent units renders the structure correctly", () => { @@ -94,31 +45,7 @@ describe("Grid", () => { height: 50 }); - expect(grid.getElement()).toEqual( - createElement( - "div", - { - className: "widget-signature size-box", - style: { - position: "relative", - width: "80%", - height: "50%" - } - }, - createElement("div", { - className: "size-box-inner", - readOnly: defaultProps.readOnly, - disabled: defaultProps.readOnly, - style: { - position: "absolute", - top: "0", - right: "0", - bottom: "0", - left: "0" - } - }) - ) - ); + expect(grid.getElement()).toMatchSnapshot(); }); it("with percentage and pixel units renders the structure correctly", () => { @@ -130,30 +57,6 @@ describe("Grid", () => { height: 50 }); - expect(grid.getElement()).toEqual( - createElement( - "div", - { - className: "widget-signature size-box", - style: { - position: "relative", - width: "80px", - height: "40px" - } - }, - createElement("div", { - className: "size-box-inner", - readOnly: defaultProps.readOnly, - disabled: defaultProps.readOnly, - style: { - position: "absolute", - top: "0", - right: "0", - bottom: "0", - left: "0" - } - }) - ) - ); + expect(grid.getElement()).toMatchSnapshot(); }); }); diff --git a/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/Signature.spec.ts.snap b/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/Signature.spec.ts.snap index 54f074d3f5..7f44f829cb 100644 --- a/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/Signature.spec.ts.snap +++ b/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/Signature.spec.ts.snap @@ -12,6 +12,7 @@ exports[`Signature renders the structure correctly 1`] = ` gridCellWidth={50} height={50} heightUnit="percentageOfWidth" + onResize={[Function]} penColor="#000" penType="fountain" readOnly={false} @@ -45,10 +46,5 @@ exports[`Signature renders the structure correctly 1`] = ` - `; diff --git a/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/SizeContainer.spec.ts.snap b/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/SizeContainer.spec.ts.snap new file mode 100644 index 0000000000..b7f3640af4 --- /dev/null +++ b/packages/customWidgets/signature-web/src/components/__tests__/__snapshots__/SizeContainer.spec.ts.snap @@ -0,0 +1,114 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Grid renders structure correctly 1`] = ` +
+
+
+`; + +exports[`Grid with percentage and pixel units renders the structure correctly 1`] = ` +
+
+
+`; + +exports[`Grid with percentage of parent units renders the structure correctly 1`] = ` +
+
+
+`; + +exports[`Grid with percentage units renders the structure correctly 1`] = ` +
+
+
+`; diff --git a/packages/customWidgets/signature-web/src/package.xml b/packages/customWidgets/signature-web/src/package.xml index f0a411c44f..c6977cb8b1 100644 --- a/packages/customWidgets/signature-web/src/package.xml +++ b/packages/customWidgets/signature-web/src/package.xml @@ -1,6 +1,6 @@ - + diff --git a/packages/customWidgets/signature-web/src/utils/useResizeObserver.ts b/packages/customWidgets/signature-web/src/utils/useResizeObserver.ts new file mode 100644 index 0000000000..2e2a35423e --- /dev/null +++ b/packages/customWidgets/signature-web/src/utils/useResizeObserver.ts @@ -0,0 +1,26 @@ +import { RefObject, useLayoutEffect, useRef } from "react"; + +type callbackFn = (target: T, entry: ResizeObserverEntry) => void; + +export function useResizeObserver(callback: callbackFn): RefObject { + const ref = useRef(null); + + useLayoutEffect(() => { + const element = ref?.current; + + if (!element) { + return; + } + + const observer = new ResizeObserver(entries => { + callback(element, entries[0]); + }); + + observer.observe(element); + return () => { + observer.disconnect(); + }; + }, [callback, ref]); + + return ref; +} diff --git a/packages/customWidgets/signature-web/tsconfig.json b/packages/customWidgets/signature-web/tsconfig.json index 96806425d9..b6e01a9e22 100644 --- a/packages/customWidgets/signature-web/tsconfig.json +++ b/packages/customWidgets/signature-web/tsconfig.json @@ -4,7 +4,7 @@ "outDir": "dist/tsc/", "noEmitOnError": true, "sourceMap": true, - "module": "CommonJS", + "module": "esnext", "target": "es5", "lib": ["es2015", "dom"], "moduleResolution": "node", diff --git a/packages/customWidgets/signature-web/webpack.config.js b/packages/customWidgets/signature-web/webpack.config.js index 7c3f9d3188..6889f9dda0 100644 --- a/packages/customWidgets/signature-web/webpack.config.js +++ b/packages/customWidgets/signature-web/webpack.config.js @@ -9,7 +9,7 @@ const widgetName = "Signature"; const widgetConfig = { mode: "production", devtool: false, - externals: ["react", "react-dom"], + externals: ["react", "react-dom", "react/jsx-runtime"], entry: "./src/components/SignatureContainer.ts", output: { path: path.resolve(__dirname, "dist/tmp"), @@ -73,12 +73,7 @@ const previewConfig = { rules: [ { test: /\.tsx?$/, - loader: "ts-loader", - options: { - compilerOptions: { - module: "CommonJS" - } - } + loader: "ts-loader" }, { test: /\.(sa|sc|c)ss$/, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e49ad50a10..9bf8021cfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,12 +225,9 @@ importers: classnames: specifier: ^2.5.1 version: 2.5.1 - react-resize-detector: - specifier: ^9.1.1 - version: 9.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) signature_pad: - specifier: 4.0.0 - version: 4.0.0 + specifier: 5.1.3 + version: 5.1.3 devDependencies: '@mendix/automation-utils': specifier: workspace:* @@ -9458,12 +9455,6 @@ packages: resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} engines: {node: '>=0.10.0'} - react-resize-detector@9.1.1: - resolution: {integrity: sha512-siLzop7i4xIvZIACE/PHTvRegA8QRCEt0TfmvJ/qCIFQJ4U+3NuYcF8tNDmDWxfIn+X1eNCyY2rauH4KRxge8w==} - peerDependencies: - react: '>=18.0.0 <19.0.0' - react-dom: '>=18.0.0 <19.0.0' - react-shallow-renderer@16.15.0: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: @@ -9871,8 +9862,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - signature_pad@4.0.0: - resolution: {integrity: sha512-47I2MULJIHaUAFuVbqMVWwZR+GEl2wH4QKg16OwpQg82GzVUL3Z405Um6sLgVB0xbP5rwqiNzfLTbJwipXvaWA==} + signature_pad@5.1.3: + resolution: {integrity: sha512-zyxW5vuJVnQdGcU+kAj9FYl7WaAunY3kA5S7mPg0xJiujL9+sPAWfSQHS5tXaJXDUa4FuZeKhfdCDQ6K3wfkpQ==} signum@1.0.0: resolution: {integrity: sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==} @@ -12502,7 +12493,7 @@ snapshots: identity-obj-proxy: 3.0.0 jasmine: 3.99.0 jasmine-core: 3.99.1 - jest: 29.7.0(@types/node@22.14.1) + jest: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)) jest-environment-jsdom: 29.7.0 jest-jasmine2: 29.7.0 jest-junit: 13.2.0 @@ -17023,18 +17014,6 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.14.1): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)) @@ -18857,12 +18836,6 @@ snapshots: react-refresh@0.4.3: {} - react-resize-detector@9.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - lodash: 4.17.21 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-shallow-renderer@16.15.0(react@18.3.1): dependencies: object-assign: 4.1.1 @@ -19403,7 +19376,7 @@ snapshots: signal-exit@4.1.0: {} - signature_pad@4.0.0: {} + signature_pad@5.1.3: {} signum@1.0.0: {} @@ -19850,7 +19823,7 @@ snapshots: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.8 - jest: 29.7.0(@types/node@22.14.1) + jest: 29.7.0(@types/node@22.14.1)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.1)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6