From 9f4214ddf7a985c31e8197d91aa15799589f9bac Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 13:40:34 +0000 Subject: [PATCH 1/3] Initial plan From 23ecf655d59d5a25e21f8f938bd19d1c4abc6717 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 13:58:25 +0000 Subject: [PATCH 2/3] Add TypeScript port of TiaCodeGen C# library Complete TypeScript translation of the TiaCodeGen library in TiaCodegen-ts/ mirroring the C# project structure. Key translation decisions: - ref int id -> { value: number } pass-by-reference object - StringBuilder -> custom class with appendLine/append/toString - C# Substring(start, length) -> TypeScript slice(start, start+length) - Dictionary -> Record for insertion-order preservation - Multiple constructors -> single constructor with runtime type checks - ulong -> number - LINQ -> Array methods (map/filter/flatMap/etc.) - Abstract classes, interfaces and inheritance preserved All 15 Jest tests pass, TypeScript compiles with no errors. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- TiaCodegen-ts/package-lock.json | 3849 +++++++++++++++++ TiaCodegen-ts/package.json | 24 + TiaCodegen-ts/src/Blocks/Block.ts | 99 + TiaCodegen-ts/src/Blocks/CodeBlock.ts | 11 + TiaCodegen-ts/src/Blocks/Network.ts | 37 + TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts | 888 ++++ TiaCodegen-ts/src/Commands/And.ts | 8 + .../src/Commands/BaseOperationOrSignal.ts | 69 + TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts | 42 + .../src/Commands/Coils/BaseNPCoil.ts | 15 + TiaCodegen-ts/src/Commands/Coils/Coil.ts | 9 + TiaCodegen-ts/src/Commands/Coils/PCoil.ts | 9 + TiaCodegen-ts/src/Commands/Coils/RCoil.ts | 9 + TiaCodegen-ts/src/Commands/Coils/SCoil.ts | 9 + .../Commands/Comparisons/CompareOperator.ts | 8 + TiaCodegen-ts/src/Commands/Comparisons/Eq.ts | 8 + TiaCodegen-ts/src/Commands/Comparisons/Ge.ts | 8 + TiaCodegen-ts/src/Commands/Comparisons/Gt.ts | 8 + .../src/Commands/Comparisons/InRangeCall.ts | 25 + TiaCodegen-ts/src/Commands/Comparisons/Le.ts | 8 + TiaCodegen-ts/src/Commands/Comparisons/Lt.ts | 8 + TiaCodegen-ts/src/Commands/Comparisons/Ne.ts | 8 + .../src/Commands/Comparisons/OutRangeCall.ts | 25 + TiaCodegen-ts/src/Commands/Convert.ts | 9 + TiaCodegen-ts/src/Commands/Distributor.ts | 18 + .../src/Commands/Functions/AckGlCall.ts | 25 + .../Commands/Functions/Arithmetic/AddCall.ts | 121 + .../Functions/Arithmetic/ArithmeticCall.ts | 10 + .../Commands/Functions/Arithmetic/DivCall.ts | 25 + .../Commands/Functions/Arithmetic/ModCall.ts | 25 + .../Commands/Functions/Arithmetic/MulCall.ts | 121 + .../Commands/Functions/Arithmetic/SubCall.ts | 25 + .../Arithmetic/VariableArithmeticCall.ts | 8 + .../Functions/Base/FunctionBlockCall.ts | 12 + .../Commands/Functions/Base/FunctionCall.ts | 45 + .../Functions/Base/SystemFunctionBlockCall.ts | 12 + .../Functions/Base/SystemFunctionCall.ts | 8 + .../src/Commands/Functions/CTUCall.ts | 30 + .../src/Commands/Functions/CTUDCall.ts | 36 + .../src/Commands/Functions/FDBACKCall.ts | 39 + .../src/Commands/Functions/FTrigCall.ts | 21 + .../src/Commands/Functions/NTrigCall.ts | 12 + .../src/Commands/Functions/PTrigCall.ts | 12 + .../src/Commands/Functions/RTrigCall.ts | 21 + .../src/Commands/Functions/TOFCall.ts | 35 + .../src/Commands/Functions/TONCall.ts | 35 + .../src/Commands/Functions/TONRCall.ts | 35 + .../src/Commands/Functions/TPCall.ts | 35 + TiaCodegen-ts/src/Commands/Move.ts | 16 + TiaCodegen-ts/src/Commands/NCoil.ts | 9 + TiaCodegen-ts/src/Commands/Not.ts | 29 + TiaCodegen-ts/src/Commands/Or.ts | 18 + TiaCodegen-ts/src/Commands/S_Move.ts | 16 + .../src/Commands/Signals/FixedSignal.ts | 1 + TiaCodegen-ts/src/Commands/Signals/Signal.ts | 357 ++ TiaCodegen-ts/src/Enums/Direction.ts | 7 + TiaCodegen-ts/src/Enums/SignalType.ts | 27 + .../src/Extensions/NaturalComparer.ts | 36 + .../Extensions/OperationOrSignalExtensions.ts | 13 + TiaCodegen-ts/src/Interfaces/ICoil.ts | 2 + .../src/Interfaces/IFunctionOperation.ts | 2 + .../src/Interfaces/IOperationOrSignal.ts | 11 + .../IOperationOrSignalDirectionWrapper.ts | 22 + TiaCodegen-ts/src/Interfaces/IPartName.ts | 3 + .../src/Internal/IEnumerableExtensions.ts | 4 + TiaCodegen-ts/src/index.ts | 90 + TiaCodegen-ts/src/utils/StringBuilder.ts | 21 + TiaCodegen-ts/tests/SampleTests.test.ts | 347 ++ TiaCodegen-ts/tsconfig.json | 18 + 69 files changed, 7008 insertions(+) create mode 100644 TiaCodegen-ts/package-lock.json create mode 100644 TiaCodegen-ts/package.json create mode 100644 TiaCodegen-ts/src/Blocks/Block.ts create mode 100644 TiaCodegen-ts/src/Blocks/CodeBlock.ts create mode 100644 TiaCodegen-ts/src/Blocks/Network.ts create mode 100644 TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts create mode 100644 TiaCodegen-ts/src/Commands/And.ts create mode 100644 TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/Coil.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/PCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/RCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Coils/SCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Eq.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Ge.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Gt.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Le.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Lt.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/Ne.ts create mode 100644 TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Convert.ts create mode 100644 TiaCodegen-ts/src/Commands/Distributor.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/CTUCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/TOFCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/TONCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/TONRCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Functions/TPCall.ts create mode 100644 TiaCodegen-ts/src/Commands/Move.ts create mode 100644 TiaCodegen-ts/src/Commands/NCoil.ts create mode 100644 TiaCodegen-ts/src/Commands/Not.ts create mode 100644 TiaCodegen-ts/src/Commands/Or.ts create mode 100644 TiaCodegen-ts/src/Commands/S_Move.ts create mode 100644 TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts create mode 100644 TiaCodegen-ts/src/Commands/Signals/Signal.ts create mode 100644 TiaCodegen-ts/src/Enums/Direction.ts create mode 100644 TiaCodegen-ts/src/Enums/SignalType.ts create mode 100644 TiaCodegen-ts/src/Extensions/NaturalComparer.ts create mode 100644 TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts create mode 100644 TiaCodegen-ts/src/Interfaces/ICoil.ts create mode 100644 TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts create mode 100644 TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts create mode 100644 TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts create mode 100644 TiaCodegen-ts/src/Interfaces/IPartName.ts create mode 100644 TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts create mode 100644 TiaCodegen-ts/src/index.ts create mode 100644 TiaCodegen-ts/src/utils/StringBuilder.ts create mode 100644 TiaCodegen-ts/tests/SampleTests.test.ts create mode 100644 TiaCodegen-ts/tsconfig.json diff --git a/TiaCodegen-ts/package-lock.json b/TiaCodegen-ts/package-lock.json new file mode 100644 index 0000000..ccbaed7 --- /dev/null +++ b/TiaCodegen-ts/package-lock.json @@ -0,0 +1,3849 @@ +{ + "name": "tia-codegen-ts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tia-codegen-ts", + "version": "1.0.0", + "devDependencies": { + "@types/jest": "^29.5.12", + "@types/node": "^20.12.7", + "jest": "^29.7.0", + "ts-jest": "^29.1.2", + "typescript": "^5.4.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/TiaCodegen-ts/package.json b/TiaCodegen-ts/package.json new file mode 100644 index 0000000..8d49c6e --- /dev/null +++ b/TiaCodegen-ts/package.json @@ -0,0 +1,24 @@ +{ + "name": "tia-codegen-ts", + "version": "1.0.0", + "description": "TypeScript port of TiaCodeGen C# library", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "test": "jest --testPathPattern=tests", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/jest": "^29.5.12", + "@types/node": "^20.12.7", + "jest": "^29.7.0", + "ts-jest": "^29.1.2", + "typescript": "^5.4.5" + }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node", + "testMatch": ["**/tests/**/*.test.ts"] + } +} diff --git a/TiaCodegen-ts/src/Blocks/Block.ts b/TiaCodegen-ts/src/Blocks/Block.ts new file mode 100644 index 0000000..332f632 --- /dev/null +++ b/TiaCodegen-ts/src/Blocks/Block.ts @@ -0,0 +1,99 @@ +import { CodeBlock } from './CodeBlock'; +import { KopCodeHelper } from '../CodeGen/KopCodeHelper'; + +export class Block { + name: string; + number: number = 0; + private codeBlock: CodeBlock; + title: string | undefined; + titleEnglish: string | undefined; + comment: string | undefined; + commentEnglish: string | undefined; + author: string | undefined; + blockInterface: string; + + constructor(name: string, title: string, codeBlock: CodeBlock) { + this.name = name; + this.title = title; + this.codeBlock = codeBlock; + + this.blockInterface = ` + + +
+
+
+
+
+
+ +
+ + +`; + } + + getCode(): string { + const idRef = { value: 0 }; + let code = this.getBlockHeader(idRef); + code += new KopCodeHelper(this.codeBlock).getXml(idRef); + code += this.getBlockFooter(idRef); + return code; + } + + getBlockHeader(idRef: { value: number }): string { + const header = ` + + + ${this.author !== undefined && this.author !== null ? '' + this.author + '' : ''} + General + 1.0 + Optimized + ${this.name} + ${this.number !== 0 ? '' + this.number + '' : ''} + + LAD + + `; + return header; + } + + getBlockFooter(idRef: { value: number }): string { + const footer = ` + + + + + de-DE + ${this.title} + + + + + en-GB + ${this.titleEnglish} + + + + + + + + + de-DE + ${this.comment} + + + + + en-GB + ${this.commentEnglish} + + + + + + `; + return footer; + } +} diff --git a/TiaCodegen-ts/src/Blocks/CodeBlock.ts b/TiaCodegen-ts/src/Blocks/CodeBlock.ts new file mode 100644 index 0000000..8a1c1ea --- /dev/null +++ b/TiaCodegen-ts/src/Blocks/CodeBlock.ts @@ -0,0 +1,11 @@ +import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal'; + +export class CodeBlock extends BaseOperationOrSignal { + name: string; + safety: boolean = false; + + constructor(name: string = '') { + super(); + this.name = name; + } +} diff --git a/TiaCodegen-ts/src/Blocks/Network.ts b/TiaCodegen-ts/src/Blocks/Network.ts new file mode 100644 index 0000000..f5f91b2 --- /dev/null +++ b/TiaCodegen-ts/src/Blocks/Network.ts @@ -0,0 +1,37 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal'; + +export class Network extends BaseOperationOrSignal { + networkTitle: string | undefined; + description: string | undefined; + networkTitleEnglish: string | undefined; + descriptionEnglish: string | undefined; + + constructor( + networkTitleOrOp?: string | IOperationOrSignal, + networkTitleEnglishOrOp?: string | IOperationOrSignal, + ...operationOrSignals: IOperationOrSignal[] + ) { + super(); + if (typeof networkTitleOrOp === 'string') { + this.networkTitle = networkTitleOrOp; + this.networkTitleEnglish = typeof networkTitleEnglishOrOp === 'string' + ? networkTitleEnglishOrOp + : undefined; + if (networkTitleEnglishOrOp !== undefined && typeof networkTitleEnglishOrOp !== 'string') { + this.children.push(networkTitleEnglishOrOp); + } + for (const op of operationOrSignals) { + this.children.push(op); + } + } else { + if (networkTitleOrOp !== undefined) this.children.push(networkTitleOrOp); + if (networkTitleEnglishOrOp !== undefined && typeof networkTitleEnglishOrOp !== 'string') { + this.children.push(networkTitleEnglishOrOp); + } + for (const op of operationOrSignals) { + this.children.push(op); + } + } + } +} diff --git a/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts b/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts new file mode 100644 index 0000000..2d1ae42 --- /dev/null +++ b/TiaCodegen-ts/src/CodeGen/KopCodeHelper.ts @@ -0,0 +1,888 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { ICoil } from '../Interfaces/ICoil'; +import { IFunctionOperation } from '../Interfaces/IFunctionOperation'; +import { IPartName } from '../Interfaces/IPartName'; +import { StringBuilder } from '../utils/StringBuilder'; +import { flatten } from '../Internal/IEnumerableExtensions'; +import { NaturalComparer } from '../Extensions/NaturalComparer'; +import { CodeBlock } from '../Blocks/CodeBlock'; +import { Network } from '../Blocks/Network'; +import { And } from '../Commands/And'; +import { Or } from '../Commands/Or'; +import { Not } from '../Commands/Not'; +import { Distributor } from '../Commands/Distributor'; +import { Move } from '../Commands/Move'; +import { Convert } from '../Commands/Convert'; +import { S_Move } from '../Commands/S_Move'; +import { Signal } from '../Commands/Signals/Signal'; +import { BaseCoil } from '../Commands/Coils/BaseCoil'; +import { BaseNPCoil } from '../Commands/Coils/BaseNPCoil'; +import { Coil } from '../Commands/Coils/Coil'; +import { SCoil } from '../Commands/Coils/SCoil'; +import { RCoil } from '../Commands/Coils/RCoil'; +import { BaseOperationOrSignal } from '../Commands/BaseOperationOrSignal'; +import { CompareOperator } from '../Commands/Comparisons/CompareOperator'; +import { InRangeCall } from '../Commands/Comparisons/InRangeCall'; +import { OutRangeCall } from '../Commands/Comparisons/OutRangeCall'; +import { FunctionCall } from '../Commands/Functions/Base/FunctionCall'; +import { FunctionBlockCall } from '../Commands/Functions/Base/FunctionBlockCall'; +import { SystemFunctionCall } from '../Commands/Functions/Base/SystemFunctionCall'; +import { SystemFunctionBlockCall } from '../Commands/Functions/Base/SystemFunctionBlockCall'; +import { ArithmeticCall } from '../Commands/Functions/Arithmetic/ArithmeticCall'; +import { VariableArithmeticCall } from '../Commands/Functions/Arithmetic/VariableArithmeticCall'; +import { AckGlCall } from '../Commands/Functions/AckGlCall'; +import { CTUCall } from '../Commands/Functions/CTUCall'; +import { CTUDCall } from '../Commands/Functions/CTUDCall'; +import { tryGetParent } from '../Extensions/OperationOrSignalExtensions'; + +export class KopCodeHelper { + static flattenOrdered(e: T[], f: (t: T) => T[]): T[] { + const result: T[] = []; + for (const el of e) { + for (const el2 of KopCodeHelper.flattenOrdered(f(el), f)) { + result.push(el2); + } + result.push(el); + } + return result; + } + + private _currentId: number = 21; + private _block: CodeBlock; + private _sb: StringBuilder; + + constructor(block: CodeBlock) { + this._block = block; + this._sb = new StringBuilder(); + } + + private addSignalDefinitions(network: Network): void { + const allChildren = flatten(network.children, x => x.children); + const signals = allChildren + .filter((x): x is Signal => x instanceof Signal) + .slice() + .sort((a, b) => new NaturalComparer().compare(a.name, b.name)); + + for (const signal of signals) { + signal.addXmlToStringBuilder(this._currentId, this._sb); + signal.signalId = this._currentId; + this._currentId++; + } + } + + private checkAndAndOr(block: CodeBlock, network: Network): void { + const allChildren = flatten(network.children, x => x.children); + const ors = allChildren.filter((x): x is Or => x instanceof Or); + + for (const or of ors) { + if (or.children.length === 0) { + throw new Error(`Empty Or im Baustein "${block.name}" Netzwerk "${network.networkTitle}"`); + } + } + } + + private printTree(signal: IOperationOrSignal, sb: StringBuilder, level: number = 0): void { + sb.appendLine(' '.repeat(level * 4) + signal.toString() + ' OP ID: ' + signal.operationId); + for (const s of signal.children) { + this.printTree(s, sb, level + 1); + } + } + + private addContactDefinitions(network: Network, block: CodeBlock): void { + const ops = KopCodeHelper.flattenOrdered(network.children, x => x.children) + .filter((x): x is IOperationOrSignal => true); + + for (const op of ops) { + if (op instanceof Signal) { + // nothing + } else if (op instanceof And || (op instanceof Or && op.children.length === 1)) { + // nothing + } else { + if (op instanceof Or && op.children.length > 1) { + op.createContactAndFillCardinality(op); + } + } + } + + for (const op of ops) { + if (op instanceof Signal) { + if ( + !(op.parent instanceof BaseCoil) && + !(op.parent instanceof Not) && + !(op.parent instanceof FunctionCall) && + !(op.parent instanceof CompareOperator) && + !(op.parent instanceof Move) && + !(op.parent instanceof Convert) && + !(op.parent instanceof S_Move) + ) { + op.operationId = this._currentId; + this._currentId++; + } + } else if (op instanceof And || (op instanceof Or && op.children.length === 1)) { + op.operationId = op.children[op.children.length - 1].operationId; + } else { + op.operationId = this._currentId; + if (op instanceof Not || op instanceof BaseCoil || op instanceof SystemFunctionBlockCall || op instanceof SystemFunctionCall) { + if (op.children.length > 0) { + op.children[0].operationId = this._currentId; + } + } + + if (op instanceof Or && op.children.length > 1) { + op.createContactAndFillCardinality(op); + } + + if (!(op instanceof Distributor) && !op.doNotCreateContact) { + this._currentId++; + } + } + } + + for (const op of ops) { + let partname = op.constructor.name; + if (this.isIPartName(op)) { + partname = (op as unknown as IPartName).partName; + } + + if (op instanceof Signal) { + if ( + !(op.parent instanceof BaseCoil) && + !(op.parent instanceof Not) && + !(op.parent instanceof FunctionCall) && + !(op.parent instanceof CompareOperator) && + !(op.parent instanceof Move) && + !(op.parent instanceof Convert) && + !(op.parent instanceof S_Move) + ) { + this._sb.appendLine(``); + } + } else if (op instanceof Or && op.children.length > 1) { + if (!op.doNotCreateContact) { + this._sb.appendLine(``); + this._sb.appendLine(`${op.cardinality}`); + this._sb.appendLine(''); + } + } else if (op instanceof CompareOperator) { + this._sb.appendLine(``); + let srctype = (op.children[0] as Signal).signalType.toString(); + if (srctype.startsWith('Constant')) srctype = srctype.substring(8); + this._sb.appendLine(`${srctype}`); + this._sb.appendLine(''); + } else if (op instanceof Convert) { + this._sb.appendLine(``); + let srctype = (op.children[op.children.length - 1] as Signal).signalType.toString(); + let desttype = (op.children[0] as Signal).signalType.toString(); + if (srctype.startsWith('Constant')) srctype = srctype.substring(8); + if (desttype.startsWith('Constant')) desttype = desttype.substring(8); + this._sb.appendLine(`${srctype}`); + this._sb.appendLine(`${desttype}`); + this._sb.appendLine(''); + } else if (op instanceof Move) { + this._sb.appendLine(``); + this._sb.appendLine(`${op.cardinality}`); + this._sb.appendLine(''); + } else if (op instanceof S_Move) { + this._sb.appendLine(``); + } else if (op instanceof Not) { + this._sb.appendLine(``); + this._sb.appendLine(''); + this._sb.appendLine(''); + } else if (op instanceof BaseCoil) { + const coil = op as BaseCoil; + if (coil.negated) { + this._sb.appendLine(``); + this._sb.appendLine('\t'); + this._sb.appendLine(''); + } else { + this._sb.appendLine(``); + } + } else if (op instanceof And || op instanceof Or) { + // nothing + } else if (op instanceof SystemFunctionBlockCall) { + const fc = op as SystemFunctionBlockCall; + this._sb.appendLine(``); + if (fc.additionalInnerXml !== null) this._sb.appendLine(fc.additionalInnerXml); + + const fb = op as FunctionBlockCall; + + if (fb.instanceName.startsWith('"')) { + this._sb.appendLine(``); + this._currentId++; + this._sb.appendLine(``); + this._sb.appendLine(''); + } else { + this._sb.appendLine(``); + this._currentId++; + + for (const part of fb.instanceName.split('.')) { + const idx = part.indexOf('[') + 1; + if (idx > 0) { + this._sb.appendLine(``); + const arrays = part.substring(idx, part.length - idx - 1); + + if (arrays.includes('"')) { + this._sb.appendLine(''); + this._sb.appendLine(``); + this._sb.appendLine(''); + this._sb.appendLine(''); + } else { + for (const arr of arrays.split(',')) { + this._sb.appendLine(``); + this._currentId++; + this._sb.appendLine(''); + this._sb.appendLine('DInt'); + this._sb.appendLine(`${arr}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + } + } + } else { + this._sb.appendLine(``); + } + this._sb.appendLine(''); + } + this._sb.appendLine(''); + } + if (fc.templateValueName !== null) { + this._sb.appendLine(`${fc.templateValue}`); + if (fc.safetyTemplateString !== null && tryGetParent(fc, CodeBlock)?.safety === true) { + this._sb.appendLine(fc.safetyTemplateString); + } + } + + if (this._block.safety && fc.additionalSafetyTemplateValues !== null) { + this._sb.appendLine(fc.additionalSafetyTemplateValues); + } + this._sb.appendLine(''); + } else if (op instanceof SystemFunctionCall) { + const fc = op as FunctionCall; + + if (fc.functionName === 'Serialize' || fc.functionName === 'Deserialize') { + this._sb.appendLine(``); + } else { + this._sb.appendLine(``); + } + if (fc.additionalInnerXml !== null) this._sb.appendLine(fc.additionalInnerXml); + + if (fc instanceof ArithmeticCall) { + if (fc instanceof VariableArithmeticCall) { + this._sb.appendLine(`${fc.children.length - 1}`); + } + this._sb.appendLine(`${fc.type}`); + } else if (fc instanceof InRangeCall || fc instanceof OutRangeCall) { + let srctype = (op.children[0] as Signal).signalType.toString(); + if (srctype.startsWith('Constant')) srctype = srctype.substring(8); + this._sb.appendLine(`${srctype}`); + } else if (fc.functionName === 'DPRD_DAT' || fc.functionName === 'DPWR_DAT') { + this._sb.appendLine('Variant'); + this._sb.appendLine('HW_IO'); + } + this._sb.appendLine(''); + } else if (op instanceof FunctionCall) { + const fc = op as FunctionCall; + + if (op instanceof AckGlCall) { + this._sb.appendLine(``); + } else if (op instanceof FunctionBlockCall) { + this._sb.appendLine(``); + this._sb.appendLine(``); + } else { + this._sb.appendLine(``); + this._sb.appendLine(``); + } + + if (op instanceof FunctionBlockCall) { + const fb = op as FunctionBlockCall; + + if (fb.instanceName.startsWith('"')) { + this._sb.appendLine(``); + } else { + this._sb.appendLine(``); + } + this._currentId++; + + for (const part of fb.instanceName.split('.')) { + let instanceNamePart: string; + if (part.startsWith('"')) { + instanceNamePart = part.replace(/"/g, ''); + } else { + instanceNamePart = part; + } + + const idx = instanceNamePart.indexOf('[') + 1; + if (idx > 0) { + this._sb.appendLine(``); + const arrays = instanceNamePart.substring(idx, instanceNamePart.length - idx - 1); + + if (arrays.includes('"')) { + this._sb.appendLine(''); + this._sb.appendLine(``); + this._sb.appendLine(''); + this._sb.appendLine(''); + } else { + for (const arr of arrays.split(',')) { + this._sb.appendLine(``); + this._currentId++; + this._sb.appendLine(''); + this._sb.appendLine('DInt'); + this._sb.appendLine(`${arr}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + } + } + } else { + this._sb.appendLine(``); + } + this._sb.appendLine(''); + } + this._sb.appendLine(''); + } + + if (op instanceof AckGlCall) { + this._sb.appendLine('1'); + this._sb.appendLine('0'); + this._sb.appendLine('DInt'); + this._sb.appendLine(''); + } else { + for (const [key, intf] of Object.entries(fc.iface)) { + if (intf.direction !== 'Eno') { + let type = 'Bool'; + if (intf.operationOrSignal instanceof Signal) { + const sig = intf.operationOrSignal as Signal; + if (sig.signalType === 'Custom') { + type = sig.customType ?? 'Bool'; + } else { + type = sig.signalType.toString(); + } + } + if (type !== 'Constant' && type.startsWith('Constant')) { + type = type.substring(8); + } + type = intf.type !== null ? intf.type.toString() : type; + if (intf.length > 0) { + this._sb.appendLine(``); + } else { + this._sb.appendLine(``); + } + } + } + this._sb.appendLine(''); + this._sb.appendLine(''); + } + } + } + } + + private static readonly debug: string | null = null; + + private addWires(op: IOperationOrSignal): void { + if (op.children !== null) { + for (const lop of op.children) { + this.addWires(lop); + } + } + + if (op instanceof FunctionCall) { + const fc = op as FunctionCall; + for (const [key, intf] of Object.entries(fc.iface)) { + const sng = intf.operationOrSignal; + if (fc instanceof ArithmeticCall && sng === null) { + // skip + } else if (sng === null) { + this._sb.appendLine(``); + this._currentId++; + this._sb.appendLine(``); + this._sb.appendLine(``); + this._currentId++; + this._sb.appendLine(''); + } else if (intf.direction === 'Input' || intf.direction === 'InOut') { + this._sb.appendLine(``); + if (sng instanceof Signal) { + this._sb.appendLine(` `); + } else { + if (sng instanceof Or) { + this._sb.appendLine(``); + } else { + this._sb.appendLine(``); + } + } + this._sb.appendLine(``); + this._sb.appendLine(''); + this._currentId++; + } else if (intf.direction === 'Eno') { + this._sb.appendLine(``); + this._sb.appendLine(``); + this._sb.appendLine(``); + this._sb.appendLine(''); + this._currentId++; + } else { + this._sb.appendLine(``); + this._sb.appendLine(``); + if (sng instanceof Distributor) { + this._sb.appendLine(''); + for (const c of (sng as Distributor).children) { + if (c instanceof Signal) { + this._sb.appendLine(` `); + } else if (c instanceof And && c.children.length > 0 && c.children[0] instanceof Or) { + for (const chIn of c.children[0].children) { + for (const ch of this.getAllOrSignals(chIn)) { + const inName = ch instanceof FunctionCall + ? ((ch instanceof InRangeCall || ch instanceof OutRangeCall) ? 'pre' : 'en') + : 'in'; + this._sb.appendLine(``); + } + } + } else { + const inName = c instanceof FunctionCall + ? ((c instanceof InRangeCall || c instanceof OutRangeCall) ? 'pre' : 'en') + : 'in'; + this._sb.appendLine(``); + } + } + } else { + if (sng instanceof Signal) { + this._sb.appendLine(` `); + } else { + const inName = sng instanceof FunctionCall + ? ((sng instanceof InRangeCall || sng instanceof OutRangeCall) ? 'pre' : 'en') + : 'in'; + this._sb.appendLine(``); + } + } + this._sb.appendLine(''); + this._currentId++; + } + } + } else if ( + op instanceof Signal && + !(op.parent instanceof FunctionCall) && + !(op.parent instanceof CompareOperator) && + !(op.parent instanceof Move) && + !(op.parent instanceof Convert) && + !(op.parent instanceof S_Move) + ) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + + let tname = 'operand'; + if (op.parent instanceof BaseNPCoil) tname = 'bit'; + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + } else if (op instanceof Or && op.children.length > 1) { + let orInputCounter = 1; + const importChildOrs = (childOr: Or): void => { + for (const ch of childOr.children) { + if (ch.children.length > 0 && ch.children[ch.children.length - 1] instanceof Or) { + importChildOrs(ch.children[ch.children.length - 1] as Or); + } else { + this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + orInputCounter++; + this._currentId++; + } + } + }; + if (!op.doNotCreateContact) { + importChildOrs(op); + } + } else if (op instanceof CompareOperator) { + let i = 1; + for (const ch of op.children) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + i++; + this._currentId++; + } + } else if (op instanceof Move || op instanceof S_Move || op instanceof Convert) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + if (op instanceof S_Move) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + } else if (op instanceof Convert) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + } else { + for (let n = 0; n < op.children.length - 1; n++) { + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + } + } + } else if (op instanceof And) { + for (let n = 0; n < op.children.length - 1; n++) { + const ch = op.children[n]; + const next = op.children[n + 1]; + if (next instanceof Or) { + this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`); + this._sb.appendLine(`${ch instanceof Signal ? ' ' : ''}`); + for (const orSignal of next.children) { + for (const os of this.getAllOrSignals(orSignal)) { + const opId = os.operationId; + let ipName = 'in'; + if ( + os instanceof BaseOperationOrSignal && + ( + (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof CompareOperator || + (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof InRangeCall || + (os as BaseOperationOrSignal).getFirstChildNotAnd() instanceof OutRangeCall + ) + ) { + ipName = 'pre'; + } + this._sb.appendLine(`${os instanceof Signal ? ' ' : ''}`); + } + } + this._sb.appendLine(''); + this._currentId++; + } else { + this._sb.appendLine(`${op.debugInfo !== null ? ` ` : ''}`); + let outName = 'out'; + if (ch instanceof FunctionCall || ch instanceof S_Move || ch instanceof Move || ch instanceof Convert) + outName = 'eno'; + + const srcName = ch instanceof Signal ? (ch as Signal).name : ch.constructor.name; + const dstName = next instanceof Signal ? (next as Signal).name : next.constructor.name; + this._sb.appendLine(` `); + + if (next instanceof CompareOperator || next instanceof InRangeCall || next instanceof OutRangeCall) { + this._sb.appendLine(` `); + } else if (next instanceof CTUCall || next instanceof CTUDCall) { + this._sb.appendLine(` `); + } else if (next instanceof FunctionCall) { + const noEnName = (next as FunctionCall).hasNoEn ? 'in' : 'en'; + this._sb.appendLine(` `); + } else if (this.isIFunctionOperation(next)) { + this._sb.appendLine(` `); + } else if (next instanceof Distributor) { + this._sb.appendLine(''); + for (const c of next.children) { + let akC: IOperationOrSignal = c; + if (c instanceof BaseCoil && c.children.length > 0) { + akC = c.children[c.children.length - 1]; + } else if (c instanceof And && c.children.length > 0) { + akC = c.children[0]; + } + + let l: IOperationOrSignal[] = [akC]; + if (akC instanceof Or) l = akC.children; + + for (const sIn of l) { + for (const s of this.getAllOrSignals(sIn)) { + if (s instanceof CompareOperator || s instanceof InRangeCall || s instanceof OutRangeCall) { + this._sb.appendLine(` `); + } else if (s instanceof FunctionCall) { + const noEnName2 = (s as FunctionCall).hasNoEn ? 'in' : 'en'; + this._sb.appendLine(` `); + } else if (this.isIFunctionOperation(s)) { + this._sb.appendLine(` `); + } else { + this._sb.appendLine(` `); + } + } + } + } + } else { + this._sb.appendLine(` `); + } + this._sb.appendLine(''); + this._currentId++; + } + } + } else if (op instanceof BaseCoil) { + if (op.children.length > 1) { + let ch: IOperationOrSignal; + if (op.children[1] instanceof Signal) { + ch = op.children[1]; + } else { + ch = op.children[1].children[op.children[1].children.length - 1]; + } + + if ( + op.children[1] instanceof Or || + op.children[1] instanceof CompareOperator || + op.children[1] instanceof Move || + op.children[1] instanceof Convert || + op.children[1] instanceof S_Move || + op.children[1] instanceof BaseCoil + ) { + ch = op.children[op.children.length - 1]; + } + const sig = op.children[0]; + + let outName = 'out'; + if (ch instanceof FunctionCall || ch instanceof Move || ch instanceof S_Move || ch instanceof Convert) + outName = 'eno'; + + this._sb.appendLine(``); + this._sb.appendLine(` `); + this._sb.appendLine(` `); + this._sb.appendLine(''); + this._currentId++; + } + } + } + + private addPowerrails(network: Network): void { + const ops = KopCodeHelper.flattenOrdered(network.children, x => x.children); + this._sb.appendLine(``); + this._sb.appendLine(''); + + for (const s of ops) { + let noPowerRail = false; + let p: IOperationOrSignal = s; + + if (s instanceof FunctionCall) { + while (p.parent !== null) { + const pp = p.parent; + if ( + pp instanceof And || + pp instanceof CompareOperator || + pp instanceof Convert || + pp instanceof Move || + pp instanceof S_Move + ) { + if (pp.children.indexOf(p) > 0) noPowerRail = true; + } + p = p.parent; + if (noPowerRail) break; + } + if (!noPowerRail) { + if (s instanceof InRangeCall || s instanceof OutRangeCall) { + this._sb.appendLine(` `); + } else { + this._sb.appendLine(` `); + } + } + noPowerRail = true; + } else if (s.parent instanceof FunctionCall) { + noPowerRail = true; + } else if (s.parent instanceof BaseCoil && s.parent.children.indexOf(p) === 0) { + noPowerRail = true; + } else if ( + (s instanceof Coil || s instanceof SCoil || s instanceof RCoil) && + s.children.length === 1 && + s.children[0] instanceof Signal && + (s.parent === null || s.parent instanceof Network) + ) { + this._sb.appendLine(` `); + } else if (s instanceof Signal) { + if (p.parent instanceof FunctionCall) { + noPowerRail = true; + } else { + while (p.parent !== null) { + const pp = p.parent; + if ( + pp instanceof And || + pp instanceof CompareOperator || + pp instanceof Convert || + pp instanceof Move || + pp instanceof S_Move + ) { + if (pp.children.indexOf(p) > 0) noPowerRail = true; + } else if (pp instanceof FunctionCall) { + break; + } + p = p.parent; + if (noPowerRail) break; + } + } + } + + if (!noPowerRail && s instanceof Signal) { + const sng = s as Signal; + const par = s.parent; + + if (par instanceof CompareOperator) { + this._sb.appendLine(` `); + } else if (par instanceof Move || par instanceof S_Move || par instanceof Convert) { + this._sb.appendLine(` `); + } else { + this._sb.appendLine(` `); + } + } + } + this._sb.appendLine(''); + this._currentId++; + } + + private fixChildAndsAndSingleOr(s: IOperationOrSignal | null): void { + let fixAgain = false; + const newChildren: IOperationOrSignal[] = []; + if (s !== null && s.children !== null) { + if (s instanceof BaseCoil && s.children.length === 2 && s.children[1] instanceof Signal) { + s.children[1] = new And(s.children[1]); + } else { + for (const op of s.children.slice()) { + if ((s instanceof And || s instanceof Or) && op instanceof Or && op.children.length === 1) { + for (const p of op.children) { + newChildren.push(p); + fixAgain = true; + } + } else if (s instanceof And && op instanceof And) { + for (const p of op.children) { + newChildren.push(p); + s.children.push(p); + fixAgain = true; + } + } else { + newChildren.push(op); + this.fixChildAndsAndSingleOr(op); + } + } + s.children = newChildren; + if (fixAgain) this.fixChildAndsAndSingleOr(s); + } + } + } + + private escapeForXml(text: string): string { + return text.replace(//g, '>'); + } + + private printTreeParent(signal: IOperationOrSignal | null): string { + if (signal !== null) { + let t = ''; + if (signal instanceof Signal) t = ` (${(signal as Signal).name})`; + if (signal instanceof Coil) t = ` (${(signal as Coil).signal.name})`; + if (signal instanceof Network) t = ` (${(signal as Network).networkTitle ?? ''})`; + if (signal instanceof CodeBlock) t = ` (${(signal as CodeBlock).name ?? ''})`; + const p = this.printTreeParent(signal.parent); + return (p !== '' ? p + ' -> ' : '') + signal.constructor.name + t; + } + return ''; + } + + private setParent(s: IOperationOrSignal): void { + for (const op of s.children) { + if (op.parent !== null) { + throw new Error( + '\n\nIOperationOrSignal reused wich is not valid!\n' + + this.printTreeParent(op.parent) + '\n\n' + + this.printTreeParent(s) + '\n\n' + ); + } + op.parent = s; + this.setParent(op); + } + } + + getXml(idRef: { value: number }): string { + this.fixChildAndsAndSingleOr(this._block); + this.setParent(this._block); + const allChildren = flatten(this._block.children, x => x.children); + const networks = allChildren.filter((x): x is Network => x instanceof Network); + + for (const network of networks) { + this.checkAndAndOr(this._block, network); + try { + this._sb.appendLine(` `); + idRef.value++; + this._sb.appendLine(''); + if (network.children.length > 0) { + this._sb.appendLine(''); + this._sb.appendLine(''); + this.addSignalDefinitions(network); + this.addContactDefinitions(network, this._block); + this._sb.appendLine(''); + this._sb.appendLine(''); + this.addPowerrails(network); + this.addWires(network); + this._sb.appendLine(''); + this._sb.appendLine(''); + } + this._sb.appendLine(`${this._block.safety ? 'F_LAD' : 'LAD'}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine('de-DE'); + this._sb.appendLine(`${network.description}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine('en-GB'); + this._sb.appendLine(`${network.descriptionEnglish}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine('de-DE'); + this._sb.appendLine(`${this.escapeForXml(network.networkTitle ?? '')}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(``); + idRef.value++; + this._sb.appendLine(''); + this._sb.appendLine('en-GB'); + this._sb.appendLine(`${this.escapeForXml(network.networkTitleEnglish ?? '')}`); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + this._sb.appendLine(''); + } catch (ex) { + throw new Error(`Error generating Network: ${network.networkTitle} in Block: ${this._block.name}\n${(ex as Error).message}`); + } + } + + return this._sb.toString(); + } + + getAllOrSignals(sng: IOperationOrSignal): IOperationOrSignal[] { + const result: IOperationOrSignal[] = []; + if (sng instanceof And) { + if (sng.children.length > 0 && sng.children[0] instanceof Or) { + const or = sng.children[0] as Or; + for (const o of or.children) { + result.push(...this.getAllOrSignals(o)); + } + } else { + result.push(sng.children[0]); + } + } else { + result.push(sng); + } + return result; + } + + private isIPartName(op: IOperationOrSignal): boolean { + return 'partName' in op && typeof (op as any).partName === 'string'; + } + + private isIFunctionOperation(op: IOperationOrSignal): boolean { + // Check if op implements IFunctionOperation (Move, Convert, S_Move) + return op instanceof Move || op instanceof Convert || op instanceof S_Move; + } +} diff --git a/TiaCodegen-ts/src/Commands/And.ts b/TiaCodegen-ts/src/Commands/And.ts new file mode 100644 index 0000000..4948c91 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/And.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class And extends BaseOperationOrSignal { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts b/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts new file mode 100644 index 0000000..057d33e --- /dev/null +++ b/TiaCodegen-ts/src/Commands/BaseOperationOrSignal.ts @@ -0,0 +1,69 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; + +export abstract class BaseOperationOrSignal implements IOperationOrSignal { + debugInfo: string | null = null; + private _operationId: number = 0; + children: IOperationOrSignal[]; + parent: IOperationOrSignal | null = null; + doNotCreateContact: boolean = false; + private _cardinality: number = 0; + + get cardinality(): number { return this._cardinality; } + set cardinality(value: number) { this._cardinality = value; } + + constructor(...operationOrSignals: IOperationOrSignal[]) { + this.children = []; + if (operationOrSignals) { + this.children.push(...operationOrSignals); + } + } + + get operationId(): number { return this._operationId; } + set operationId(value: number) { this._operationId = value; } + + createContactAndFillCardinality(parent: IOperationOrSignal): number { + this.cardinality = 1; + if (this.children.length > 0 && this.children[this.children.length - 1] instanceof Or) { + this.cardinality = this.children[this.children.length - 1].createContactAndFillCardinality(parent); + this.children[this.children.length - 1].doNotCreateContact = true; + } + return this.cardinality; + } + + add(...operationOrSignals: IOperationOrSignal[]): void { + this.children.push(...operationOrSignals); + } + + toString(): string { + if (this instanceof And || this instanceof Or) { + return `${this.constructor.name} (${this.children.map(x => x.toString()).join(',')})`; + } + return this.constructor.name; + } + + getFirstChildNotAnd(): IOperationOrSignal { + if (this instanceof And) { + const ch1 = this.children[0]; + if (ch1 instanceof BaseOperationOrSignal) { + return ch1.getFirstChildNotAnd(); + } + } + return this; + } + + clone(): IOperationOrSignal { + // Subclasses that need cloning should override this. + // Generic approach: create a new instance of the same class. + const inst = new (this.constructor as new () => BaseOperationOrSignal)(); + inst.debugInfo = this.debugInfo; + inst.doNotCreateContact = this.doNotCreateContact; + for (const c of this.children) { + inst.children.push(c.clone()); + } + return inst; + } +} + +// Forward declarations to avoid circular imports - these are resolved at runtime +import { And } from './And'; +import { Or } from './Or'; diff --git a/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts b/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts new file mode 100644 index 0000000..8fc7b30 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/BaseCoil.ts @@ -0,0 +1,42 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { ICoil } from '../../Interfaces/ICoil'; +import { Signal } from '../Signals/Signal'; + +export class BaseCoil implements IOperationOrSignal, ICoil { + debugInfo: string | null = null; + negated: boolean = false; + signal: Signal; + children: IOperationOrSignal[]; + operationId: number = 0; + parent: IOperationOrSignal | null = null; + doNotCreateContact: boolean = false; + cardinality: number = 0; + + constructor(signal: Signal, op: IOperationOrSignal | null = null) { + this.signal = signal; + this.children = []; + this.children.push(signal); + if (op !== null) { + this.children.push(op); + } + } + + createContactAndFillCardinality(_parent: IOperationOrSignal): number { + this.cardinality = 1; + return 1; + } + + toString(): string { + return this.constructor.name; + } + + clone(): IOperationOrSignal { + const inst = new (this.constructor as new (s: Signal) => BaseCoil)(this.signal.clone() as Signal); + inst.debugInfo = this.debugInfo; + inst.negated = this.negated; + for (const c of this.children.slice(1)) { + inst.children.push(c.clone()); + } + return inst; + } +} diff --git a/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts b/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts new file mode 100644 index 0000000..907c454 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/BaseNPCoil.ts @@ -0,0 +1,15 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { Signal } from '../Signals/Signal'; +import { BaseCoil } from './BaseCoil'; + +export class BaseNPCoil extends BaseCoil { + helpSignal: Signal | null; + + constructor(signal: Signal, helpSignal: Signal | null, op: IOperationOrSignal | null = null) { + super(signal, op); + this.helpSignal = helpSignal; + if (helpSignal !== null) { + this.children.push(helpSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Coils/Coil.ts b/TiaCodegen-ts/src/Commands/Coils/Coil.ts new file mode 100644 index 0000000..b5b862d --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/Coil.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { Signal } from '../Signals/Signal'; +import { BaseCoil } from './BaseCoil'; + +export class Coil extends BaseCoil { + constructor(signal: Signal, op: IOperationOrSignal | null = null) { + super(signal, op); + } +} diff --git a/TiaCodegen-ts/src/Commands/Coils/PCoil.ts b/TiaCodegen-ts/src/Commands/Coils/PCoil.ts new file mode 100644 index 0000000..bcee6b4 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/PCoil.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { Signal } from '../Signals/Signal'; +import { BaseNPCoil } from './BaseNPCoil'; + +export class PCoil extends BaseNPCoil { + constructor(signal: Signal, helpSignal: Signal, op: IOperationOrSignal | null = null) { + super(signal, helpSignal, op); + } +} diff --git a/TiaCodegen-ts/src/Commands/Coils/RCoil.ts b/TiaCodegen-ts/src/Commands/Coils/RCoil.ts new file mode 100644 index 0000000..0329e1b --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/RCoil.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { Signal } from '../Signals/Signal'; +import { BaseCoil } from './BaseCoil'; + +export class RCoil extends BaseCoil { + constructor(signal: Signal, op: IOperationOrSignal | null = null) { + super(signal, op); + } +} diff --git a/TiaCodegen-ts/src/Commands/Coils/SCoil.ts b/TiaCodegen-ts/src/Commands/Coils/SCoil.ts new file mode 100644 index 0000000..bba4ee5 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Coils/SCoil.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { Signal } from '../Signals/Signal'; +import { BaseCoil } from './BaseCoil'; + +export class SCoil extends BaseCoil { + constructor(signal: Signal, op: IOperationOrSignal | null = null) { + super(signal, op); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts b/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts new file mode 100644 index 0000000..c458647 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/CompareOperator.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { BaseOperationOrSignal } from '../BaseOperationOrSignal'; + +export abstract class CompareOperator extends BaseOperationOrSignal { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts b/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts new file mode 100644 index 0000000..d6d6b20 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Eq.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Eq extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts b/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts new file mode 100644 index 0000000..584ecf1 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Ge.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Ge extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts b/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts new file mode 100644 index 0000000..2412406 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Gt.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Gt extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts new file mode 100644 index 0000000..0670f48 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionCall } from '../Functions/Base/SystemFunctionCall'; + +export class InRangeCall extends SystemFunctionCall { + constructor( + min: IOperationOrSignal, + inParam: IOperationOrSignal, + max: IOperationOrSignal, + out: IOperationOrSignal, + eno: IOperationOrSignal | null = null, + ) { + super('InRange', eno); + this.disableEno = false; + this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input); + this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input); + this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Output); + this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Le.ts b/TiaCodegen-ts/src/Commands/Comparisons/Le.ts new file mode 100644 index 0000000..8d55b5f --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Le.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Le extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts b/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts new file mode 100644 index 0000000..ea1db20 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Lt.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Lt extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts b/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts new file mode 100644 index 0000000..b4403db --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/Ne.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { CompareOperator } from './CompareOperator'; + +export class Ne extends CompareOperator { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts new file mode 100644 index 0000000..a3480a1 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionCall } from '../Functions/Base/SystemFunctionCall'; + +export class OutRangeCall extends SystemFunctionCall { + constructor( + min: IOperationOrSignal, + inParam: IOperationOrSignal, + max: IOperationOrSignal, + out: IOperationOrSignal, + eno: IOperationOrSignal | null = null, + ) { + super('OutRange', eno); + this.disableEno = false; + this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input); + this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input); + this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Output); + this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Convert.ts b/TiaCodegen-ts/src/Commands/Convert.ts new file mode 100644 index 0000000..7e6ab78 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Convert.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { IFunctionOperation } from '../Interfaces/IFunctionOperation'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class Convert extends BaseOperationOrSignal implements IFunctionOperation { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } +} diff --git a/TiaCodegen-ts/src/Commands/Distributor.ts b/TiaCodegen-ts/src/Commands/Distributor.ts new file mode 100644 index 0000000..632fc13 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Distributor.ts @@ -0,0 +1,18 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class Distributor extends BaseOperationOrSignal { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } + + createContactAndFillCardinality(parent: IOperationOrSignal): number { + let c = 0; + this.operationId = parent.operationId; + for (const op of this.children) { + c += op.createContactAndFillCardinality(this); + } + this.cardinality = c; + return this.cardinality; + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts b/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts new file mode 100644 index 0000000..4a14d9a --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/AckGlCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class AckGlCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + ackGlob: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('ACK_GL', instanceName, eno); + this.iface['ACK_GLOB'] = new IOperationOrSignalDirectionWrapper(ackGlob, Direction.Input); + + this.additionalSafetyTemplateValues = ` +1 +0 +DInt +`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts new file mode 100644 index 0000000..466c9ff --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/AddCall.ts @@ -0,0 +1,121 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; +import { VariableArithmeticCall } from './VariableArithmeticCall'; + +export class AddCall extends VariableArithmeticCall { + constructor( + type: string, + in1: IOperationOrSignal, + in2: IOperationOrSignal, + in3: IOperationOrSignal | null = null, + in4: IOperationOrSignal | null = null, + in5: IOperationOrSignal | null = null, + in6: IOperationOrSignal | null = null, + in7: IOperationOrSignal | null = null, + in8: IOperationOrSignal | null = null, + in9: IOperationOrSignal | null = null, + in10: IOperationOrSignal | null = null, + in11: IOperationOrSignal | null = null, + in12: IOperationOrSignal | null = null, + in13: IOperationOrSignal | null = null, + in14: IOperationOrSignal | null = null, + in15: IOperationOrSignal | null = null, + in16: IOperationOrSignal | null = null, + in17: IOperationOrSignal | null = null, + in18: IOperationOrSignal | null = null, + in19: IOperationOrSignal | null = null, + in20: IOperationOrSignal | null = null, + in21: IOperationOrSignal | null = null, + in22: IOperationOrSignal | null = null, + in23: IOperationOrSignal | null = null, + in24: IOperationOrSignal | null = null, + in25: IOperationOrSignal | null = null, + in26: IOperationOrSignal | null = null, + in27: IOperationOrSignal | null = null, + in28: IOperationOrSignal | null = null, + in29: IOperationOrSignal | null = null, + in30: IOperationOrSignal | null = null, + in31: IOperationOrSignal | null = null, + in32: IOperationOrSignal | null = null, + in33: IOperationOrSignal | null = null, + in34: IOperationOrSignal | null = null, + in35: IOperationOrSignal | null = null, + in36: IOperationOrSignal | null = null, + in37: IOperationOrSignal | null = null, + in38: IOperationOrSignal | null = null, + in39: IOperationOrSignal | null = null, + in40: IOperationOrSignal | null = null, + in41: IOperationOrSignal | null = null, + in42: IOperationOrSignal | null = null, + in43: IOperationOrSignal | null = null, + in44: IOperationOrSignal | null = null, + in45: IOperationOrSignal | null = null, + in46: IOperationOrSignal | null = null, + in47: IOperationOrSignal | null = null, + in48: IOperationOrSignal | null = null, + in49: IOperationOrSignal | null = null, + in50: IOperationOrSignal | null = null, + out1: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('Add', eno); + this.disableEno = true; + this.type = type; + this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input); + this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input); + this.iface['IN3'] = new IOperationOrSignalDirectionWrapper(in3, Direction.Input); + this.iface['IN4'] = new IOperationOrSignalDirectionWrapper(in4, Direction.Input); + this.iface['IN5'] = new IOperationOrSignalDirectionWrapper(in5, Direction.Input); + this.iface['IN6'] = new IOperationOrSignalDirectionWrapper(in6, Direction.Input); + this.iface['IN7'] = new IOperationOrSignalDirectionWrapper(in7, Direction.Input); + this.iface['IN8'] = new IOperationOrSignalDirectionWrapper(in8, Direction.Input); + this.iface['IN9'] = new IOperationOrSignalDirectionWrapper(in9, Direction.Input); + this.iface['IN10'] = new IOperationOrSignalDirectionWrapper(in10, Direction.Input); + this.iface['IN11'] = new IOperationOrSignalDirectionWrapper(in11, Direction.Input); + this.iface['IN12'] = new IOperationOrSignalDirectionWrapper(in12, Direction.Input); + this.iface['IN13'] = new IOperationOrSignalDirectionWrapper(in13, Direction.Input); + this.iface['IN14'] = new IOperationOrSignalDirectionWrapper(in14, Direction.Input); + this.iface['IN15'] = new IOperationOrSignalDirectionWrapper(in15, Direction.Input); + this.iface['IN16'] = new IOperationOrSignalDirectionWrapper(in16, Direction.Input); + this.iface['IN17'] = new IOperationOrSignalDirectionWrapper(in17, Direction.Input); + this.iface['IN18'] = new IOperationOrSignalDirectionWrapper(in18, Direction.Input); + this.iface['IN19'] = new IOperationOrSignalDirectionWrapper(in19, Direction.Input); + this.iface['IN20'] = new IOperationOrSignalDirectionWrapper(in20, Direction.Input); + this.iface['IN21'] = new IOperationOrSignalDirectionWrapper(in21, Direction.Input); + this.iface['IN22'] = new IOperationOrSignalDirectionWrapper(in22, Direction.Input); + this.iface['IN23'] = new IOperationOrSignalDirectionWrapper(in23, Direction.Input); + this.iface['IN24'] = new IOperationOrSignalDirectionWrapper(in24, Direction.Input); + this.iface['IN25'] = new IOperationOrSignalDirectionWrapper(in25, Direction.Input); + this.iface['IN26'] = new IOperationOrSignalDirectionWrapper(in26, Direction.Input); + this.iface['IN27'] = new IOperationOrSignalDirectionWrapper(in27, Direction.Input); + this.iface['IN28'] = new IOperationOrSignalDirectionWrapper(in28, Direction.Input); + this.iface['IN29'] = new IOperationOrSignalDirectionWrapper(in29, Direction.Input); + this.iface['IN30'] = new IOperationOrSignalDirectionWrapper(in30, Direction.Input); + this.iface['IN31'] = new IOperationOrSignalDirectionWrapper(in31, Direction.Input); + this.iface['IN32'] = new IOperationOrSignalDirectionWrapper(in32, Direction.Input); + this.iface['IN33'] = new IOperationOrSignalDirectionWrapper(in33, Direction.Input); + this.iface['IN34'] = new IOperationOrSignalDirectionWrapper(in34, Direction.Input); + this.iface['IN35'] = new IOperationOrSignalDirectionWrapper(in35, Direction.Input); + this.iface['IN36'] = new IOperationOrSignalDirectionWrapper(in36, Direction.Input); + this.iface['IN37'] = new IOperationOrSignalDirectionWrapper(in37, Direction.Input); + this.iface['IN38'] = new IOperationOrSignalDirectionWrapper(in38, Direction.Input); + this.iface['IN39'] = new IOperationOrSignalDirectionWrapper(in39, Direction.Input); + this.iface['IN40'] = new IOperationOrSignalDirectionWrapper(in40, Direction.Input); + this.iface['IN41'] = new IOperationOrSignalDirectionWrapper(in41, Direction.Input); + this.iface['IN42'] = new IOperationOrSignalDirectionWrapper(in42, Direction.Input); + this.iface['IN43'] = new IOperationOrSignalDirectionWrapper(in43, Direction.Input); + this.iface['IN44'] = new IOperationOrSignalDirectionWrapper(in44, Direction.Input); + this.iface['IN45'] = new IOperationOrSignalDirectionWrapper(in45, Direction.Input); + this.iface['IN46'] = new IOperationOrSignalDirectionWrapper(in46, Direction.Input); + this.iface['IN47'] = new IOperationOrSignalDirectionWrapper(in47, Direction.Input); + this.iface['IN48'] = new IOperationOrSignalDirectionWrapper(in48, Direction.Input); + this.iface['IN49'] = new IOperationOrSignalDirectionWrapper(in49, Direction.Input); + this.iface['IN50'] = new IOperationOrSignalDirectionWrapper(in50, Direction.Input); + this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts new file mode 100644 index 0000000..eee7a97 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ArithmeticCall.ts @@ -0,0 +1,10 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { SystemFunctionCall } from '../Base/SystemFunctionCall'; + +export abstract class ArithmeticCall extends SystemFunctionCall { + type: string = ''; + + constructor(functionName: string, eno: IOperationOrSignal | null = null) { + super(functionName, eno); + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts new file mode 100644 index 0000000..26b9c32 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/DivCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; +import { ArithmeticCall } from './ArithmeticCall'; + +export class DivCall extends ArithmeticCall { + constructor( + type: string, + in1: IOperationOrSignal, + in2: IOperationOrSignal, + out1: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('Div', eno); + this.disableEno = true; + this.type = type; + this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input); + this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input); + this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts new file mode 100644 index 0000000..0b24db0 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/ModCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; +import { ArithmeticCall } from './ArithmeticCall'; + +export class ModCall extends ArithmeticCall { + constructor( + type: string, + in1: IOperationOrSignal, + in2: IOperationOrSignal, + out1: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('Mod', eno); + this.disableEno = true; + this.type = type; + this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input); + this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input); + this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts new file mode 100644 index 0000000..e8e681e --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/MulCall.ts @@ -0,0 +1,121 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; +import { VariableArithmeticCall } from './VariableArithmeticCall'; + +export class MulCall extends VariableArithmeticCall { + constructor( + type: string, + in1: IOperationOrSignal, + in2: IOperationOrSignal, + in3: IOperationOrSignal | null = null, + in4: IOperationOrSignal | null = null, + in5: IOperationOrSignal | null = null, + in6: IOperationOrSignal | null = null, + in7: IOperationOrSignal | null = null, + in8: IOperationOrSignal | null = null, + in9: IOperationOrSignal | null = null, + in10: IOperationOrSignal | null = null, + in11: IOperationOrSignal | null = null, + in12: IOperationOrSignal | null = null, + in13: IOperationOrSignal | null = null, + in14: IOperationOrSignal | null = null, + in15: IOperationOrSignal | null = null, + in16: IOperationOrSignal | null = null, + in17: IOperationOrSignal | null = null, + in18: IOperationOrSignal | null = null, + in19: IOperationOrSignal | null = null, + in20: IOperationOrSignal | null = null, + in21: IOperationOrSignal | null = null, + in22: IOperationOrSignal | null = null, + in23: IOperationOrSignal | null = null, + in24: IOperationOrSignal | null = null, + in25: IOperationOrSignal | null = null, + in26: IOperationOrSignal | null = null, + in27: IOperationOrSignal | null = null, + in28: IOperationOrSignal | null = null, + in29: IOperationOrSignal | null = null, + in30: IOperationOrSignal | null = null, + in31: IOperationOrSignal | null = null, + in32: IOperationOrSignal | null = null, + in33: IOperationOrSignal | null = null, + in34: IOperationOrSignal | null = null, + in35: IOperationOrSignal | null = null, + in36: IOperationOrSignal | null = null, + in37: IOperationOrSignal | null = null, + in38: IOperationOrSignal | null = null, + in39: IOperationOrSignal | null = null, + in40: IOperationOrSignal | null = null, + in41: IOperationOrSignal | null = null, + in42: IOperationOrSignal | null = null, + in43: IOperationOrSignal | null = null, + in44: IOperationOrSignal | null = null, + in45: IOperationOrSignal | null = null, + in46: IOperationOrSignal | null = null, + in47: IOperationOrSignal | null = null, + in48: IOperationOrSignal | null = null, + in49: IOperationOrSignal | null = null, + in50: IOperationOrSignal | null = null, + out1: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('Mul', eno); + this.disableEno = true; + this.type = type; + this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input); + this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input); + this.iface['IN3'] = new IOperationOrSignalDirectionWrapper(in3, Direction.Input); + this.iface['IN4'] = new IOperationOrSignalDirectionWrapper(in4, Direction.Input); + this.iface['IN5'] = new IOperationOrSignalDirectionWrapper(in5, Direction.Input); + this.iface['IN6'] = new IOperationOrSignalDirectionWrapper(in6, Direction.Input); + this.iface['IN7'] = new IOperationOrSignalDirectionWrapper(in7, Direction.Input); + this.iface['IN8'] = new IOperationOrSignalDirectionWrapper(in8, Direction.Input); + this.iface['IN9'] = new IOperationOrSignalDirectionWrapper(in9, Direction.Input); + this.iface['IN10'] = new IOperationOrSignalDirectionWrapper(in10, Direction.Input); + this.iface['IN11'] = new IOperationOrSignalDirectionWrapper(in11, Direction.Input); + this.iface['IN12'] = new IOperationOrSignalDirectionWrapper(in12, Direction.Input); + this.iface['IN13'] = new IOperationOrSignalDirectionWrapper(in13, Direction.Input); + this.iface['IN14'] = new IOperationOrSignalDirectionWrapper(in14, Direction.Input); + this.iface['IN15'] = new IOperationOrSignalDirectionWrapper(in15, Direction.Input); + this.iface['IN16'] = new IOperationOrSignalDirectionWrapper(in16, Direction.Input); + this.iface['IN17'] = new IOperationOrSignalDirectionWrapper(in17, Direction.Input); + this.iface['IN18'] = new IOperationOrSignalDirectionWrapper(in18, Direction.Input); + this.iface['IN19'] = new IOperationOrSignalDirectionWrapper(in19, Direction.Input); + this.iface['IN20'] = new IOperationOrSignalDirectionWrapper(in20, Direction.Input); + this.iface['IN21'] = new IOperationOrSignalDirectionWrapper(in21, Direction.Input); + this.iface['IN22'] = new IOperationOrSignalDirectionWrapper(in22, Direction.Input); + this.iface['IN23'] = new IOperationOrSignalDirectionWrapper(in23, Direction.Input); + this.iface['IN24'] = new IOperationOrSignalDirectionWrapper(in24, Direction.Input); + this.iface['IN25'] = new IOperationOrSignalDirectionWrapper(in25, Direction.Input); + this.iface['IN26'] = new IOperationOrSignalDirectionWrapper(in26, Direction.Input); + this.iface['IN27'] = new IOperationOrSignalDirectionWrapper(in27, Direction.Input); + this.iface['IN28'] = new IOperationOrSignalDirectionWrapper(in28, Direction.Input); + this.iface['IN29'] = new IOperationOrSignalDirectionWrapper(in29, Direction.Input); + this.iface['IN30'] = new IOperationOrSignalDirectionWrapper(in30, Direction.Input); + this.iface['IN31'] = new IOperationOrSignalDirectionWrapper(in31, Direction.Input); + this.iface['IN32'] = new IOperationOrSignalDirectionWrapper(in32, Direction.Input); + this.iface['IN33'] = new IOperationOrSignalDirectionWrapper(in33, Direction.Input); + this.iface['IN34'] = new IOperationOrSignalDirectionWrapper(in34, Direction.Input); + this.iface['IN35'] = new IOperationOrSignalDirectionWrapper(in35, Direction.Input); + this.iface['IN36'] = new IOperationOrSignalDirectionWrapper(in36, Direction.Input); + this.iface['IN37'] = new IOperationOrSignalDirectionWrapper(in37, Direction.Input); + this.iface['IN38'] = new IOperationOrSignalDirectionWrapper(in38, Direction.Input); + this.iface['IN39'] = new IOperationOrSignalDirectionWrapper(in39, Direction.Input); + this.iface['IN40'] = new IOperationOrSignalDirectionWrapper(in40, Direction.Input); + this.iface['IN41'] = new IOperationOrSignalDirectionWrapper(in41, Direction.Input); + this.iface['IN42'] = new IOperationOrSignalDirectionWrapper(in42, Direction.Input); + this.iface['IN43'] = new IOperationOrSignalDirectionWrapper(in43, Direction.Input); + this.iface['IN44'] = new IOperationOrSignalDirectionWrapper(in44, Direction.Input); + this.iface['IN45'] = new IOperationOrSignalDirectionWrapper(in45, Direction.Input); + this.iface['IN46'] = new IOperationOrSignalDirectionWrapper(in46, Direction.Input); + this.iface['IN47'] = new IOperationOrSignalDirectionWrapper(in47, Direction.Input); + this.iface['IN48'] = new IOperationOrSignalDirectionWrapper(in48, Direction.Input); + this.iface['IN49'] = new IOperationOrSignalDirectionWrapper(in49, Direction.Input); + this.iface['IN50'] = new IOperationOrSignalDirectionWrapper(in50, Direction.Input); + this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts new file mode 100644 index 0000000..9567653 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/SubCall.ts @@ -0,0 +1,25 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; +import { ArithmeticCall } from './ArithmeticCall'; + +export class SubCall extends ArithmeticCall { + constructor( + type: string, + in1: IOperationOrSignal, + in2: IOperationOrSignal, + out1: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('Sub', eno); + this.disableEno = true; + this.type = type; + this.iface['IN1'] = new IOperationOrSignalDirectionWrapper(in1, Direction.Input); + this.iface['IN2'] = new IOperationOrSignalDirectionWrapper(in2, Direction.Input); + this.iface['OUT'] = new IOperationOrSignalDirectionWrapper(out1, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts new file mode 100644 index 0000000..942985c --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Arithmetic/VariableArithmeticCall.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { ArithmeticCall } from './ArithmeticCall'; + +export abstract class VariableArithmeticCall extends ArithmeticCall { + constructor(functionName: string, eno: IOperationOrSignal | null = null) { + super(functionName, eno); + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts new file mode 100644 index 0000000..c048517 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts @@ -0,0 +1,12 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { FunctionCall } from './FunctionCall'; + +export class FunctionBlockCall extends FunctionCall { + instanceName: string; + + constructor(functionName: string, instanceName: string, eno: IOperationOrSignal | null = null) { + super(functionName, eno); + this.functionName = functionName; + this.instanceName = instanceName; + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts new file mode 100644 index 0000000..27f24a3 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionCall.ts @@ -0,0 +1,45 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../../Enums/Direction'; + +export class FunctionCall implements IOperationOrSignal { + safetyTemplateString: string | null = null; + debugInfo: string | null = null; + disableEno: boolean = false; + functionName: string; + version: string | null = null; + additionalInnerXml: string | null = null; + /** Interface map - using plain object to preserve insertion order */ + iface: Record; + additionalSafetyTemplateValues: string | null = null; + children: IOperationOrSignal[]; + eno: IOperationOrSignal | null; + operationId: number = 0; + parent: IOperationOrSignal | null = null; + doNotCreateContact: boolean = false; + cardinality: number = 0; + hasNoEn: boolean = false; + + constructor(functionName: string, eno: IOperationOrSignal | null = null) { + this.functionName = functionName; + this.iface = {}; + this.children = []; + this.eno = eno; + if (eno !== null) { + this.iface['eno'] = new IOperationOrSignalDirectionWrapper(eno, Direction.Eno); + } + } + + createContactAndFillCardinality(_parent: IOperationOrSignal): number { + this.cardinality = 1; + return this.cardinality; + } + + toString(): string { + return `${this.constructor.name}(${this.functionName})`; + } + + clone(): IOperationOrSignal { + throw new Error('Not yet supported'); + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts new file mode 100644 index 0000000..4fcaf2a --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionBlockCall.ts @@ -0,0 +1,12 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { FunctionBlockCall } from './FunctionBlockCall'; + +export class SystemFunctionBlockCall extends FunctionBlockCall { + templateValueName: string | null = null; + templateValueType: string | null = null; + templateValue: string | null = null; + + constructor(functionName: string, instanceName: string, eno: IOperationOrSignal | null = null) { + super(functionName, instanceName, eno); + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts new file mode 100644 index 0000000..9b7fed5 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/Base/SystemFunctionCall.ts @@ -0,0 +1,8 @@ +import { IOperationOrSignal } from '../../../Interfaces/IOperationOrSignal'; +import { FunctionCall } from './FunctionCall'; + +export class SystemFunctionCall extends FunctionCall { + constructor(functionName: string, eno: IOperationOrSignal | null = null) { + super(functionName, eno); + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts b/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts new file mode 100644 index 0000000..b46853c --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/CTUCall.ts @@ -0,0 +1,30 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class CTUCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + r: IOperationOrSignal | null = null, + pv: IOperationOrSignal | null = null, + q: IOperationOrSignal | null = null, + cv: IOperationOrSignal | null = null, + templateValue: string = 'Int', + ) { + super('CTU', instanceName, null); + this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input); + this.iface['PV'] = new IOperationOrSignalDirectionWrapper(pv, Direction.Input); + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['CV'] = new IOperationOrSignalDirectionWrapper(cv, Direction.Output); + + this.templateValueName = 'value_type'; + this.templateValueType = 'Type'; + this.templateValue = templateValue; + this.hasNoEn = true; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts b/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts new file mode 100644 index 0000000..47d2d95 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/CTUDCall.ts @@ -0,0 +1,36 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class CTUDCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + cd: IOperationOrSignal | null = null, + r: IOperationOrSignal | null = null, + ld: IOperationOrSignal | null = null, + pv: IOperationOrSignal | null = null, + qu: IOperationOrSignal | null = null, + qd: IOperationOrSignal | null = null, + cv: IOperationOrSignal | null = null, + templateValue: string = 'Int', + ) { + super('CTUD', instanceName, null); + this.iface['CD'] = new IOperationOrSignalDirectionWrapper(cd, Direction.Input); + this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input); + this.iface['LD'] = new IOperationOrSignalDirectionWrapper(ld, Direction.Input); + this.iface['PV'] = new IOperationOrSignalDirectionWrapper(pv, Direction.Input); + this.iface['QU'] = new IOperationOrSignalDirectionWrapper(qu, Direction.Output); + this.iface['QD'] = new IOperationOrSignalDirectionWrapper(qd, Direction.Output); + this.iface['CV'] = new IOperationOrSignalDirectionWrapper(cv, Direction.Output); + + this.templateValueName = 'value_type'; + this.templateValueType = 'Type'; + this.templateValue = templateValue; + this.hasNoEn = true; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts b/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts new file mode 100644 index 0000000..a311a50 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/FDBACKCall.ts @@ -0,0 +1,39 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class FDBACKCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + on: IOperationOrSignal | null = null, + feedback: IOperationOrSignal | null = null, + qbad_fio: IOperationOrSignal | null = null, + ack_nec: IOperationOrSignal | null = null, + ack: IOperationOrSignal | null = null, + fdb_time: IOperationOrSignal | null = null, + q: IOperationOrSignal | null = null, + error: IOperationOrSignal | null = null, + ack_req: IOperationOrSignal | null = null, + diag: IOperationOrSignal | null = null, + ) { + super('FDBACK', instanceName, null); + this.iface['ON'] = new IOperationOrSignalDirectionWrapper(on, Direction.Input); + this.iface['FEEDBACK'] = new IOperationOrSignalDirectionWrapper(feedback, Direction.Input); + this.iface['QBAD_FIO'] = new IOperationOrSignalDirectionWrapper(qbad_fio, Direction.Input); + this.iface['ACK_NEC'] = new IOperationOrSignalDirectionWrapper(ack_nec, Direction.Input); + this.iface['ACK'] = new IOperationOrSignalDirectionWrapper(ack, Direction.Input); + this.iface['FDB_TIME'] = new IOperationOrSignalDirectionWrapper(fdb_time, Direction.Input); + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['ERROR'] = new IOperationOrSignalDirectionWrapper(error, Direction.Output); + this.iface['ACK_REQ'] = new IOperationOrSignalDirectionWrapper(ack_req, Direction.Output); + this.iface['DIAG'] = new IOperationOrSignalDirectionWrapper(diag, Direction.Output); + + this.additionalSafetyTemplateValues = ` 1 + 0`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts new file mode 100644 index 0000000..7073a98 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/FTrigCall.ts @@ -0,0 +1,21 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class FTrigCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + clk: IOperationOrSignal | null = null, + q: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('F_TRIG', instanceName, eno); + this.iface['CLK'] = new IOperationOrSignalDirectionWrapper(clk, Direction.Input); + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts new file mode 100644 index 0000000..fbd4ed0 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/NTrigCall.ts @@ -0,0 +1,12 @@ +import { Signal } from '../Signals/Signal'; +import { IPartName } from '../../Interfaces/IPartName'; +import { BaseNPCoil } from '../Coils/BaseNPCoil'; + +export class NTrigCall extends BaseNPCoil implements IPartName { + partName: string; + + constructor(signal: Signal) { + super(signal, null, null); + this.partName = 'NBox'; + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts new file mode 100644 index 0000000..22e4b89 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/PTrigCall.ts @@ -0,0 +1,12 @@ +import { Signal } from '../Signals/Signal'; +import { IPartName } from '../../Interfaces/IPartName'; +import { BaseNPCoil } from '../Coils/BaseNPCoil'; + +export class PTrigCall extends BaseNPCoil implements IPartName { + partName: string; + + constructor(signal: Signal) { + super(signal, null, null); + this.partName = 'PBox'; + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts b/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts new file mode 100644 index 0000000..2f9d8f7 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/RTrigCall.ts @@ -0,0 +1,21 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class RTrigCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + clk: IOperationOrSignal | null = null, + q: IOperationOrSignal | null = null, + eno: IOperationOrSignal | null = null, + ) { + super('R_TRIG', instanceName, eno); + this.iface['CLK'] = new IOperationOrSignalDirectionWrapper(clk, Direction.Input); + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts b/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts new file mode 100644 index 0000000..26ecf1e --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/TOFCall.ts @@ -0,0 +1,35 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class TOFCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + pt: IOperationOrSignal | null = null, + + q: IOperationOrSignal | null = null, + et: IOperationOrSignal | null = null, + ) { + super('TOF', instanceName, null); + this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input); + + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output); + + this.templateValueName = 'time_type'; + this.templateValueType = 'Type'; + this.templateValue = 'Time'; + this.hasNoEn = true; + + this.safetyTemplateString = ` 1 + 0 + 0 + 0 + DInt`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/TONCall.ts b/TiaCodegen-ts/src/Commands/Functions/TONCall.ts new file mode 100644 index 0000000..29178f6 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/TONCall.ts @@ -0,0 +1,35 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class TONCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + pt: IOperationOrSignal | null = null, + + q: IOperationOrSignal | null = null, + et: IOperationOrSignal | null = null, + ) { + super('TON', instanceName, null); + this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input); + + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output); + + this.templateValueName = 'time_type'; + this.templateValueType = 'Type'; + this.templateValue = 'Time'; + this.hasNoEn = true; + + this.safetyTemplateString = ` 1 + 0 + 0 + 0 + DInt`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts b/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts new file mode 100644 index 0000000..d9c5a77 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/TONRCall.ts @@ -0,0 +1,35 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class TONRCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + pt: IOperationOrSignal | null = null, + r: IOperationOrSignal | null = null, + q: IOperationOrSignal | null = null, + et: IOperationOrSignal | null = null, + ) { + super('TONR', instanceName, null); + this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input); + this.iface['R'] = new IOperationOrSignalDirectionWrapper(r, Direction.Input); + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output); + + this.templateValueName = 'time_type'; + this.templateValueType = 'Type'; + this.templateValue = 'Time'; + this.hasNoEn = true; + + this.safetyTemplateString = ` 1 + 0 + 0 + 0 + DInt`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Functions/TPCall.ts b/TiaCodegen-ts/src/Commands/Functions/TPCall.ts new file mode 100644 index 0000000..6591e3d --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Functions/TPCall.ts @@ -0,0 +1,35 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { IOperationOrSignalDirectionWrapper } from '../../Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../../Enums/Direction'; +import { SystemFunctionBlockCall } from './Base/SystemFunctionBlockCall'; + +export class TPCall extends SystemFunctionBlockCall { + constructor( + instanceName: string, + pt: IOperationOrSignal | null = null, + + q: IOperationOrSignal | null = null, + et: IOperationOrSignal | null = null, + ) { + super('TP', instanceName, null); + this.iface['PT'] = new IOperationOrSignalDirectionWrapper(pt, Direction.Input); + + this.iface['Q'] = new IOperationOrSignalDirectionWrapper(q, Direction.Output); + this.iface['ET'] = new IOperationOrSignalDirectionWrapper(et, Direction.Output); + + this.templateValueName = 'time_type'; + this.templateValueType = 'Type'; + this.templateValue = 'Time'; + this.hasNoEn = true; + + this.safetyTemplateString = ` 1 + 0 + 0 + 0 + DInt`; + + for (const w of Object.values(this.iface)) { + if (w.operationOrSignal !== null) this.children.push(w.operationOrSignal); + } + } +} diff --git a/TiaCodegen-ts/src/Commands/Move.ts b/TiaCodegen-ts/src/Commands/Move.ts new file mode 100644 index 0000000..441979a --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Move.ts @@ -0,0 +1,16 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { IFunctionOperation } from '../Interfaces/IFunctionOperation'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class Move extends BaseOperationOrSignal implements IFunctionOperation { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } + + get cardinality(): number { + return this.children.length - 1; + } + set cardinality(_value: number) { + // readonly via getter, ignore sets + } +} diff --git a/TiaCodegen-ts/src/Commands/NCoil.ts b/TiaCodegen-ts/src/Commands/NCoil.ts new file mode 100644 index 0000000..c557cb6 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/NCoil.ts @@ -0,0 +1,9 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { Signal } from './Signals/Signal'; +import { BaseNPCoil } from './Coils/BaseNPCoil'; + +export class NCoil extends BaseNPCoil { + constructor(signal: Signal, helpSignal: Signal, op: IOperationOrSignal | null = null) { + super(signal, helpSignal, op); + } +} diff --git a/TiaCodegen-ts/src/Commands/Not.ts b/TiaCodegen-ts/src/Commands/Not.ts new file mode 100644 index 0000000..f218584 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Not.ts @@ -0,0 +1,29 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { Signal } from './Signals/Signal'; + +export class Not implements IOperationOrSignal { + debugInfo: string | null = null; + children: IOperationOrSignal[]; + operationId: number = 0; + doNotCreateContact: boolean = false; + cardinality: number = 0; + parent: IOperationOrSignal | null = null; + + constructor(signal: Signal) { + this.children = []; + this.children.push(signal); + } + + createContactAndFillCardinality(_parent: IOperationOrSignal): number { + this.cardinality = 1; + return this.cardinality; + } + + clone(): IOperationOrSignal { + return new Not(this.children[0].clone() as Signal); + } + + toString(): string { + return this.constructor.name; + } +} diff --git a/TiaCodegen-ts/src/Commands/Or.ts b/TiaCodegen-ts/src/Commands/Or.ts new file mode 100644 index 0000000..e6a6ad7 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Or.ts @@ -0,0 +1,18 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class Or extends BaseOperationOrSignal { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } + + createContactAndFillCardinality(parent: IOperationOrSignal): number { + let c = 0; + this.operationId = parent.operationId; + for (const op of this.children) { + c += op.createContactAndFillCardinality(this); + } + this.cardinality = c; + return this.cardinality; + } +} diff --git a/TiaCodegen-ts/src/Commands/S_Move.ts b/TiaCodegen-ts/src/Commands/S_Move.ts new file mode 100644 index 0000000..89d9700 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/S_Move.ts @@ -0,0 +1,16 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; +import { IFunctionOperation } from '../Interfaces/IFunctionOperation'; +import { BaseOperationOrSignal } from './BaseOperationOrSignal'; + +export class S_Move extends BaseOperationOrSignal implements IFunctionOperation { + constructor(...operationOrSignals: IOperationOrSignal[]) { + super(...operationOrSignals); + } + + get cardinality(): number { + return 1; + } + set cardinality(_value: number) { + // readonly, ignore + } +} diff --git a/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts b/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts new file mode 100644 index 0000000..02b4479 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Signals/FixedSignal.ts @@ -0,0 +1 @@ +export { Signal, FixedSignal, FixedPeripherySignal } from './Signal'; diff --git a/TiaCodegen-ts/src/Commands/Signals/Signal.ts b/TiaCodegen-ts/src/Commands/Signals/Signal.ts new file mode 100644 index 0000000..ab48da7 --- /dev/null +++ b/TiaCodegen-ts/src/Commands/Signals/Signal.ts @@ -0,0 +1,357 @@ +import { IOperationOrSignal } from '../../Interfaces/IOperationOrSignal'; +import { SignalType } from '../../Enums/SignalType'; +import { StringBuilder } from '../../utils/StringBuilder'; + +export class Signal implements IOperationOrSignal { + debugInfo: string | null = null; + operationId: number = 0; + signalId: number = 0; + name: string; + description: string | null; + signalType: SignalType; + customType: string | null; + children: IOperationOrSignal[]; + parent: IOperationOrSignal | null = null; + doNotCreateContact: boolean = false; + cardinality: number = 0; + + constructor(nameOrValue: string | number | boolean, signalType?: SignalType, customType?: string, description?: string) { + if (typeof nameOrValue === 'number') { + this.name = nameOrValue.toString(); + this.signalType = SignalType.ConstantInt; + this.description = null; + this.customType = null; + } else if (typeof nameOrValue === 'boolean') { + this.name = nameOrValue.toString().toUpperCase(); + this.signalType = SignalType.ConstantBool; + this.description = null; + this.customType = null; + } else { + this.name = nameOrValue; + this.signalType = signalType ?? SignalType.Bool; + this.customType = customType ?? null; + this.description = description ?? null; + } + this.children = []; + } + + createContactAndFillCardinality(_parent: IOperationOrSignal): number { + this.cardinality = 1; + return this.cardinality; + } + + escape(txt: string): string { + return txt.replace(/\\\./g, '\uD83C\uDF34'); + } + + unescape(txt: string): string { + return txt.replace(/\uD83C\uDF34/g, '.').replace(/\\\\/g, '\\'); + } + + clone(): IOperationOrSignal { + const inst = new Signal(this.name, this.signalType, this.customType ?? undefined, this.description ?? undefined); + inst.debugInfo = this.debugInfo; + for (const c of this.children) { + inst.children.push(c.clone()); + } + return inst; + } + + addXmlToStringBuilder(id: number, sb: StringBuilder): void { + const name = this.name; + const signalType = this.signalType; + + if (signalType === SignalType.Constant && !name.startsWith('#')) { + const value = name.indexOf(','); + sb.appendLine(``); + if (value === -1) + sb.appendLine(``); + else + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantBool && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('Bool'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantTime && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantUInt && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('UInt'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantUDInt && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('UDInt'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantInt && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('Int'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantReal && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('Real'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantString && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('String'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.ConstantWord && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.Void && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine('Void'); + sb.appendLine(`${name}`); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.UDT && !name.startsWith('#')) { + sb.appendLine(` `); + sb.appendLine(''); + const escapedParts = this.escape(name).split('.'); + for (let i = 0; i < escapedParts.length; i++) { + const part = this.unescape(escapedParts[i]); + const idx = part.indexOf('[') + 1; + if (idx > 0) { + sb.appendLine(``); + const arrays = part.substring(idx, part.length - 1); + + if (arrays.includes('"')) { + sb.appendLine(''); + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(''); + } else if (!part.includes(']')) { + let p1: string | null = part.slice(idx); + let accessType = 'GlobalVariable'; + if (p1[0] === '#') { + p1 = p1.substring(1); + accessType = 'LocalVariable'; + } + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(``); + while (p1 !== null) { + i++; + p1 = this.unescape(this.escape(name).split('.')[i]); + if (p1.includes(']')) { + sb.appendLine(``); + p1 = null; + } else { + sb.appendLine(``); + } + } + sb.appendLine(''); + sb.appendLine(''); + } else { + for (const arr of arrays.split(',')) { + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine('DInt'); + sb.appendLine(`${arr}`); + sb.appendLine(''); + sb.appendLine(''); + } + } + } else { + sb.appendLine(``); + } + sb.appendLine(''); + } + sb.appendLine('
'); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.Byte && !name.startsWith('#')) { + sb.appendLine(``); + sb.appendLine(''); + for (const parte of this.escape(name).split('.')) { + const part = this.unescape(parte); + sb.appendLine(``); + } + sb.appendLine('
'); + sb.appendLine(''); + sb.appendLine(''); + } else if (signalType === SignalType.String && !name.startsWith('#')) { + sb.appendLine(` `); + sb.appendLine(''); + for (const parte of this.escape(name).split('.')) { + const part = this.unescape(parte); + const idx = part.indexOf('[') + 1; + if (idx > 0) { + sb.appendLine(``); + const arrays = part.substring(idx, part.length - 1); + if (arrays.includes('"')) { + sb.appendLine(''); + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(''); + } else { + for (const arr of arrays.split(',')) { + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine('DInt'); + sb.appendLine(`${arr}`); + sb.appendLine(''); + sb.appendLine(''); + } + } + } else { + sb.appendLine(``); + } + sb.appendLine(''); + } + sb.appendLine('
'); + sb.appendLine(''); + sb.appendLine(''); + } else { + let localName = name; + if (name.startsWith('#')) { + sb.appendLine(``); + localName = name.substring(1); + } else { + sb.appendLine(` `); + } + sb.appendLine(''); + const escapedLocal = this.escape(localName).split('.'); + const cnt = (this instanceof FixedSignal) ? 1 : escapedLocal.length; + for (let i = 0; i < cnt; i++) { + let part = this.unescape(escapedLocal[i]); + if (this instanceof FixedSignal) part = localName; + + const idx = part.indexOf('[') + 1; + if (idx > 0) { + sb.appendLine(``); + const arrays = part.substring(idx, part.length - 1); + + if (arrays.includes('"')) { + sb.appendLine(''); + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(''); + } else if (!part.includes(']')) { + let p1: string | null = part.slice(idx); + let accessType = 'GlobalVariable'; + if (p1[0] === '#') { + p1 = p1.substring(1); + accessType = 'LocalVariable'; + } + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(``); + let noClose = false; + while (p1 !== null) { + i++; + p1 = this.unescape(this.escape(localName).split('.')[i]); + if (p1.includes(',')) { + const innerParts = p1.split(','); + sb.appendLine(``); + for (const p of innerParts.slice(1)) { + let pNe = p.trim(); + if (pNe.includes(']')) { + pNe = pNe.substring(0, pNe.length - 1); + } + if (!isNaN(parseInt(pNe, 10)) && pNe.match(/^\d+$/)) { + noClose = true; + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine('DInt'); + sb.appendLine(`${pNe}`); + sb.appendLine(''); + sb.appendLine(''); + } else { + sb.appendLine(''); + sb.appendLine(''); + let accessTypePne = 'GlobalVariable'; + if (pNe[0] === '#') { + pNe = pNe.substring(1); + accessTypePne = 'LocalVariable'; + } + sb.appendLine(``); + sb.appendLine(''); + sb.appendLine(``); + } + } + if (p1.includes(']')) { + p1 = null; + } + } else { + if (p1.includes(']')) { + sb.appendLine(``); + p1 = null; + } else { + sb.appendLine(``); + } + } + } + if (!noClose) { + sb.appendLine(''); + sb.appendLine(''); + } + } else { + for (const arr of arrays.split(',')) { + sb.appendLine(''); + sb.appendLine(''); + sb.appendLine('DInt'); + sb.appendLine(`${arr}`); + sb.appendLine(''); + sb.appendLine(''); + } + } + } else { + if (this instanceof FixedPeripherySignal) { + sb.appendLine(``); + } else { + sb.appendLine(``); + } + } + sb.appendLine(''); + } + sb.appendLine(''); + sb.appendLine(''); + } + } + + toString(): string { + return `${this.constructor.name}(${this.name})`; + } +} + +export class FixedSignal extends Signal { + constructor(name: string, signalType: SignalType = SignalType.Bool, customType?: string) { + super(name, signalType, customType); + } +} + +export class FixedPeripherySignal extends FixedSignal { + constructor(name: string, signalType: SignalType = SignalType.Bool, customType?: string) { + super(name, signalType, customType); + } +} diff --git a/TiaCodegen-ts/src/Enums/Direction.ts b/TiaCodegen-ts/src/Enums/Direction.ts new file mode 100644 index 0000000..b82ba43 --- /dev/null +++ b/TiaCodegen-ts/src/Enums/Direction.ts @@ -0,0 +1,7 @@ +export enum Direction { + Input = 'Input', + Output = 'Output', + InOut = 'InOut', + Eno = 'Eno', + En = 'En', +} diff --git a/TiaCodegen-ts/src/Enums/SignalType.ts b/TiaCodegen-ts/src/Enums/SignalType.ts new file mode 100644 index 0000000..6a40546 --- /dev/null +++ b/TiaCodegen-ts/src/Enums/SignalType.ts @@ -0,0 +1,27 @@ +export enum SignalType { + Bool = 'Bool', + Byte = 'Byte', + Int = 'Int', + DInt = 'DInt', + UInt = 'UInt', + UDInt = 'UDInt', + Time = 'Time', + UDT = 'UDT', + String = 'String', + Real = 'Real', + Constant = 'Constant', + ConstantBool = 'ConstantBool', + ConstantInt = 'ConstantInt', + ConstantDInt = 'ConstantDInt', + ConstantUInt = 'ConstantUInt', + ConstantUDInt = 'ConstantUDInt', + ConstantTime = 'ConstantTime', + ConstantString = 'ConstantString', + ConstantReal = 'ConstantReal', + ConstantWord = 'ConstantWord', + Custom = 'Custom', + Void = 'Void', + Variant = 'Variant', + ProgramAlarm = 'ProgramAlarm', + Word = 'Word', +} diff --git a/TiaCodegen-ts/src/Extensions/NaturalComparer.ts b/TiaCodegen-ts/src/Extensions/NaturalComparer.ts new file mode 100644 index 0000000..a11560d --- /dev/null +++ b/TiaCodegen-ts/src/Extensions/NaturalComparer.ts @@ -0,0 +1,36 @@ +export class NaturalComparer { + compare(x: string | null, y: string | null): number { + if (x === y) return 0; + if (x === null || x === undefined) return -1; + if (y === null || y === undefined) return 1; + + let i = 0, j = 0; + while (i < x.length && j < y.length) { + const cx = x[i]; + const cy = y[j]; + if (this.isDigit(cx) && this.isDigit(cy)) { + let vx = 0; + while (i < x.length && this.isDigit(x[i])) { + vx = vx * 10 + (x.charCodeAt(i) - 48); + i++; + } + let vy = 0; + while (j < y.length && this.isDigit(y[j])) { + vy = vy * 10 + (y.charCodeAt(j) - 48); + j++; + } + if (vx !== vy) return vx < vy ? -1 : 1; + } else { + const cmp = cx.toUpperCase().localeCompare(cy.toUpperCase()); + if (cmp !== 0) return cmp; + i++; + j++; + } + } + return x.length - y.length; + } + + private isDigit(c: string): boolean { + return c >= '0' && c <= '9'; + } +} diff --git a/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts b/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts new file mode 100644 index 0000000..8db6bc9 --- /dev/null +++ b/TiaCodegen-ts/src/Extensions/OperationOrSignalExtensions.ts @@ -0,0 +1,13 @@ +import { IOperationOrSignal } from '../Interfaces/IOperationOrSignal'; + +export function tryGetParent( + op: IOperationOrSignal, + ctor: new (...args: any[]) => T, +): T | null { + let chk = op.parent; + while (chk !== null && chk !== undefined) { + if (chk instanceof ctor) return chk as T; + chk = chk.parent; + } + return null; +} diff --git a/TiaCodegen-ts/src/Interfaces/ICoil.ts b/TiaCodegen-ts/src/Interfaces/ICoil.ts new file mode 100644 index 0000000..e9dbd17 --- /dev/null +++ b/TiaCodegen-ts/src/Interfaces/ICoil.ts @@ -0,0 +1,2 @@ +// Marker interface for coils +export interface ICoil {} diff --git a/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts b/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts new file mode 100644 index 0000000..9b046c2 --- /dev/null +++ b/TiaCodegen-ts/src/Interfaces/IFunctionOperation.ts @@ -0,0 +1,2 @@ +// Marker interface for function operations +export interface IFunctionOperation {} diff --git a/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts b/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts new file mode 100644 index 0000000..99aa9cf --- /dev/null +++ b/TiaCodegen-ts/src/Interfaces/IOperationOrSignal.ts @@ -0,0 +1,11 @@ +export interface IOperationOrSignal { + children: IOperationOrSignal[]; + parent: IOperationOrSignal | null; + operationId: number; + doNotCreateContact: boolean; + cardinality: number; + debugInfo: string | null; + createContactAndFillCardinality(parent: IOperationOrSignal): number; + clone(): IOperationOrSignal; + toString(): string; +} diff --git a/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts b/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts new file mode 100644 index 0000000..00224d2 --- /dev/null +++ b/TiaCodegen-ts/src/Interfaces/IOperationOrSignalDirectionWrapper.ts @@ -0,0 +1,22 @@ +import { IOperationOrSignal } from './IOperationOrSignal'; +import { Direction } from '../Enums/Direction'; +import { SignalType } from '../Enums/SignalType'; + +export class IOperationOrSignalDirectionWrapper { + operationOrSignal: IOperationOrSignal | null; + direction: Direction; + length: number; + type: SignalType | null; + + constructor( + operationOrSignal: IOperationOrSignal | null, + direction: Direction, + type: SignalType | null = null, + length: number = 0, + ) { + this.operationOrSignal = operationOrSignal; + this.direction = direction; + this.length = length; + this.type = type; + } +} diff --git a/TiaCodegen-ts/src/Interfaces/IPartName.ts b/TiaCodegen-ts/src/Interfaces/IPartName.ts new file mode 100644 index 0000000..855d92d --- /dev/null +++ b/TiaCodegen-ts/src/Interfaces/IPartName.ts @@ -0,0 +1,3 @@ +export interface IPartName { + partName: string; +} diff --git a/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts b/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts new file mode 100644 index 0000000..1188c95 --- /dev/null +++ b/TiaCodegen-ts/src/Internal/IEnumerableExtensions.ts @@ -0,0 +1,4 @@ +export function flatten(e: T[] | null | undefined, f: (t: T) => T[]): T[] { + if (!e) return []; + return e.flatMap(c => flatten(f(c), f)).concat(e); +} diff --git a/TiaCodegen-ts/src/index.ts b/TiaCodegen-ts/src/index.ts new file mode 100644 index 0000000..4a3ae21 --- /dev/null +++ b/TiaCodegen-ts/src/index.ts @@ -0,0 +1,90 @@ +// Enums +export { Direction } from './Enums/Direction'; +export { SignalType } from './Enums/SignalType'; + +// Interfaces +export { IOperationOrSignal } from './Interfaces/IOperationOrSignal'; +export { ICoil } from './Interfaces/ICoil'; +export { IFunctionOperation } from './Interfaces/IFunctionOperation'; +export { IPartName } from './Interfaces/IPartName'; +export { IOperationOrSignalDirectionWrapper } from './Interfaces/IOperationOrSignalDirectionWrapper'; + +// Utils +export { StringBuilder } from './utils/StringBuilder'; + +// Internal +export { flatten } from './Internal/IEnumerableExtensions'; + +// Extensions +export { NaturalComparer } from './Extensions/NaturalComparer'; +export { tryGetParent } from './Extensions/OperationOrSignalExtensions'; + +// Commands +export { BaseOperationOrSignal } from './Commands/BaseOperationOrSignal'; +export { And } from './Commands/And'; +export { Or } from './Commands/Or'; +export { Not } from './Commands/Not'; +export { Distributor } from './Commands/Distributor'; +export { Move } from './Commands/Move'; +export { Convert } from './Commands/Convert'; +export { S_Move } from './Commands/S_Move'; +export { NCoil } from './Commands/NCoil'; + +// Signals +export { Signal, FixedSignal, FixedPeripherySignal } from './Commands/Signals/Signal'; + +// Coils +export { BaseCoil } from './Commands/Coils/BaseCoil'; +export { BaseNPCoil } from './Commands/Coils/BaseNPCoil'; +export { Coil } from './Commands/Coils/Coil'; +export { PCoil } from './Commands/Coils/PCoil'; +export { RCoil } from './Commands/Coils/RCoil'; +export { SCoil } from './Commands/Coils/SCoil'; + +// Comparisons +export { CompareOperator } from './Commands/Comparisons/CompareOperator'; +export { Eq } from './Commands/Comparisons/Eq'; +export { Ne } from './Commands/Comparisons/Ne'; +export { Ge } from './Commands/Comparisons/Ge'; +export { Gt } from './Commands/Comparisons/Gt'; +export { Le } from './Commands/Comparisons/Le'; +export { Lt } from './Commands/Comparisons/Lt'; +export { InRangeCall } from './Commands/Comparisons/InRangeCall'; +export { OutRangeCall } from './Commands/Comparisons/OutRangeCall'; + +// Function Base +export { FunctionCall } from './Commands/Functions/Base/FunctionCall'; +export { FunctionBlockCall } from './Commands/Functions/Base/FunctionBlockCall'; +export { SystemFunctionCall } from './Commands/Functions/Base/SystemFunctionCall'; +export { SystemFunctionBlockCall } from './Commands/Functions/Base/SystemFunctionBlockCall'; + +// Arithmetic +export { ArithmeticCall } from './Commands/Functions/Arithmetic/ArithmeticCall'; +export { VariableArithmeticCall } from './Commands/Functions/Arithmetic/VariableArithmeticCall'; +export { AddCall } from './Commands/Functions/Arithmetic/AddCall'; +export { MulCall } from './Commands/Functions/Arithmetic/MulCall'; +export { SubCall } from './Commands/Functions/Arithmetic/SubCall'; +export { DivCall } from './Commands/Functions/Arithmetic/DivCall'; +export { ModCall } from './Commands/Functions/Arithmetic/ModCall'; + +// Functions +export { AckGlCall } from './Commands/Functions/AckGlCall'; +export { CTUCall } from './Commands/Functions/CTUCall'; +export { CTUDCall } from './Commands/Functions/CTUDCall'; +export { FDBACKCall } from './Commands/Functions/FDBACKCall'; +export { FTrigCall } from './Commands/Functions/FTrigCall'; +export { NTrigCall } from './Commands/Functions/NTrigCall'; +export { PTrigCall } from './Commands/Functions/PTrigCall'; +export { RTrigCall } from './Commands/Functions/RTrigCall'; +export { TOFCall } from './Commands/Functions/TOFCall'; +export { TONCall } from './Commands/Functions/TONCall'; +export { TONRCall } from './Commands/Functions/TONRCall'; +export { TPCall } from './Commands/Functions/TPCall'; + +// Blocks +export { CodeBlock } from './Blocks/CodeBlock'; +export { Network } from './Blocks/Network'; +export { Block } from './Blocks/Block'; + +// CodeGen +export { KopCodeHelper } from './CodeGen/KopCodeHelper'; diff --git a/TiaCodegen-ts/src/utils/StringBuilder.ts b/TiaCodegen-ts/src/utils/StringBuilder.ts new file mode 100644 index 0000000..826e45e --- /dev/null +++ b/TiaCodegen-ts/src/utils/StringBuilder.ts @@ -0,0 +1,21 @@ +export class StringBuilder { + private parts: string[] = []; + + append(text: string): StringBuilder { + this.parts.push(text); + return this; + } + + appendLine(text: string = ''): StringBuilder { + this.parts.push(text + '\r\n'); + return this; + } + + toString(): string { + return this.parts.join(''); + } + + get length(): number { + return this.parts.join('').length; + } +} diff --git a/TiaCodegen-ts/tests/SampleTests.test.ts b/TiaCodegen-ts/tests/SampleTests.test.ts new file mode 100644 index 0000000..ac7f8db --- /dev/null +++ b/TiaCodegen-ts/tests/SampleTests.test.ts @@ -0,0 +1,347 @@ +import { CodeBlock } from '../src/Blocks/CodeBlock'; +import { Network } from '../src/Blocks/Network'; +import { Block } from '../src/Blocks/Block'; +import { And } from '../src/Commands/And'; +import { Or } from '../src/Commands/Or'; +import { Not } from '../src/Commands/Not'; +import { Distributor } from '../src/Commands/Distributor'; +import { Move } from '../src/Commands/Move'; +import { Convert } from '../src/Commands/Convert'; +import { S_Move } from '../src/Commands/S_Move'; +import { Signal, FixedSignal, FixedPeripherySignal } from '../src/Commands/Signals/Signal'; +import { Coil } from '../src/Commands/Coils/Coil'; +import { SCoil } from '../src/Commands/Coils/SCoil'; +import { RCoil } from '../src/Commands/Coils/RCoil'; +import { Gt } from '../src/Commands/Comparisons/Gt'; +import { InRangeCall } from '../src/Commands/Comparisons/InRangeCall'; +import { FunctionBlockCall } from '../src/Commands/Functions/Base/FunctionBlockCall'; +import { SystemFunctionCall } from '../src/Commands/Functions/Base/SystemFunctionCall'; +import { TONCall } from '../src/Commands/Functions/TONCall'; +import { IOperationOrSignalDirectionWrapper } from '../src/Interfaces/IOperationOrSignalDirectionWrapper'; +import { Direction } from '../src/Enums/Direction'; +import { SignalType } from '../src/Enums/SignalType'; +import { StringBuilder } from '../src/utils/StringBuilder'; + +const TestInterface = ` + +\t +\t
+\t\t +\t\t +\t\t\tInitial call of this OB +\t\t +\t\t +\t
+\t
+\t\t +\t\t +\t\t +\t\t +\t
+\t
+\t +`; + +describe('SampleTests', () => { + test('CreateBlock1', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test1', 'Test1en'); + + nw.add( + new And( + new Signal('#Bool1'), + new Distributor( + new RCoil(new Signal('#Bool2')), + new Coil(new Signal('#Bool3')), + ), + ), + ); + + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + expect(xml).toContain('SW.Blocks.FC'); + }); + + test('CreateBlock2', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test2', 'Test2en'); + nw.add( + new And( + new Signal('#Bool1'), + new Signal('#Bool2'), + new Convert( + new Signal('#Real1', SignalType.Real), + new Signal('#Dint2', SignalType.DInt), + ), + new Distributor( + new And( + new Move( + new Signal('#Real3'), + new Signal('#Real4'), + ), + new SCoil(new Signal('#Bool3')), + ), + new And( + new Gt( + new Signal('#Real1', SignalType.Real), + new Signal('#Real2', SignalType.Real), + ), + new SCoil(new Signal('#Bool4')), + ), + ), + ), + ); + + codeblock.add(nw); + const block = new Block('Test', 'blabla', codeblock); + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('CreateBlock3', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test2', 'Test2en'); + nw.add( + new Coil( + new Signal('#Bool1'), + new And( + new Signal('#Bool2'), + new Or( + new Signal('#Bool3'), + new And( + new Signal('#Bool1'), + new Signal('#Bool4'), + ), + ), + ), + ), + ); + + codeblock.add(nw); + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('DynamicSample1', () => { + const codeblock = new CodeBlock(); + const signals = ['#Bool1', '#Bool2', '#Bool3']; + const and = new And(); + for (const s of signals) and.add(new Signal(s)); + + const nw = new Network('Test2', 'test2en'); + nw.add(new Coil(new Signal('#Bool4'), and)); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('TestCallWithOr', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test2', 'Test2en'); + + const f = new FunctionBlockCall('CheckContour', 'CheckContourInstance'); + f.iface['BoolPar'] = new IOperationOrSignalDirectionWrapper( + new Or(new Signal('P1'), new Signal('P2')), + Direction.InOut, + ); + for (const w of Object.values(f.iface)) { + if (w.operationOrSignal !== null) f.children.push(w.operationOrSignal); + } + nw.add(f); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('TestDistributor', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test2', 'Test2en'); + nw.add( + new And( + new Not(new Signal('Tag_9')), + new Distributor( + new And(new Coil(new Signal('#monitoringSignal'))), + new And( + new TONCall('OnDelaySafetyDoorSDA11N13', new Signal('T#60s', SignalType.ConstantTime)), + ), + ), + ), + ); + + codeblock.add(nw); + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('TestCallWithInRange', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test2', 'Test2en'); + + const f = new InRangeCall( + new Signal(1), + new Signal(2), + new Signal(3), + new Coil(new Signal('MW0', SignalType.Int)), + ); + nw.add(f); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('TestCallWithTOn', () => { + const codeblock = new CodeBlock(); + codeblock.safety = true; + const nw = new Network('Test2', 'Test2en'); + + const f = new TONCall('Hallo', new Signal('T#4m', SignalType.ConstantTime)); + nw.add(f); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + const xml = block.getCode(); + expect(xml).toBeTruthy(); + expect(xml).toContain('F_LAD'); + }); + + test('FixedPeripherySignalTest', () => { + const codeblock = new CodeBlock(); + const nw = new Network('Test3', 'Test3en'); + nw.add( + new Coil( + new FixedPeripherySignal('=PBG10.6+FBG11-BV1:4'), + new And(new Signal('1')), + ), + ); + + codeblock.add(nw); + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('ComplexVariableAccessTest1', () => { + const sb = new StringBuilder(); + const s = new Signal('#A.B.C[#D.E.F, 1]'); + s.addXmlToStringBuilder(1, sb); + const xml = sb.toString(); + const expected = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nDInt\r\n1\r\n\r\n\r\n\r\n\r\n\r\n'; + expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, '')); + }); + + test('ComplexVariableAccessTest2', () => { + const sb = new StringBuilder(); + const s = new Signal('#A.B.C[#D.E.F, #G.H.I]'); + s.addXmlToStringBuilder(1, sb); + const xml = sb.toString(); + const expected = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'; + expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, '')); + }); + + test('TestConstant', () => { + const sb = new StringBuilder(); + const s = new Signal('AAA', SignalType.Constant); + s.addXmlToStringBuilder(1, sb); + const xml = sb.toString(); + const expected = '\r\n\r\n\r\n\r\n'; + expect(xml.replace(/\r?\n/g, '')).toEqual(expected.replace(/\r?\n/g, '')); + }); + + test('SystemFunctionDPXX_DAT', () => { + const codeblock = new CodeBlock(); + codeblock.safety = false; + const nw = new Network('TestDPXX_DAT', 'TestDPXX_DATen'); + + const sf1 = new SystemFunctionCall('DPRD_DAT'); + sf1.iface['LADDR'] = new IOperationOrSignalDirectionWrapper( + new Signal('#Configuration.GeneralMoviC.ModuleHardwareID'), + Direction.Input, + ); + sf1.iface['RET_VAL'] = new IOperationOrSignalDirectionWrapper(new Signal('#retVal'), Direction.Output); + sf1.iface['RECORD'] = new IOperationOrSignalDirectionWrapper( + new Signal('#PeripheryInputsMoviC'), + Direction.Output, + ); + for (const w of Object.values(sf1.iface)) { + if (w.operationOrSignal !== null) sf1.children.push(w.operationOrSignal); + } + nw.add(sf1); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('ComplexOr', () => { + const codeblock = new CodeBlock(); + codeblock.safety = false; + const nw = new Network('T1', 'T1'); + + const or3 = new Or(new Signal('Test3'), new Signal('Test4')); + or3.debugInfo = 'aaa'; + const innerAnd1 = new And(new Signal('Test2'), or3); + + const or1Inner = new Or(innerAnd1, new Signal('Test5')); + or1Inner.debugInfo = 'bbb'; + + const or3b = new Or(new Signal('Test8'), new Signal('Test9')); + or3b.debugInfo = 'ccc'; + const innerAnd2 = new And(new Signal('Test7'), or3b); + + const or1Inner2 = new Or(innerAnd2, new Signal('Test10')); + or1Inner2.debugInfo = 'ddd'; + + const outerOr = new Or( + new And(new Signal('Test1'), or1Inner), + new And(new Signal('Test6'), or1Inner2), + ); + outerOr.debugInfo = 'eee'; + + nw.add(new Coil(new Signal('Test11'), outerOr)); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); + + test('Complex3', () => { + const codeblock = new CodeBlock(); + codeblock.safety = false; + const nw = new Network('T1', 'T1'); + + nw.add( + new Coil( + new Signal('Test11'), + new And(new Signal('Test1'), new Or(new Signal('Test2'))), + ), + ); + codeblock.add(nw); + + const block = new Block('Test', 'blabla', codeblock); + block.blockInterface = TestInterface; + const xml = block.getCode(); + expect(xml).toBeTruthy(); + }); +}); diff --git a/TiaCodegen-ts/tsconfig.json b/TiaCodegen-ts/tsconfig.json new file mode 100644 index 0000000..0ad54fe --- /dev/null +++ b/TiaCodegen-ts/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "lib": ["ES2020"], + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "tests"] +} From 28fdedb2063c6f0e3ac766651d35690783cf5150 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 14:01:07 +0000 Subject: [PATCH 3/3] Create TypeScript version of TiaCodeGen library Co-authored-by: jogibear9988 <364896+jogibear9988@users.noreply.github.com> --- TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts | 2 +- TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts | 2 +- TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts index 0670f48..bd141bc 100644 --- a/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts +++ b/TiaCodegen-ts/src/Commands/Comparisons/InRangeCall.ts @@ -15,7 +15,7 @@ export class InRangeCall extends SystemFunctionCall { this.disableEno = false; this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input); this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input); - this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Output); + this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Input); this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output); for (const w of Object.values(this.iface)) { diff --git a/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts index a3480a1..5cb2dac 100644 --- a/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts +++ b/TiaCodegen-ts/src/Commands/Comparisons/OutRangeCall.ts @@ -15,7 +15,7 @@ export class OutRangeCall extends SystemFunctionCall { this.disableEno = false; this.iface['min'] = new IOperationOrSignalDirectionWrapper(min, Direction.Input); this.iface['in'] = new IOperationOrSignalDirectionWrapper(inParam, Direction.Input); - this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Output); + this.iface['max'] = new IOperationOrSignalDirectionWrapper(max, Direction.Input); this.iface['out'] = new IOperationOrSignalDirectionWrapper(out, Direction.Output); for (const w of Object.values(this.iface)) { diff --git a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts index c048517..6379d32 100644 --- a/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts +++ b/TiaCodegen-ts/src/Commands/Functions/Base/FunctionBlockCall.ts @@ -6,7 +6,6 @@ export class FunctionBlockCall extends FunctionCall { constructor(functionName: string, instanceName: string, eno: IOperationOrSignal | null = null) { super(functionName, eno); - this.functionName = functionName; this.instanceName = instanceName; } }