<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">And checking payload it was second purpose. First purpose it’s that I don’t want to use third-party static type checking systems (flow, typescript).<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">20 февр. 2018 г., в 12:54, Александр Ефремов <<a href="mailto:mr.efrem@gmail.com" class="">mr.efrem@gmail.com</a>> написал(а):</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><div class="">I use `ajv` (<a href="https://github.com/epoberezkin/ajv" class="">https://github.com/epoberezkin/ajv</a>) for checking input payloads in the microservices. But it’s enough verbose and also I don’t want to load it in the browser. My offer a more simply and quicker in use.</div></div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="">20 февр. 2018 г., в 12:34, kai zhu <<a href="mailto:kaizhu256@gmail.com" class="">kaizhu256@gmail.com</a>> написал(а):</div><br class="Apple-interchange-newline"><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" class=""><div class=""><br class="Apple-interchange-newline">On Feb 20, 2018, at 10:05 AM, Aleksander Efremov <<a href="mailto:mr.efrem@gmail.com" class="">mr.efrem@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="auto" class=""><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;">And still one question about `function decorators` . They will be work if in function parameters uses destructuring?</div><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;"><br class=""></div><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;">```</div><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;">@rttc(PrimitiveNumber, PrimitiveString, PrimitiveBoolean)</div><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;">function a (b, { c, d }) {}</div><div dir="auto" class="" style="color: rgb(128, 0, 128); font-family: sans-serif; font-size: 12.8px;">```</div></div></div></blockquote><div class=""><br class=""></div><div class="">@aleksander, javascript was not designed to validate functions and class-instances passed around inside a silo'd nodejs-process.  its designed to solve UX-problems, which requires validating data passed across multiple javascript-processes (browser <-> server <-> database).  you are only painting yourself in a corner, when you’re eventually asked by your employer to apply your nodejs validation-code to sanitize user-inputs from the browser, which you can’t because its not possible (or very difficult) to serialize functions and class-instances over tcp/udp communication.</div><div class=""><br class=""></div><div class="">the employer paying your salary would greatly appreciate it, if you created a validation-system that works not just inside a silo'd nodejs-process, but also in higher-level integrated-systems that includes browsers, storage-engines, and other nodejs-servers talking to each other via tcp/udp.</div><div class=""><br class=""></div><div class="">for these higher-level integrated-systems, your have several serialization-protocols to choose from:</div><div class="">1. json</div><div class="">2. xml</div><div class="">3. protobuf</div><div class=""><br class=""></div><div class="">however, in a javascript-only system, json will always be the obvious choice. i've worked with both xml and protobufs in nodejs, and they are both more trouble than they’re worth.  for xml, why deal with extra 3rd-party serializers and parsers you are never sure will be as reliable as builtin JSON.parse and JSON.stringify?  for protobufs, the serializers and parsers are even more unreliable (from my experience with node-grpc). they are also slower than JSON.parse and JSON.stringify due to how expensive it is to make function-calls to c++ native-code inside nodejs, and protobuf-data is not human-readable/debuggable.</div><div class=""><br class=""></div><div class="">going with json, there are several validators you can choose from.  i'm most familiar with swagger (v2.0), so will provide you with a standalone real-world swagger-solution to your</div><div class="">```js</div><div class=""><div class="">@rttc(PrimitiveNumber, PrimitiveString, PrimitiveBoolean)</div><div class="">function a (b, { c, d }) {}</div></div><div class="">```</div><div class="">validation-problem.  (with attached screenshots showing it working in both nodejs and browser)</div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span id="cid:DB5967D6-C296-4A8E-BAA1-07463063DCDB" class=""><Screen-Shot-2018-02-20-at-3.25.45-PM-compressor.png></span></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">browser-example from <a href="https://kaizhu256.github.io/node-swgg-github-all/build..beta..travis-ci.org/app/" class="">https://kaizhu256.github.io/node-swgg-github-all/build..beta..travis-ci.org/app/</a></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span id="cid:0142DE04-B7B0-47D7-B37F-E244D6A780ED" class=""><Screen-Shot-2018-02-20-at-3.03.45-PM-compressor.png></span></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```javascript</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class=""><div class=""><font face="Menlo" class="">/*</font></div><div class=""><font face="Menlo" class=""> * validate.js</font></div><div class=""><font face="Menlo" class=""> *</font></div><div class=""><font face="Menlo" class=""> * to run code in nodejs, you will need to</font></div><div class=""><font face="Menlo" class=""> * $ npm install swgg</font></div><div class=""><font face="Menlo" class=""> */</font></div><div class=""><br class=""></div><div class=""><font face="Menlo" class="">/*jslint</font></div><div class=""><font face="Menlo" class="">    bitwise: true,</font></div><div class=""><font face="Menlo" class="">    browser: true,</font></div><div class=""><font face="Menlo" class="">    maxerr: 8,</font></div><div class=""><font face="Menlo" class="">    maxlen: 100,</font></div><div class=""><font face="Menlo" class="">    node: true,</font></div><div class=""><font face="Menlo" class="">    nomen: true,</font></div><div class=""><font face="Menlo" class="">    regexp: true,</font></div><div class=""><font face="Menlo" class="">    stupid: true</font></div><div class=""><font face="Menlo" class="">*/</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">'use strict’;</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">function aa(myData) {</font></div><div class=""><font face="Menlo" class="">/*</font></div><div class=""><font face="Menlo" class=""> * this standalone (browser/nodejs compatible) function will validate myData with the given format</font></div><div class=""><font face="Menlo" class=""> * {</font></div><div class=""><font face="Menlo" class=""> *     bb: <number>,</font></div><div class=""><font face="Menlo" class=""> *     mySubData: {</font></div><div class=""><font face="Menlo" class=""> *         cc: <string>,</font></div><div class=""><font face="Menlo" class=""> *         dd: <boolean></font></div><div class=""><font face="Menlo" class=""> *     }</font></div><div class=""><font face="Menlo" class=""> * }</font></div><div class=""><font face="Menlo" class=""> */</font></div><div class=""><font face="Menlo" class="">    var myResult, swgg;</font></div><div class=""><font face="Menlo" class="">    swgg = (typeof window === 'object' && window)</font></div><div class=""><font face="Menlo" class="">        ? window.swgg</font></div><div class=""><font face="Menlo" class="">        : require('swgg');</font></div><div class=""><font face="Menlo" class="">    try {</font></div><div class=""><font face="Menlo" class="">        swgg.validateBySwaggerSchema({</font></div><div class=""><font face="Menlo" class="">            data: myData,</font></div><div class=""><font face="Menlo" class="">            prefix: ['function aa', 'myData'],</font></div><div class=""><font face="Menlo" class="">            schema: { $ref: '#/definitions/mySchema' },</font></div><div class=""><font face="Menlo" class="">            swaggerJson: {</font></div><div class=""><font face="Menlo" class="">                definitions: {</font></div><div class=""><font face="Menlo" class="">                    mySchema: {</font></div><div class=""><font face="Menlo" class="">                        properties: {</font></div><div class=""><font face="Menlo" class="">                            bb: { type: 'number' },</font></div><div class=""><font face="Menlo" class="">                            mySubData: { $ref: '#/definitions/mySubSchema' }</font></div><div class=""><font face="Menlo" class="">                        },</font></div><div class=""><font face="Menlo" class="">                        required: ['bb', 'mySubData']</font></div><div class=""><font face="Menlo" class="">                    },</font></div><div class=""><font face="Menlo" class="">                    mySubSchema: {</font></div><div class=""><font face="Menlo" class="">                        properties: {</font></div><div class=""><font face="Menlo" class="">                            cc: { type: 'string' },</font></div><div class=""><font face="Menlo" class="">                            dd: { type: 'boolean' }</font></div><div class=""><font face="Menlo" class="">                        },</font></div><div class=""><font face="Menlo" class="">                        required: ['cc', 'dd']</font></div><div class=""><font face="Menlo" class="">                    }</font></div><div class=""><font face="Menlo" class="">                }</font></div><div class=""><font face="Menlo" class="">            }</font></div><div class=""><font face="Menlo" class="">        });</font></div><div class=""><font face="Menlo" class="">    } catch (errorCaught) {</font></div><div class=""><font face="Menlo" class="">        if (typeof window === 'object' && window) {</font></div><div class=""><font face="Menlo" class="">            console.error(errorCaught.message);</font></div><div class=""><font face="Menlo" class="">        } else {</font></div><div class=""><font face="Menlo" class="">            console.error('\u001b[33m' + errorCaught.message + '\u001b[39m');</font></div><div class=""><font face="Menlo" class="">        }</font></div><div class=""><font face="Menlo" class="">        return;</font></div><div class=""><font face="Menlo" class="">    }</font></div><div class=""><font face="Menlo" class="">    // process myData after vaidation</font></div><div class=""><font face="Menlo" class="">    myResult = null;</font></div><div class=""><font face="Menlo" class="">    if (myData.mySubData.dd) {</font></div><div class=""><font face="Menlo" class="">        myResult = myData.bb + ' ' +<span class="Apple-converted-space"> </span><a href="http://mydata.mysubdata.cc/" class="">myData.mySubData.cc</a>;</font></div><div class=""><font face="Menlo" class="">    }</font></div><div class=""><font face="Menlo" class="">    console.log(myResult);</font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">// test validaton failed</font></div><div class=""><font face="Menlo" class="">aa({ bb: 'invalid number' });</font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234, mySubData: 'invalid object' });</font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234, mySubData: { cc: 'hello', dd: 'invalid boolean' } });</font></div><div class=""><font face="Menlo" class="">aa({}); // missing bb</font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234 }); // missing mySubData</font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234, mySubData: {} }); // missing<span class="Apple-converted-space"> </span><a href="http://mysubdata.cc/" class="">mySubData.cc</a></font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234, mySubData: { cc: 'hello' } }); // missing mySubData.dd</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">// test validation passed</font></div><div class=""><font face="Menlo" class="">aa({ bb: 1234, mySubData: { cc: 'hello', dd: true } });</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class="">/* output</font></div><div class=""><font face="Menlo" class="">error.objectRequired - object function aa["myData"] = {"bb":"invalid number"} must have property "mySubData"</font></div><div class=""><font face="Menlo" class="">error.itemType - value function aa["myData"]["mySubData"] = "invalid object" is not a valid object</font></div><div class=""><font face="Menlo" class="">error.itemType - value function aa["myData"]["mySubData"]["dd"] = "invalid boolean" is not a valid boolean</font></div><div class=""><font face="Menlo" class="">error.objectRequired - object function aa["myData"] = {} must have property "bb"</font></div><div class=""><font face="Menlo" class="">error.objectRequired - object function aa["myData"] = {"bb":1234} must have property "mySubData"</font></div><div class=""><font face="Menlo" class="">error.objectRequired - object function aa["myData"]["mySubData"] = {} must have property "cc"</font></div><div class=""><font face="Menlo" class="">error.objectRequired - object function aa["myData"]["mySubData"] = {"cc":"hello"} must have property "dd"</font></div><div class=""><font face="Menlo" class="">*/</font></div><div class=""><br class=""></div></div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">20 февр. 2018 г. 0:13 пользователь "mr.efrem" <<a href="mailto:mr.efrem@gmail.com" class="">mr.efrem@gmail.com</a>> написал:<br type="attribution" class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><div class="">And still one question about `function decorators` . They will be work if in function parameters uses destructuring?</div><div class="">```</div><div class="">@rttc(PrimitiveNumber, PrimitiveString, PrimitiveBoolean)</div><div class="">function a (b, { c, d }) {}<span class="Apple-converted-space"> </span></div><div class="">```</div><br class=""><br class=""><br class=""><div class=""></div><br id="m_1255439735798444966mzDivider" class=""><br class=""><br class="">-------- Исходное сообщение --------<br class="">От: "T.J. Crowder" <<a href="mailto:tj.crowder@farsightsoftware.com" target="_blank" class="">tj.crowder@farsightsoftware.<wbr class="">com</a>><br class="">Время: пн 19/2 20:58<br class="">Кому: Aleksander Efremov <<a href="mailto:mr.efrem@gmail.com" target="_blank" class="">mr.efrem@gmail.com</a>><br class="">Копия: es-discuss <<a href="mailto:es-discuss@mozilla.org" target="_blank" class="">es-discuss@mozilla.org</a>><br class="">Тема: Re: Proposal to add symbol: "hasInstanceStrict"<br class=""><br class=""><div dir="ltr" class="">On Mon, Feb 19, 2018 at 4:50 PM, Aleksander Efremov <<a href="mailto:mr.efrem@gmail.com" target="_blank" class="">mr.efrem@gmail.com</a>> wrote:<br class="">> In my first example you can found what I mean.<br class=""><div class=""><br class=""></div><div class="">Yes, I looked at your first example (and every other example in the thread) before replying. As it had nothing to do with `fetch`, but you specifically mentioned `fetch` in your message, I assumed you were asking something about `fetch`. If you were talking about the `const` in `const c: PrimitiveNumber = sum(1, 2);`, why say "`fetch`"?</div><div class=""><br class=""></div><div class="">-- T.J. Crowder</div></div></blockquote></div></div>_______________________________________________<br class="">es-discuss mailing list<br class=""><a href="mailto:es-discuss@mozilla.org" class="">es-discuss@mozilla.org</a><br class=""><a href="https://mail.mozilla.org/listinfo/es-discuss" class="">https://mail.mozilla.org/listinfo/es-discuss</a></div></blockquote></div></div></blockquote></div><br class=""></div></div></blockquote></div><br class=""></body></html>