{"id":494978,"date":"2026-09-17T08:01:36","date_gmt":"2026-09-17T08:01:36","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=494978"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=494978","title":{"rendered":"\u042f \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 5 \u043b\u0435\u0442"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>7 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0432 npm \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &#8212; <a href=\"https:\/\/www.npmjs.com\/package\/custom-border-mixin\" rel=\"noopener nofollow\">custom-border-mixin<\/a>. \u0422\u043e\u0433\u0434\u0430 \u044f \u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u043f\u0440\u043e\u043f\u0430\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0432\u043e\u0451 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c SCSS-\u043c\u0438\u043a\u0441\u0438\u043d. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0432\u0435\u0441\u0451\u043b\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 SCSS, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0445\u0435\u043b\u043f\u0435\u0440:<\/p>\n<pre><code>@function param-get($parameters, $key) {  $value: map-get($parameters, $key);  @if $key == 'side' and $value != 'top' and $value != 'right' and $value != 'bottom' and $value != 'left' {    @error 'Value #{$value} of property #{$key} must be either top, or right, or bottom, or left, or vertical, or horizontal, or all.';  }  @if ($key == 'size' or $key == 'length' or $key == 'gap') and (type-of($value) != number or type-of($value) == number and $value &lt; 0) {    @error 'Value #{$value} of property #{$key} must be non-negative size number.';  }  @if $key == 'color' and type-of($value) != color {    @error 'Value #{$value} of property #{$key} must be color.';  }  @if $key == 'start' and $value != 'origin' and $value != 'center' and $value != 'opposite' {    @error 'Value #{$value} of property #{$key} must be either origin, center, or opposite.';  }  @return $value;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u0438\u043a\u0441\u0438\u043d \u043d\u0438\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0438 \u043d\u0438\u043a\u0442\u043e \u043e \u043d\u0451\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0438\u043b, \u043d\u043e, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u043d \u0437\u0430\u0436\u0451\u0433 \u0432\u043e \u043c\u043d\u0435 \u043d\u0435\u043a\u0443\u044e \u0441\u0442\u0440\u0430\u0441\u0442\u044c. \u0414\u0443\u043c\u0430\u044e, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043b\u044e\u0434\u0438 \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441.<\/p>\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <a href=\"https:\/\/x.com\/dzakh_dev\" rel=\"noopener nofollow\">\u0414\u043c\u0438\u0442\u0440\u0438\u0439<\/a>, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0434\u0438\u0437\u0430\u0439\u043d \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 API. \u0418 \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0445\u043e\u0440\u043e\u0448\u0435\u0439.<\/p>\n<p>\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. 5 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0437\u0430\u0432\u0451\u043b \u0441\u0432\u043e\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u043f\u0440\u043e\u0435\u043a\u0442 <a href=\"https:\/\/github.com\/DZakh\/sury\" rel=\"noopener nofollow\">Sury<\/a>. \u0423\u0436\u0435 v11, \u0438 \u044f \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0431\u0438\u043b. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 <a href=\"https:\/\/envio.dev\/\" rel=\"noopener nofollow\">Envio<\/a>, \u0433\u0434\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c\u0433\u0438 \u0434\u0435\u043b\u0430\u044e \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430 (<a href=\"https:\/\/github.com\/enviodev\/hyperindex\" rel=\"noopener nofollow\">HyperIndex \u043d\u0430 GitHub<\/a>).<\/p>\n<h3>\u041a\u0430\u043a AI \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0434\u0438\u0437\u0430\u0439\u043d API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a?<\/h3>\n<p>\u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0435\u0436\u0434\u0443 API \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438 \u0434\u043b\u044f AI-\u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043e\u043a\u0438, \u0447\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c <em>\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/em>. \u0421 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b API \u0441\u0430\u043c\u043e \u0432\u0435\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u2026<\/p>\n<p><strong>\u2026\u0432 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 pit of success<\/strong> &#8212; \u0434\u0430-\u0434\u0430, \u044f \u0437\u043d\u0430\u044e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0440\u0435\u0435\u0442.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0432 \u0440\u0435\u043b\u0438\u0437\u0435 <a href=\"https:\/\/github.com\/DZakh\/sury\" rel=\"noopener nofollow\">Sury<\/a> v11. Sury &#8212; \u044d\u0442\u043e JavaScript-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0445\u0435\u043c, \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430 \u043d\u0435\u0439.<\/p>\n<h3>1. \u042f\u0432\u043d\u043e\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e<\/h3>\n<p>\u0412 Sury \u043d\u0435\u0442 <code>parse<\/code>. \u042f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0434\u0435-\u0442\u043e \u0442\u0430\u043c \u043a\u0438\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0438\u043c\u0435\u043d\u0438, \u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c:<\/p>\n<pre><code>S.parseOrThrow(userSchema, data);\/\/ { id: \"p_1\" }S.parseAsResult(userSchema, data);\/\/ { success: true, value: { id: \"p_1\" } }\/\/ { success: false, issues: [{message: \"Expected string, received 42\", path: [\"name\"]}]}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0431\u043e\u0440 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043a\u043e\u0434\u0435. \u0410\u0433\u0435\u043d\u0442 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u0442 <code>parseAsResult<\/code>, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442.<\/p>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u0441 Zod, \u0433\u0434\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0438\u043c\u044f \u0434\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c <code>parse<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code>userSchema.parse(data); \/\/ throwsuserSchema.safeParse(data); \/\/ returns a result<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 <code>safeParse<\/code>, \u0442\u043e <code>parse<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u201csafe\u201d, \u043f\u0440\u0430\u0432\u0434\u0430? \u041d\u0438\u0447\u0442\u043e \u0432 <code>parse<\/code> \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u0437\u0430 \u0438\u043c\u0435\u043d\u0435\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/p>\n<p>\u0418\u0440\u043e\u043d\u0438\u0447\u043d\u043e, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u0435\u043b\u0430\u0435\u0442 AI. \u0423 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u043e\u0433\u043b\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u0435\u0434\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0441\u0447\u0451\u0442 <code>parse<\/code>.<\/p>\n<h4>\u0422\u0430 \u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0436\u0435<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 <code>is<\/code>\/<code>validate<\/code>. \u0427\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0445\u0435\u043c\u0430-\u043b\u0438\u0431\u0435, \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e:<\/p>\n<pre><code>if (is(userSchema, data)) {  \/\/ data \u0432\u0435\u0434\u044c User, \u0434\u0430?}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0445\u0435\u043c\u0430 \u0447\u0442\u043e-\u0442\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442, \u0443 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u041a\u0430\u0436\u0434\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0437\u0430 \u0432\u0430\u0441, \u0438, \u0441\u044e\u0440\u043f\u0440\u0438\u0437, \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043e\u043d\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u0425\u0435\u043b\u043f\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/zod.dev\/\" rel=\"noopener nofollow\">Zod<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>z.validate(schema, data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Input<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/valibot.dev\/\" rel=\"noopener nofollow\">Valibot<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>v.is(schema, data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Input<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/arktype.io\/\" rel=\"noopener nofollow\">ArkType<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>schema.allows(data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Input<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/sinclairzx81\/typebox\" rel=\"noopener nofollow\">TypeBox<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Value.Check(schema, data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Input<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/gcanti\/io-ts\" rel=\"noopener nofollow\">io-ts<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>codec.is(data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Output<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/effect.website\/\" rel=\"noopener nofollow\">Effect<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>Schema.is(schema)(data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Output<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/ianstormtaylor\/superstruct\" rel=\"noopener nofollow\">Superstruct<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>is(data, struct)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Output<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/jquense\/yup\" rel=\"noopener nofollow\">Yup<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>schema.isValidSync(data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/joi.dev\/\" rel=\"noopener nofollow\">Joi<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>schema.validate(data)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><a href=\"https:\/\/github.com\/DZakh\/sury\" rel=\"noopener nofollow\">Sury<\/a><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>S.isInput<\/code> \/ <code>S.isOutput<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441\u0430\u043c\u0438<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0432 <code>package.json<\/code>. \u0410 Yup \u0441 Joi \u0432 \u0442\u0438\u0445\u0443\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u201c\u0434\u0430\u201d \u043e\u0431\u043e\u0438\u043c.<\/p>\n<p>\u042d\u0442\u0430\u043a\u0430\u044f \u0440\u0443\u0441\u0441\u043a\u0430\u044f \u0440\u0443\u043b\u0435\u0442\u043a\u0430. \ud83d\udc40<\/p>\n<p>\u0412\u043e\u0442 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>S.is<\/code> \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<pre><code>const priceSchema = S.string.with(S.to, S.number);S.isInput(priceSchema, \"42\"); \/\/ trueS.isOutput(priceSchema, \"42\"); \/\/ false<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>2. \u041b\u044e\u0431\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u043e<\/h3>\n<p>\u0410\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u043b \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0440\u0430\u0442\u0438\u0442 \u043d\u0430 \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u044e\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0421 \u043b\u044e\u0434\u044c\u043c\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0437\u0430\u043f\u043e\u043c\u043d\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u041d\u043e \u0437\u0430\u0447\u0435\u043c? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a:<\/p>\n<pre><code>S.parseOrThrow(data, userSchema);S.parseOrThrow(userSchema, data);S.parseOrThrow(userSchema)(data);S.isInput(data, userSchema);S.isInput(userSchema, data);S.isInput(userSchema)(data);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0441\u0435 \u043e\u043d\u0438 \u0434\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f.<\/p>\n<h3>3. \u0417\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e<\/h3>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0435\u0439\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442 \u0437\u0430 \u0432\u0430\u0441. \u042f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c:<\/p>\n<pre><code>S.decodeOrThrow(S.env, S.string);\/\/ SuryError: Ambiguous \"\" for string. Should a blank input be rejected,\/\/ kept, or read as absent? Choose with S.nonEmpty, S.minLength(0),\/\/ or S.optional<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043f\u0430\u0434\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430, \u0430 \u043d\u0435 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u044d\u0442\u043e, \u043f\u043e\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u0434. \u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438 \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0430 \u0432\u0430\u0441.<\/p>\n<h3>4. \u0410\u043b\u0438\u0430\u0441\u044b \u043f\u043e\u0434 \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435<\/h3>\n<p>\u041a\u0430\u043a \u0431\u044b \u043c\u043d\u0435 \u043d\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0434\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0451 API, \u0430\u0433\u0435\u043d\u0442 \u0438\u043b\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u043a\u043e\u043c. \u0411\u043e\u0440\u044c\u0431\u0430 \u0441 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442 \u043b\u0438\u0448\u043d\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0430\u043b\u0438\u0430\u0441\u044b:<\/p>\n<pre><code>S.union([\"admin\", { role: \"user\" }]); \/\/ \u0418\u0434\u0435\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 Sury \u043a\u043e\u0434S.union([S.schema(\"admin\"), S.schema({ role: S.schema(\"user\") })]); \/\/ \u042f\u0432\u043d\u044b\u0439 Sury \u043a\u043e\u0434S.union([S.literal(\"admin\"), S.object({ role: S.literal(\"user\") })]); \/\/ Zod-like API \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0441\u0442\u0438\/\/ \u0432\u0441\u0435 \u0442\u0440\u0438: Schema&lt;\"admin\" | { role: \"user\" }&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0438\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0432\u0430\u043c \u0432 \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043b\u0438\u043d\u0442\u0435\u0440\u0430, \u0430 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0432\u0441\u0435\u0445:<\/p>\n<pre><code>\/\/ eslint.config.js\"no-restricted-syntax\": [\"error\", {  selector: \"CallExpression[callee.object.name='S'][callee.property.name='object']\",  message: \"Use S.schema instead of S.object\",}]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a pit of success<\/h3>\n<p>\u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e AI. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0432\u0435\u0434\u0451\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0430 \u043b\u0443\u0447\u0448\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0430\u0433\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0449\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0412\u0441\u0451 \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/DZakh\/sury\" rel=\"noopener nofollow\">Sury<\/a> v11, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0432\u044b\u0448\u0435\u043b. \u0410 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0445\u0435\u043c \u0438 \u0434\u0438\u0437\u0430\u0439\u043d \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u0435\u043d\u044f \u0432 <a href=\"https:\/\/x.com\/dzakh_dev\" rel=\"noopener nofollow\">X<\/a> &#8212; \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u043e\u0439 \u0434\u0435\u043d\u044c \ud83d\ude4f<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1083256\/\">https:\/\/habr.com\/ru\/articles\/1083256\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>7 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b \u0432 npm \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 &#8212; custom-border-mixin. \u0422\u043e\u0433\u0434\u0430 \u044f \u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u044e \u043f\u0440\u043e\u043f\u0430\u043b, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0442\u043e\u0431\u044b \u0432 \u0441\u0432\u043e\u0451 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c SCSS-\u043c\u0438\u043a\u0441\u0438\u043d. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0432\u0435\u0441\u0451\u043b\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 SCSS, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0445\u0435\u043b\u043f\u0435\u0440:@function param-get($parameters, $key) {  $value: map-get($parameters, $key);  @if $key == &#8216;side&#8217; and $value != &#8216;top&#8217; and $value != &#8216;right&#8217; and $value != &#8216;bottom&#8217; and $value != &#8216;left&#8217; {    @error &#8216;Value #{$value} of property #{$key} must be either top, or right, or bottom, or left, or vertical, or horizontal, or all.&#8217;;  }  @if ($key == &#8216;size&#8217; or $key == &#8216;length&#8217; or $key == &#8216;gap&#8217;) and (type-of($value) != number or type-of($value) == number and $value &lt; 0) {    @error &#8216;Value #{$value} of property #{$key} must be non-negative size number.&#8217;;  }  @if $key == &#8216;color&#8217; and type-of($value) != color {    @error &#8216;Value #{$value} of property #{$key} must be color.&#8217;;  }  @if $key == &#8216;start&#8217; and $value != &#8216;origin&#8217; and $value != &#8216;center&#8217; and $value != &#8216;opposite&#8217; {    @error &#8216;Value #{$value} of property #{$key} must be either origin, center, or opposite.&#8217;;  }  @return $value;}\u041c\u0438\u043a\u0441\u0438\u043d \u043d\u0438\u043a\u043e\u043c\u0443 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0438 \u043d\u0438\u043a\u0442\u043e \u043e \u043d\u0451\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0438\u043b, \u043d\u043e, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043e\u043d \u0437\u0430\u0436\u0451\u0433 \u0432\u043e \u043c\u043d\u0435 \u043d\u0435\u043a\u0443\u044e \u0441\u0442\u0440\u0430\u0441\u0442\u044c. \u0414\u0443\u043c\u0430\u044e, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043b\u044e\u0434\u0438 \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441.\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439, \u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u043e \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043d\u0430 \u0434\u0438\u0437\u0430\u0439\u043d \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 API. \u0418 \u043a\u0430\u043a \u043e\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0445\u043e\u0440\u043e\u0448\u0435\u0439.\u042f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. 5 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0437\u0430\u0432\u0451\u043b \u0441\u0432\u043e\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u043f\u0440\u043e\u0435\u043a\u0442 Sury. \u0423\u0436\u0435 v11, \u0438 \u044f \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0431\u0438\u043b. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 Envio, \u0433\u0434\u0435 \u0437\u0430 \u0434\u0435\u043d\u044c\u0433\u0438 \u0434\u0435\u043b\u0430\u044e \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438 \u0431\u043b\u043e\u043a\u0447\u0435\u0439\u043d\u0430 (HyperIndex \u043d\u0430 GitHub).\u041a\u0430\u043a AI \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0434\u0438\u0437\u0430\u0439\u043d API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a?\u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u0435\u0436\u0434\u0443 API \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438 \u0434\u043b\u044f AI-\u0430\u0433\u0435\u043d\u0442\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e, \u0447\u0442\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u043e\u043a\u0438, \u0447\u0442\u043e-\u0442\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0421 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b API \u0441\u0430\u043c\u043e \u0432\u0435\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u2026\u2026\u0432 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 pit of success &#8212; \u0434\u0430-\u0434\u0430, \u044f \u0437\u043d\u0430\u044e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0440\u0435\u0435\u0442.\u041a\u0440\u043e\u043c\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445, \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0432 \u0440\u0435\u043b\u0438\u0437\u0435 Sury v11. Sury &#8212; \u044d\u0442\u043e JavaScript-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0445\u0435\u043c, \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0430 \u043d\u0435\u0439.1. \u042f\u0432\u043d\u043e\u0435 \u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e\u0412 Sury \u043d\u0435\u0442 parse. \u042f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0434\u0435-\u0442\u043e \u0442\u0430\u043c \u043a\u0438\u043d\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u043d\u0438\u043a\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0438\u043c\u0435\u043d\u0438, \u0438 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u0442\u044c:S.parseOrThrow(userSchema, data);\/\/ { id: &#171;p_1&#187; }S.parseAsResult(userSchema, data);\/\/ { success: true, value: { id: &#171;p_1&#187; } }\/\/ { success: false, issues: [{message: &#171;Expected string, received 42&#187;, path: [&#171;name&#187;]}]}\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0431\u043e\u0440 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043a\u043e\u0434\u0435. \u0410\u0433\u0435\u043d\u0442 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u0442 parseAsResult, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0433\u0435\u043d\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442.\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u0441 Zod, \u0433\u0434\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0435 \u0438\u043c\u044f \u0434\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c parse, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0438\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443:userSchema.parse(data); \/\/ throwsuserSchema.safeParse(data); \/\/ returns a result\u0415\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0441 safeParse, \u0442\u043e parse \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u201csafe\u201d, \u043f\u0440\u0430\u0432\u0434\u0430? \u041d\u0438\u0447\u0442\u043e \u0432 parse \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u0437\u0430 \u0438\u043c\u0435\u043d\u0435\u043c, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435.\u0418\u0440\u043e\u043d\u0438\u0447\u043d\u043e, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0435\u0432\u044c\u044e \u0434\u0435\u043b\u0430\u0435\u0442 AI. \u0423 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043c\u043e\u0433\u043b\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u043f\u0440\u0435\u0434\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0441\u0447\u0451\u0442 parse.\u0422\u0430 \u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u0443\u0436\u0435\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 is\/validate. \u0427\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0435\u0441\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0445\u0435\u043c\u0430-\u043b\u0438\u0431\u0435, \u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u043e:if (is(userSchema, data)) {  \/\/ data \u0432\u0435\u0434\u044c User, \u0434\u0430?}\u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0445\u0435\u043c\u0430 \u0447\u0442\u043e-\u0442\u043e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442, \u0443 \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0434\u0432\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u041a\u0430\u0436\u0434\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0437\u0430 \u0432\u0430\u0441, \u0438, \u0441\u044e\u0440\u043f\u0440\u0438\u0437, \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0442 \u043e\u043d\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443:\u0425\u0435\u043b\u043f\u0435\u0440\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442Zodz.validate(schema, data)InputValibotv.is(schema, data)InputArkTypeschema.allows(data)InputTypeBoxValue.Check(schema, data)Inputio-tscodec.is(data)OutputEffectSchema.is(schema)(data)OutputSuperstructis(data, struct)OutputYupschema.isValidSync(data)\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u0430Joischema.validate(data)\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u043e\u0431\u0430SuryS.isInput \/ S.isOutput\u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0441\u0430\u043c\u0438\u041e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u044b\u0437\u043e\u0432, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b, \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0432 package.json. \u0410 Yup \u0441 Joi \u0432 \u0442\u0438\u0445\u0443\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u201c\u0434\u0430\u201d \u043e\u0431\u043e\u0438\u043c.\u042d\u0442\u0430\u043a\u0430\u044f \u0440\u0443\u0441\u0441\u043a\u0430\u044f \u0440\u0443\u043b\u0435\u0442\u043a\u0430. \ud83d\udc40\u0412\u043e\u0442 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 S.is \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:const priceSchema = S.string.with(S.to, S.number);S.isInput(priceSchema, &#171;42&#187;); \/\/ trueS.isOutput(priceSchema, &#171;42&#187;); \/\/ false2. \u041b\u044e\u0431\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u0432\u0430\u0436\u043d\u043e\u0410\u0433\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u043b \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0440\u0430\u0442\u0438\u0442 \u043d\u0430 \u044d\u0442\u043e \u043b\u0438\u0448\u043d\u044e\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0421 \u043b\u044e\u0434\u044c\u043c\u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u0437\u0430\u043f\u043e\u043c\u043d\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0430. \u041d\u043e \u0437\u0430\u0447\u0435\u043c? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a:S.parseOrThrow(data, userSchema);S.parseOrThrow(userSchema, data);S.parseOrThrow(userSchema)(data);S.isInput(data, userSchema);S.isInput(userSchema, data);S.isInput(userSchema)(data);\u0412\u0441\u0435 \u043e\u043d\u0438 \u0434\u0430\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 &#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f.3. \u0417\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e\u041a\u043e\u0433\u0434\u0430 \u043a\u0435\u0439\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443, \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0435\u0444\u043e\u043b\u0442 \u0437\u0430 \u0432\u0430\u0441. \u042f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432\u044b\u0431\u0440\u0430\u0442\u044c:S.decodeOrThrow(S.env, S.string);\/\/ SuryError: Ambiguous &#171;&#187; for string. Should a blank input be rejected,\/\/ kept, or read as absent? Choose with S.nonEmpty, S.minLength(0),\/\/ or S.optional\u0418 \u043f\u0430\u0434\u0430\u0435\u0442 \u044d\u0442\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0435\u0440\u0430, \u0430 \u043d\u0435 \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u044d\u0442\u043e, \u043f\u043e\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u0434. \u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f &#8212; \u044d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438 \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u043e\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0430 \u0432\u0430\u0441.4. \u0410\u043b\u0438\u0430\u0441\u044b \u043f\u043e\u0434 \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435\u041a\u0430\u043a \u0431\u044b \u043c\u043d\u0435 \u043d\u0438 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0434\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0451 API, \u0430\u0433\u0435\u043d\u0442 \u0438\u043b\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u043d\u0430\u043a\u043e\u043c. \u0411\u043e\u0440\u044c\u0431\u0430 \u0441 \u044d\u0442\u0438\u043c \u0441\u0442\u043e\u0438\u0442 \u043b\u0438\u0448\u043d\u0435\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b \u0430\u043b\u0438\u0430\u0441\u044b:S.union([&#171;admin&#187;, { role: &#171;user&#187; }]); \/\/ \u0418\u0434\u0435\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439 Sury \u043a\u043e\u0434S.union([S.schema(&#171;admin&#187;), S.schema({ role: S.schema(&#171;user&#187;) })]); \/\/ \u042f\u0432\u043d\u044b\u0439 Sury \u043a\u043e\u0434S.union([S.literal(&#171;admin&#187;), S.object({ role: S.literal(&#171;user&#187;) })]); \/\/ Zod-like API \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0441\u0442\u0438\/\/ \u0432\u0441\u0435 \u0442\u0440\u0438: Schema&lt;&#171;admin&#187; | { role: &#171;user&#187; }&gt;\u0410 \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0438\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0432\u0430\u043c \u0432 \u0441\u0432\u043e\u0435\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043b\u0438\u043d\u0442\u0435\u0440\u0430, \u0430 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430 \u0432\u0441\u0435\u0445:\/\/ eslint.config.js&#187;no-restricted-syntax&#187;: [&#171;error&#187;, {  selector: &#171;CallExpression[callee.object.name=&#8217;S&#8217;][callee.property.name=&#8217;object&#8217;]&#187;,  message: &#171;Use S.schema instead of S.object&#187;,}]\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a pit of success\u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e AI. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0430\u043c\u0430 \u0432\u0435\u0434\u0451\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0438 \u0434\u043b\u044f \u043b\u044e\u0434\u0435\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u044b\u043b\u0430 \u043b\u0443\u0447\u0448\u0435. \u041f\u0440\u043e\u0441\u0442\u043e \u0430\u0433\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0449\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0440\u0430\u043d\u044c\u0448\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.\u0412\u0441\u0451 \u044d\u0442\u043e \u0435\u0441\u0442\u044c \u0432 Sury v11, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0432\u044b\u0448\u0435\u043b. \u0410 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441\u0445\u0435\u043c \u0438 \u0434\u0438\u0437\u0430\u0439\u043d \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u0435\u043d\u044f \u0432 X &#8212; \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u043e\u0439 \u0434\u0435\u043d\u044c \ud83d\ude4f\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1083256\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-494978","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=494978"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494978\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=494978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=494978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=494978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}