diff --git a/cli/src/main/java/com/walmartlabs/concord/cli/Run.java b/cli/src/main/java/com/walmartlabs/concord/cli/Run.java index ab8c7d615c..88a11bcfd1 100644 --- a/cli/src/main/java/com/walmartlabs/concord/cli/Run.java +++ b/cli/src/main/java/com/walmartlabs/concord/cli/Run.java @@ -302,7 +302,7 @@ private static ProcessInfo processInfo(Map args, List pr } return ProcessInfo.builder() - .sessionToken(MapUtils.getString(processInfo, "sessionToken")) + .sessionToken(MapUtils.getString(processInfo, "sessionToken", "")) .activeProfiles(profiles) .build(); } diff --git a/cli/src/main/java/com/walmartlabs/concord/cli/runner/CliServicesModule.java b/cli/src/main/java/com/walmartlabs/concord/cli/runner/CliServicesModule.java index dc81fe628e..6b53296eb7 100644 --- a/cli/src/main/java/com/walmartlabs/concord/cli/runner/CliServicesModule.java +++ b/cli/src/main/java/com/walmartlabs/concord/cli/runner/CliServicesModule.java @@ -25,12 +25,14 @@ import com.google.inject.Singleton; import com.google.inject.multibindings.Multibinder; import com.walmartlabs.concord.cli.Verbosity; +import com.walmartlabs.concord.client2.ApiClient; import com.walmartlabs.concord.dependencymanager.DependencyManager; import com.walmartlabs.concord.runtime.v2.runner.*; import com.walmartlabs.concord.runtime.v2.runner.checkpoints.CheckpointService; import com.walmartlabs.concord.runtime.v2.runner.guice.BaseRunnerModule; import com.walmartlabs.concord.runtime.v2.runner.logging.RunnerLogger; import com.walmartlabs.concord.runtime.v2.runner.logging.SimpleLogger; +import com.walmartlabs.concord.runtime.v2.runner.remote.ApiClientProvider; import com.walmartlabs.concord.runtime.v2.runner.tasks.TaskCallListener; import com.walmartlabs.concord.runtime.v2.sdk.DockerService; import com.walmartlabs.concord.runtime.v2.sdk.LockService; @@ -80,6 +82,8 @@ protected void configure() { bind(ProcessStatusCallback.class).toInstance(instanceId -> { }); + bind(ApiClient.class).toProvider(ApiClientProvider.class); + bind(DefaultTaskVariablesService.class) .toInstance(new MapBackedDefaultTaskVariablesService(readDefaultVars(defaultTaskVars))); diff --git a/cli/src/test/resources/com/walmartlabs/concord/cli/simple/concord.yml b/cli/src/test/resources/com/walmartlabs/concord/cli/simple/concord.yml index 80a39ef00f..85bdb4590a 100644 --- a/cli/src/test/resources/com/walmartlabs/concord/cli/simple/concord.yml +++ b/cli/src/test/resources/com/walmartlabs/concord/cli/simple/concord.yml @@ -4,3 +4,4 @@ configuration: flows: default: - log: "Hello, ${name}" + - expr: "${sleep.ms(10)}" \ No newline at end of file diff --git a/console2/package-lock.json b/console2/package-lock.json index 10867d0cf6..e86ae24cc7 100644 --- a/console2/package-lock.json +++ b/console2/package-lock.json @@ -42,6 +42,7 @@ }, "devDependencies": { "@babel/preset-react": "7.16.0", + "@datasert/cronjs-matcher": "^1.4.0", "@testing-library/react": "12.1.2", "@types/jest": "27.0.3", "@types/lodash": "4.14.178", @@ -56,7 +57,7 @@ "@types/sinon": "10.0.6", "@types/styled-components": "5.1.17", "@types/webpack-env": "1.16.3", - "@typescript-eslint/typescript-estree": "5.6.0", + "@typescript-eslint/typescript-estree": "5.35.1", "babel-cli": "6.26.0", "babel-core": "7.0.0-bridge.0", "babel-preset-es2015": "6.24.1", @@ -68,7 +69,7 @@ "redux-devtools-extension": "2.13.9", "shx": "0.3.3", "ts-node": "10.4.0", - "typescript": "4.5.3" + "typescript": "4.8.2" } }, "node_modules/@babel/code-frame": { @@ -2126,6 +2127,22 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "node_modules/@datasert/cronjs-matcher": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@datasert/cronjs-matcher/-/cronjs-matcher-1.4.0.tgz", + "integrity": "sha512-5wAAKYfClZQDWjOeGReEnGLlBKds5K0CitnTv17sH32X4PSuck1dysX71zzCgrm0JCSpobDNg4b292ewhoy6ww==", + "dev": true, + "dependencies": { + "@datasert/cronjs-parser": "^1.4.0", + "luxon": "^3.0.4" + } + }, + "node_modules/@datasert/cronjs-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@datasert/cronjs-parser/-/cronjs-parser-1.4.0.tgz", + "integrity": "sha512-zHGlrWanS4Zjgf0aMi/sp/HTSa2xWDEtXW9xshhlGf/jPx3zTIqfX14PZnoFF7XVOwzC49Zy0SFWG90rlRY36Q==", + "dev": true + }, "node_modules/@emotion/is-prop-valid": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", @@ -5027,17 +5044,17 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", + "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/visitor-keys": "5.35.1", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { @@ -5054,9 +5071,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", + "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5067,13 +5084,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", + "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.6.0", - "eslint-visitor-keys": "^3.0.0" + "@typescript-eslint/types": "5.35.1", + "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5083,43 +5100,29 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -5141,16 +5144,10 @@ "node": ">=0.10.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6038,13 +6035,6 @@ "fsevents": "^1.0.0" } }, - "node_modules/babel-cli/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "optional": true - }, "node_modules/babel-cli/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6080,16 +6070,6 @@ "node": ">=0.10.0" } }, - "node_modules/babel-cli/node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, "node_modules/babel-cli/node_modules/fsevents": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", @@ -6859,67 +6839,12 @@ "node": ">=0.10.0" } }, - "node_modules/babel-cli/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/babel-cli/node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/babel-cli/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/babel-cli/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/babel-cli/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, "node_modules/babel-cli/node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -6929,32 +6854,6 @@ "node": ">=0.10.0" } }, - "node_modules/babel-cli/node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/babel-cli/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true - }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -10349,14 +10248,26 @@ } }, "node_modules/debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -12102,17 +12013,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/eslint/node_modules/globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -12830,19 +12730,18 @@ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/braces": { @@ -13557,9 +13456,9 @@ } }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -14201,9 +14100,9 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -17849,6 +17748,15 @@ "node": ">=10" } }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", @@ -25415,9 +25323,9 @@ "integrity": "sha512-sTn5k3+fagGOi8FQfN2MPeUiTdvG0Z3LVqCaQdsg2sYa0fzNteFZussizdwiPxF45OoFN3zdU/ci+PtjolNSPQ==" }, "node_modules/typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", + "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -29310,6 +29218,22 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" }, + "@datasert/cronjs-matcher": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@datasert/cronjs-matcher/-/cronjs-matcher-1.4.0.tgz", + "integrity": "sha512-5wAAKYfClZQDWjOeGReEnGLlBKds5K0CitnTv17sH32X4PSuck1dysX71zzCgrm0JCSpobDNg4b292ewhoy6ww==", + "dev": true, + "requires": { + "@datasert/cronjs-parser": "^1.4.0", + "luxon": "^3.0.4" + } + }, + "@datasert/cronjs-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@datasert/cronjs-parser/-/cronjs-parser-1.4.0.tgz", + "integrity": "sha512-zHGlrWanS4Zjgf0aMi/sp/HTSa2xWDEtXW9xshhlGf/jPx3zTIqfX14PZnoFF7XVOwzC49Zy0SFWG90rlRY36Q==", + "dev": true + }, "@emotion/is-prop-valid": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", @@ -31527,62 +31451,53 @@ "integrity": "sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==" }, "@typescript-eslint/typescript-estree": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.6.0.tgz", - "integrity": "sha512-92vK5tQaE81rK7fOmuWMrSQtK1IMonESR+RJR2Tlc7w4o0MeEdjgidY/uO2Gobh7z4Q1hhS94Cr7r021fMVEeA==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.35.1.tgz", + "integrity": "sha512-JUqE1+VRTGyoXlDWWjm6MdfpBYVq+hixytrv1oyjYIBEOZhBCwtpp5ZSvBt4wIA1MKWlnaC2UXl2XmYGC3BoQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "@typescript-eslint/visitor-keys": "5.6.0", - "debug": "^4.3.2", - "globby": "^11.0.4", + "@typescript-eslint/types": "5.35.1", + "@typescript-eslint/visitor-keys": "5.35.1", + "debug": "^4.3.4", + "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.5", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.6.0.tgz", - "integrity": "sha512-OIZffked7mXv4mXzWU5MgAEbCf9ecNJBKi+Si6/I9PpTaj+cf2x58h2oHW5/P/yTnPkKaayfjhLvx+crnl5ubA==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.35.1.tgz", + "integrity": "sha512-FDaujtsH07VHzG0gQ6NDkVVhi1+rhq0qEvzHdJAQjysN+LHDCKDKCBRlZFFE0ec0jKxiv0hN63SNfExy0KrbQQ==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.6.0.tgz", - "integrity": "sha512-1p7hDp5cpRFUyE3+lvA74egs+RWSgumrBpzBCDzfTFv0aQ7lIeay80yU0hIxgAhwQ6PcasW35kaOCyDOv6O/Ng==", + "version": "5.35.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.35.1.tgz", + "integrity": "sha512-cEB1DvBVo1bxbW/S5axbGPE6b7FIMAbo3w+AGq6zNDA7+NYJOIkKj/sInfTv4edxd4PxJSgdN4t6/pbvgA+n5g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.6.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" + "@typescript-eslint/types": "5.35.1", + "eslint-visitor-keys": "^3.3.0" } }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, @@ -31595,16 +31510,10 @@ "is-extglob": "^2.1.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -32324,13 +32233,6 @@ "readdirp": "^2.0.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "optional": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -32360,16 +32262,6 @@ "is-extglob": "^1.0.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, "fsevents": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", @@ -32973,77 +32865,17 @@ "regex-cache": "^0.4.2" } }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "optional": true - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true - }, - "tar": { - "version": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "optional": true } } }, @@ -35901,11 +35733,18 @@ "integrity": "sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q==" }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "decamelize": { @@ -36761,14 +36600,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, "globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -37810,16 +37641,15 @@ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "dependencies": { "braces": { @@ -38374,9 +38204,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -38876,9 +38706,9 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" }, "immer": { "version": "8.0.1", @@ -41576,6 +41406,12 @@ "yallist": "^4.0.0" } }, + "luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "dev": true + }, "lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", @@ -47567,9 +47403,9 @@ "integrity": "sha512-sTn5k3+fagGOi8FQfN2MPeUiTdvG0Z3LVqCaQdsg2sYa0fzNteFZussizdwiPxF45OoFN3zdU/ci+PtjolNSPQ==" }, "typescript": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.3.tgz", - "integrity": "sha512-eVYaEHALSt+s9LbvgEv4Ef+Tdq7hBiIZgii12xXJnukryt3pMgJf6aKhoCZ3FWQsu6sydEnkg11fYXLzhLBjeQ==" + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", + "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==" }, "typescript-compare": { "version": "0.0.2", diff --git a/console2/package.json b/console2/package.json index 4766ce6b98..478b3d6b5c 100644 --- a/console2/package.json +++ b/console2/package.json @@ -4,6 +4,7 @@ "private": true, "devDependencies": { "@babel/preset-react": "7.16.0", + "@datasert/cronjs-matcher": "^1.4.0", "@testing-library/react": "12.1.2", "@types/jest": "27.0.3", "@types/lodash": "4.14.178", @@ -60,8 +61,8 @@ "semantic-ui-calendar-react": "0.15.3", "semantic-ui-css": "2.4.1", "semantic-ui-react": "2.0.4", - "styled-tools": "1.7.2", "styled-components": "5.3.3", + "styled-tools": "1.7.2", "typeface-lato": "1.1.13", "url-search-params-polyfill": "8.1.1" }, diff --git a/console2/src/api/org/project/repository/index.ts b/console2/src/api/org/project/repository/index.ts index ad603e8d78..caff991d27 100644 --- a/console2/src/api/org/project/repository/index.ts +++ b/console2/src/api/org/project/repository/index.ts @@ -70,11 +70,16 @@ export interface TriggerCfg { name?: string; } +export interface TriggerConditions { + spec?: string; + version?: string; +} + export interface TriggerEntry { id: ConcordId; eventSource: ConcordKey; arguments?: object; - conditions?: object; + conditions?: TriggerConditions; activeProfiles?: string[]; cfg: TriggerCfg; } diff --git a/console2/src/components/pages/RepositoryPage/RepositoryTriggersActivity.tsx b/console2/src/components/pages/RepositoryPage/RepositoryTriggersActivity.tsx index 76dea0d186..90d3bc7d1d 100644 --- a/console2/src/components/pages/RepositoryPage/RepositoryTriggersActivity.tsx +++ b/console2/src/components/pages/RepositoryPage/RepositoryTriggersActivity.tsx @@ -28,7 +28,9 @@ import { ConcordKey, RequestError } from '../../../api/common'; import { TriggerEntry } from '../../../api/org/project/repository'; import { actions, ListTriggersResponse, State } from '../../../state/data/triggers'; import { comparators } from '../../../utils'; -import { RequestErrorMessage } from '../../molecules'; +import {LocalTimestamp, RequestErrorMessage} from '../../molecules'; + +import * as cronjsMatcher from '@datasert/cronjs-matcher'; interface ExternalProps { orgName: ConcordKey; @@ -90,22 +92,80 @@ class RepositoryTriggersActivity extends React.Component { ); } + const cronTriggers = data?.filter((t) => t.eventSource === 'cron'); + const otherTriggers = data?.filter((t) => t.eventSource !== 'cron'); + return ( <> - - - - Source - Conditions - Entry Point - Configuration - Arguments - - - - - {data && - data.map((t, idx) => ( + {cronTriggers && <> +

Cron Triggers

+
+ + + Conditions + Entry Point + Configuration + Arguments + + + + + {cronTriggers.map((t, idx) => ( + + + {t.conditions?.spec !== undefined && ( +
+                                            Expression: {t.conditions?.spec}
+                                            
+ Next run: +
)} +
+ +
{t.cfg.entryPoint}
+
+ + + + + {t.arguments && ( + + )} + +
+ ))} + {cronTriggers.length === 0 && ( + + No other triggers + + )} +
+
+ } + {otherTriggers && <> +

Other Triggers

+ + + + Source + Conditions + Entry Point + Configuration + Arguments + + + + + {otherTriggers.map((t, idx) => ( {t.eventSource} @@ -139,8 +199,14 @@ class RepositoryTriggersActivity extends React.Component { ))} - -
+ {otherTriggers.length === 0 && ( + + No other triggers + + )} + + + } ); } diff --git a/plugins/pom.xml b/plugins/pom.xml index 2d404c0758..c2428800a9 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -16,6 +16,7 @@ tasks/ansible + tasks/asserts tasks/concord tasks/crypto tasks/docker diff --git a/plugins/tasks/asserts/pom.xml b/plugins/tasks/asserts/pom.xml new file mode 100644 index 0000000000..d16a271c6c --- /dev/null +++ b/plugins/tasks/asserts/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + + com.walmartlabs.concord.plugins.basic + parent + 2.8.1-SNAPSHOT + ../../pom.xml + + + asserts-tasks + jar + + + + + + + com.walmartlabs.concord + concord-sdk + provided + + + com.walmartlabs.concord.runtime.v2 + concord-runtime-sdk-v2 + provided + + + + javax.inject + javax.inject + provided + + + com.google.inject + guice + provided + + + + + + + org.eclipse.sisu + sisu-maven-plugin + + + + diff --git a/plugins/tasks/asserts/src/main/java/com/walmartlabs/concord/plugins/asserts/AssertsTask.java b/plugins/tasks/asserts/src/main/java/com/walmartlabs/concord/plugins/asserts/AssertsTask.java new file mode 100644 index 0000000000..db01573ae1 --- /dev/null +++ b/plugins/tasks/asserts/src/main/java/com/walmartlabs/concord/plugins/asserts/AssertsTask.java @@ -0,0 +1,145 @@ +package com.walmartlabs.concord.plugins.asserts; + +/*- + * ***** + * Concord + * ----- + * Copyright (C) 2017 - 2024 Walmart Inc. + * ----- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ===== + */ + +import com.walmartlabs.concord.runtime.v2.sdk.Context; +import com.walmartlabs.concord.runtime.v2.sdk.Task; +import com.walmartlabs.concord.runtime.v2.sdk.UserDefinedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import javax.inject.Named; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.file.Files; +import java.nio.file.Paths; + +@Named("asserts") +@SuppressWarnings("unused") +public class AssertsTask implements Task { + + private final static Logger log = LoggerFactory.getLogger(AssertsTask.class); + + private final Context context; + + @Inject + public AssertsTask(Context context) { + this.context = context; + } + + public void hasVariable(String name) { + boolean present = context.eval(String.format("${hasVariable('%s')}", name), Boolean.class); + if (!present) { + throw new UserDefinedException("Variable '" + name + "' not found"); + } + + Object value = context.eval("${" + name + "}", Object.class); + if (value == null) { + throw new UserDefinedException("Variable '" + name + "' is null value"); + } + + if (value instanceof String) { + if (((String) value).isBlank()) { + throw new UserDefinedException("Variable '" + name + "' is empty"); + } + } + } + + public void hasFile(String path) { + if (Files.notExists(Paths.get(path))) { + throw new UserDefinedException("File '" + path + "' does not exist"); + } + } + + public void assertEquals(Object expected, Object actual) { + if (expected == null && actual == null) { + return; + } + + if (expected == null) { + throw new UserDefinedException("Expected value to be 'null' but is '" + actual + "'"); + } else if (actual == null) { + throw new UserDefinedException("Expected value to be '" + expected + "' but is 'null'"); + } + + if (expected instanceof Number && actual instanceof Number) { + if (numbersEquals((Number) expected, (Number) actual)) { + return; + } + } else if (expected.equals(actual)) { + return; + } + + String msg = String.format("Expected value to be '%s' (class: %s) but is '%s' (class: %s)", + expected, expected.getClass().getName(), + actual, actual.getClass().getName()); + + throw new UserDefinedException(msg); + } + + public static void assertTrue(boolean condition) { + if (!condition) { + throw new UserDefinedException("Expected value to be true but is false"); + } + } + + public static void assertTrue(String message, boolean condition) { + if (!condition) { + throw new UserDefinedException(message); + } + } + + private static boolean isSpecialNumber(Number x) { + boolean specialDouble = x instanceof Double + && (Double.isNaN((Double) x) || Double.isInfinite((Double) x)); + boolean specialFloat = x instanceof Float + && (Float.isNaN((Float) x) || Float.isInfinite((Float) x)); + return specialDouble || specialFloat; + } + + private static BigDecimal toBigDecimal(Number number) { + if (number instanceof BigDecimal) { + return (BigDecimal) number; + } else if (number instanceof BigInteger) { + return new BigDecimal((BigInteger) number); + } else if (number instanceof Byte || number instanceof Short + || number instanceof Integer || number instanceof Long) { + return BigDecimal.valueOf(number.longValue()); + } else if (number instanceof Float || number instanceof Double) { + return BigDecimal.valueOf(number.doubleValue()); + } + + try { + return new BigDecimal(number.toString()); + } catch (NumberFormatException e) { + throw new RuntimeException("The given number (\"" + number + "\" of class " + number.getClass().getName() + ") does not have a parsable string representation", e); + } + } + + private boolean numbersEquals(Number expected, Number actual) { + if (isSpecialNumber(expected) || isSpecialNumber(actual)) { + return Double.compare(expected.doubleValue(), actual.doubleValue()) == 0; + } else { + return toBigDecimal(expected).compareTo(toBigDecimal(actual)) == 0; + } + } +} diff --git a/runtime/v1/project-model/src/test/java/com/walmartlabs/concord/project/yaml/YamlParserTest.java b/runtime/v1/project-model/src/test/java/com/walmartlabs/concord/project/yaml/YamlParserTest.java index ea389f811d..4b3d364a79 100644 --- a/runtime/v1/project-model/src/test/java/com/walmartlabs/concord/project/yaml/YamlParserTest.java +++ b/runtime/v1/project-model/src/test/java/com/walmartlabs/concord/project/yaml/YamlParserTest.java @@ -2594,6 +2594,31 @@ public void testOld() { assertThrows(RuntimeException.class, () -> deploy("old.yml")); } + + @Test + public void test113() throws Exception { + deploy("113.yml"); + + MyLogger logger = spy(new MyLogger()); + register("myLogger", logger); + + TestTaskWithResume testTask = spy(new TestTaskWithResume()); + register("testTask", testTask); + + // --- + + String key = UUID.randomUUID().toString(); + start(key, "main"); + + resume(key, "myEvent"); + + resume(key, "myEvent"); + + // --- + verify(logger, times(1)).log(eq("RESUME1")); + verify(logger, times(1)).log(eq("RESUME2")); + } + private ProcessDefinition findSubprocess(ProcessDefinition pd) { return pd.getChildren().stream() .filter(e -> e instanceof ProcessDefinition) @@ -2704,6 +2729,25 @@ public void call(Object arg1, Object arg2) { } } + private static class TestTaskWithResume implements JavaDelegate { + + public static final String SUSPEND_MARKER = "TestTaskWithResumeSuspend"; + + @Override + public void execute(ExecutionContext ctx) { + Object in = ctx.getVariable("num"); + + if (ctx.getVariable(SUSPEND_MARKER) != null && (Boolean) ctx.getVariable(SUSPEND_MARKER)) { + ctx.setVariable("TestTaskWithResumeResult", "RESUME" + in); + } else { + ctx.setVariable(SUSPEND_MARKER, true); + ctx.suspend("myEvent", null, true); + + ctx.setVariable("TestTaskWithResumeResult", "SUSPEND" + in); + } + } + } + private static class DockerTask implements JavaDelegate { @Override diff --git a/runtime/v1/project-model/src/test/resources/113.yml b/runtime/v1/project-model/src/test/resources/113.yml new file mode 100644 index 0000000000..d1761a6369 --- /dev/null +++ b/runtime/v1/project-model/src/test/resources/113.yml @@ -0,0 +1,20 @@ +main: + - task: testTask + in: + num: 1 + out: + result: ${TestTaskWithResumeResult} + + - task: myLogger + in: + message: "${result}" + + - task: testTask + in: + num: 2 + out: + result: ${TestTaskWithResumeResult} + + - task: myLogger + in: + message: "${result}" diff --git a/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/sdk/ApiClientFactoryImpl.java b/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/sdk/ApiClientFactoryImpl.java index b33f1b90c1..5f303ce493 100644 --- a/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/sdk/ApiClientFactoryImpl.java +++ b/runtime/v2/runner/src/main/java/com/walmartlabs/concord/runtime/v2/runner/sdk/ApiClientFactoryImpl.java @@ -43,7 +43,7 @@ public class ApiClientFactoryImpl implements ApiClientFactory { private final DefaultApiClientFactory clientFactory; @Inject - public ApiClientFactoryImpl(ApiConfiguration cfg, InstanceId instanceId) throws Exception { + public ApiClientFactoryImpl(ApiConfiguration cfg, InstanceId instanceId) { this.cfg = cfg; this.instanceId = instanceId; this.clientFactory = new DefaultApiClientFactory(cfg.baseUrl(), Duration.ofMillis(cfg.connectTimeout())); diff --git a/targetplatform/pom.xml b/targetplatform/pom.xml index e39b70bc23..c45b965b6e 100644 --- a/targetplatform/pom.xml +++ b/targetplatform/pom.xml @@ -38,7 +38,7 @@ 1.0 1.11.475 1.70 - 1.0.1 + 1.0.2 1.9.4 3.2.2 1.21