Skip to content

Commit

Permalink
fix(ui): Fix yup validation bugs (#594)
Browse files Browse the repository at this point in the history
# Description
Similar to caraml-dev/turing#387, this PR to
fixes broken validation schemas caused by the upgrade of the `yup`
package in PR #591 - these changes can largely be grouped into the
following:

- The `Schema.when` function has been
[updated](https://github.com/jquense/yup?tab=readme-ov-file#schemawhenkeys-string--string-builder-object--values-any-schema--schema-schema),
such that when the builder object (one with the fields `is`, `then`, and
sometimes `otherwise` defined) is passed as an argument, the `then`
field accepts ONLY functions of the following signature `(schema:
Schema) => Schema` instead of `Schema` previously.

Existing schemas that do not follow this convention have been updated
and turned into arrow functions.
  
  Example:
  ```javascript
  // before
  some_field: yup.string().when("some_other_field", {
    is: "nop",
    then: yup.string().required("this is needed")
  }),

  // after
  some_field: yup.string().when("some_other_field", {
    is: "nop",
    then: (_) => yup.string().required("this is needed")
  }),
  ```
- When using the same `Schema.when` function but passing a function
directly as an argument instead of the builder object, the signature of
the expected function has also been updated from `(value, schema)=>
Schema): Schema` to `(values: any[], schema) => Schema): Schema`.

Existing schemas that do not follow this convention now have been
updated to reflect the new expected array:

  Example:
  ```javascript
  // before
some_field: yup.string().when("some_other_field", (some_other_field,
schema) =>
    some_other_field ? yup.string().required("this is needed") : schema
  ),

  // after
some_field: yup.string().when("some_other_field", ([some_other_field],
schema) =>
    some_other_field ? yup.string().required("this is needed") : schema
  ),
  ```
## Unrelated Update
This PR also bumps up the version of the `caraml-dev/ui-lib` library to
the latest version.

# Modifications
- UI bug fixes
- Update to `caraml-dev/ui-lib` library

# Tests
<!-- Besides the existing / updated automated tests, what specific
scenarios should be tested? Consider the backward compatibility of the
changes, whether corner cases are covered, etc. Please describe the
tests and check the ones that have been completed. Eg:
- [x] Deploying new and existing standard models
- [ ] Deploying PyFunc models
-->

# Checklist
- [x] Added PR label
- [ ] Added unit test, integration, and/or e2e tests
- [x] Tested locally
- [ ] Updated documentation
- [ ] Update Swagger spec if the PR introduce API changes
- [ ] Regenerated Golang and Python client if the PR introduces API
changes

# Release Notes
```release-note
NONE
```
  • Loading branch information
deadlycoconuts authored Jul 23, 2024
1 parent 5b37909 commit 5e91806
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 34 deletions.
2 changes: 1 addition & 1 deletion ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"private": true,
"homepage": "/merlin",
"dependencies": {
"@caraml-dev/ui-lib": "^1.12.1-build.15-4f7955c",
"@caraml-dev/ui-lib": "^1.13.0-build.3-a234b6b",
"@elastic/datemath": "^5.0.3",
"@elastic/eui": "^94.5.2",
"@emotion/css": "^11.11.2",
Expand Down
19 changes: 10 additions & 9 deletions ui/src/pages/version/components/forms/validation/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as yup from "yup";

const cpuRequestRegex = /^(\d{1,3}(\.\d{1,3})?)$|^(\d{2,5}m)$/,
memRequestRegex = /^\d+(Ei?|Pi?|Ti?|Gi?|Mi?|Ki?)?$/,
gpuRequestRegex= /^\d+$/,
envVariableNameRegex = /^[a-z0-9_]*$/i,
dockerImageRegex =
/^([a-z0-9]+(?:[._-][a-z0-9]+)*(?::\d{2,5})?\/)?([a-z0-9]+(?:[._-][a-z0-9]+)*\/)*([a-z0-9]+(?:[._-][a-z0-9]+)*)(?::[a-z0-9]+(?:[._-][a-z0-9]+)*)?$/i;
Expand All @@ -19,9 +20,9 @@ const resourceRequestSchema = (maxAllowedReplica) => yup.object().shape({
gpu_request: yup
.string()
.typeError("GPU value is required")
.when("gpu_resource_type", {
is: (v) => v !== undefined && v !== "None",
then: yup.string().required("GPU value is required"),
.when("gpu_name", {
is: (v) => v !== undefined,
then: (_) => yup.string().matches(gpuRequestRegex, { message:'Valid GPU value is required'}).required("GPU value is required"),
}),
min_replica: yup
.number()
Expand All @@ -39,7 +40,7 @@ const resourceRequestSchema = (maxAllowedReplica) => yup.object().shape({
// eslint-disable-next-line no-template-curly-in-string
"Max Replicas value has exceeded allowed number of replicas: ${max}"
)
.when("min_replica", (minReplica, schema) =>
.when("min_replica", ([minReplica], schema) =>
minReplica === 0
? schema.positive("Max Replica should be positive")
: schema
Expand Down Expand Up @@ -101,7 +102,7 @@ const feastFeaturesSchema = yup.object().shape({
export const feastInputSchema = yup.object().shape({
tableName: yup.string().when("isTableNameEditable", {
is: true,
then: yup.string().required("Table name is required"),
then: (_) => yup.string().required("Table name is required"),
}),
project: yup.string().required("Project name is required"),
source: yup.string().required("Source is required"),
Expand Down Expand Up @@ -142,7 +143,7 @@ const tablesInputSchema = yup.object().shape({
}),
columns: yup
.array()
.when("baseTable.fromTable.tableName", (tableName, schema) => {
.when("baseTable.fromTable.tableName", ([tableName], schema) => {
return tableName !== undefined ? yup.array(variableInputSchema) : schema;
}),
});
Expand Down Expand Up @@ -172,14 +173,14 @@ const tableTransformationStep = yup.object().shape({
.of(yup.string())
.when("operation", {
is: (v) => v !== undefined && v === "dropColumns",
then: yup.array().required("List of columns to be deleted is required"),
then: (_) => yup.array().required("List of columns to be deleted is required"),
}),
selectColumns: yup
.array()
.of(yup.string())
.when("operation", {
is: (v) => v !== undefined && v === "selectColumns",
then: yup.array().required("List of columns to be selected is required"),
then: (_) => yup.array().required("List of columns to be selected is required"),
}),
});

Expand Down Expand Up @@ -208,7 +209,7 @@ const transformationPipelineSchema = yup.object().shape({
.when("how", {
is: (v) =>
v !== undefined && v !== "" && v !== "CROSS" && v !== "CONCAT",
then: yup.array().required("On Columns is required"),
then: (_) => yup.array().required("On Columns is required"),
}),
}),
});
Expand Down
95 changes: 71 additions & 24 deletions ui/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1161,10 +1161,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==

"@caraml-dev/ui-lib@^1.12.1-build.15-4f7955c":
version "1.12.1-build.15-4f7955c"
resolved "https://registry.yarnpkg.com/@caraml-dev/ui-lib/-/ui-lib-1.12.1-build.15-4f7955c.tgz#5c75a629bfa84dfa5ccd6a4afbea8b2a76ad3fd6"
integrity sha512-M/FohpbBvqFFHYeE+UONstjjpeIU+6xBiWa2dZ27LGw2aKb7xpYOVTo+t3SxJK+aJR/XgSCErPsdQL+JCvOEBw==
"@caraml-dev/ui-lib@^1.13.0-build.3-a234b6b":
version "1.13.0-build.4-09c363a"
resolved "https://registry.yarnpkg.com/@caraml-dev/ui-lib/-/ui-lib-1.13.0-build.4-09c363a.tgz#c80987fa5c7989450095d354acf51a023ca94e15"
integrity sha512-kqb/5koS2IQtdLJIh5tk+t30ZX2GvvQO7kAuE9oKXKlwBPr83Q+lvLxcvSg+rxILYxjOUeNn2izoej0ZGMDoRg==
dependencies:
"@react-oauth/google" "0.12.1"
classnames "^2.5.1"
Expand All @@ -1178,7 +1178,7 @@
react-ellipsis-text "^1.2.1"
react-fast-compare "^3.2.2"
react-scroll "^1.9.0"
react-sticky "^6.0.3"
react-stickynode "^4.1.1"
resize-observer-polyfill "^1.5.1"
yup "^1.4.0"

Expand Down Expand Up @@ -1301,9 +1301,9 @@
tslib "^1.9.3"

"@elastic/eui@^94.5.2":
version "94.5.2"
resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.5.2.tgz#f26a94343b92388f9e18be9e4bb5659957e92d44"
integrity sha512-rSheSetb35YbyfLGmLE4vLYgvNbQERHb5k3abKce+mo19cuvQZxuRj1b87N6B4ZSe1zvipGyvfuvFMp2p2spdQ==
version "94.6.0"
resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-94.6.0.tgz#fd56be1dbdcdea259cdb3504085c8479fa35bcef"
integrity sha512-lYXVcylXn4Iz2WumBuOEkc1PRFoUby7CTnNhTS/gVrbTP7Mn0ombcoPFUSiZcA7VuN2mHfPmTUdBQptC/apTzA==
dependencies:
"@hello-pangea/dnd" "^16.6.0"
"@types/lodash" "^4.14.202"
Expand Down Expand Up @@ -2551,9 +2551,9 @@
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==

"@types/lodash@^4.14.202":
version "4.17.4"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.4.tgz#0303b64958ee070059e3a7184048a55159fe20b7"
integrity sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==
version "4.17.7"
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.7.tgz#2f776bcb53adc9e13b2c0dfd493dfcbd7de43612"
integrity sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==

"@types/mdast@^3.0.0":
version "3.0.15"
Expand Down Expand Up @@ -3800,7 +3800,7 @@ classcat@^5.0.3:
resolved "https://registry.yarnpkg.com/classcat/-/classcat-5.0.5.tgz#8c209f359a93ac302404a10161b501eba9c09c77"
integrity sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==

classnames@^2.5.1:
classnames@^2.0.0, classnames@^2.5.1:
version "2.5.1"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
Expand Down Expand Up @@ -4025,7 +4025,7 @@ core-js-pure@^3.23.3:
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.37.1.tgz#2b4b34281f54db06c9a9a5bd60105046900553bd"
integrity sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==

core-js@3, core-js@^3.19.2:
core-js@3, core-js@^3.19.2, core-js@^3.6.5:
version "3.37.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.37.1.tgz#d21751ddb756518ac5a00e4d66499df981a62db9"
integrity sha512-Xn6qmxrQZyB0FFY8E3bgRXei3lWDJHhvI+u0q9TKIYM49G8pAr0FgnnrFRAmsbptZL1yxRADVXn+x5AGsbBfyw==
Expand Down Expand Up @@ -5248,6 +5248,11 @@ etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==

eventemitter3@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==

eventemitter3@^4.0.0:
version "4.0.7"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
Expand Down Expand Up @@ -8878,7 +8883,7 @@ prompts@^2.0.1, prompts@^2.4.2:
kleur "^3.0.3"
sisteransi "^1.0.5"

prop-types@^15.5.8, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
Expand Down Expand Up @@ -8970,7 +8975,7 @@ raf-schd@^4.0.3:
resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a"
integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==

raf@^3.3.0, raf@^3.4.1:
raf@^3.0.0, raf@^3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
Expand Down Expand Up @@ -9303,13 +9308,16 @@ react-scroll@^1.9.0:
lodash.throttle "^4.1.1"
prop-types "^15.7.2"

react-sticky@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/react-sticky/-/react-sticky-6.0.3.tgz#7a18b643e1863da113d7f7036118d2a75d9ecde4"
integrity sha512-LNH4UJlRatOqo29/VHxDZOf6fwbgfgcHO4mkEFvrie5FuaZCSTGtug5R8NGqJ0kSnX8gHw8qZN37FcvnFBJpTQ==
react-stickynode@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/react-stickynode/-/react-stickynode-4.1.1.tgz#ea63509a1d83195a7846d8f39be1e4e9ccbf1d3e"
integrity sha512-+Xp3xantrxbFjqNiSbpvsZwCqZYiPq0njKTA+QsIZdmEHih1H/lOV9/LpS37d+v92iSydJJTZMeRaENWeqGeIA==
dependencies:
prop-types "^15.5.8"
raf "^3.3.0"
classnames "^2.0.0"
core-js "^3.6.5"
prop-types "^15.6.0"
shallowequal "^1.0.0"
subscribe-ui-event "^2.0.6"

react-string-replace@^0.4.1:
version "0.4.4"
Expand Down Expand Up @@ -9951,6 +9959,11 @@ [email protected]:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==

shallowequal@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==

shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
Expand Down Expand Up @@ -10200,7 +10213,16 @@ string-natural-compare@^3.0.1:
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==

"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0:
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"

string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
Expand Down Expand Up @@ -10305,7 +10327,14 @@ stringify-object@^3.3.0:
is-obj "^1.0.1"
is-regexp "^1.0.0"

"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"

strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
Expand Down Expand Up @@ -10374,6 +10403,15 @@ [email protected]:
resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==

subscribe-ui-event@^2.0.6:
version "2.0.7"
resolved "https://registry.yarnpkg.com/subscribe-ui-event/-/subscribe-ui-event-2.0.7.tgz#8d18b6339c35b25246a5335775573f0e5dc461f8"
integrity sha512-Acrtf9XXl6lpyHAWYeRD1xTPUQHDERfL4GHeNuYAtZMc4Z8Us2iDBP0Fn3xiRvkQ1FO+hx+qRLmPEwiZxp7FDQ==
dependencies:
eventemitter3 "^3.0.0"
lodash "^4.17.15"
raf "^3.0.0"

sucrase@^3.32.0:
version "3.35.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263"
Expand Down Expand Up @@ -11550,7 +11588,16 @@ [email protected]:
"@types/trusted-types" "^2.0.2"
workbox-core "6.6.1"

"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"

wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
Expand Down

0 comments on commit 5e91806

Please sign in to comment.