1;(function () {// LICENSE_CODE ZON 2 'use strict'; /*jslint browser:true, es6:true, node:true, react:true*/function _typeof(o) {"@babel/helpers - typeof";return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {return typeof o;} : function (o) {return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;}, _typeof(o);} 3 var define; 4 var is_node = (typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports; 5 if (is_node) 6 define = require('../../../../util/require_node.js').define(module, '..');else 7 8 define = self.define; 9 define([], function () { 10 var E = {}; 11 E.intro = [['div', 12 [['h1', 13 ["JS Coding Convention"], 14 { className: "title" }], 15 16 ['p', 17 [['b', 18 ["Improvements? Suggestions?"]], " email ", 19 20 21 ['a', 22 ["[email protected]"], 23 { href: "mailto:[email protected]" }], " "]], 24 25 26 27 ['p', 28 [" Coding conventions used by other companies: ", 29 ['a', 30 ["AirBNB"], 31 { href: "https://github.com/airbnb/javascript" }], " | ", 32 33 34 ['a', 35 ["google"], 36 { href: "https://google.github.io/styleguide/javascriptguide.xml" }], " | ", 37 38 39 ['a', 40 ["crockford"], 41 { href: "http://javascript.crockford.com/code.html" }], " | ", 42 43 44 ['a', 45 ["wordpress"], 46 { href: "https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/" }], " | ", 47 48 49 ['a', 50 ["drupal"], 51 { href: "https://www.drupal.org/node/172169" }], " | ", 52 53 54 ['a', 55 ["weflex"], 56 { href: "https://github.com/weflex/javascript" }], " "]]], 57 58 59 60 { className: "head" }]]; 61 62 E.data = [ 63 { 64 id: 'overview', 65 title: "Overview: consistent & minimal", 66 tag: 'h2', 67 "short": "Overview", 68 html: [] 69 }, 70 { 71 id: 'overview-consistent', 72 title: "Be consistent", 73 tag: 'h3', 74 "short": "Be consistent", 75 html: [['p', 76 [" If there is no specific rule in this document - ", 77 ['a', 78 ["be consistent with existing codebase"], 79 { href: "/dna#dna-consistent" }], " (use ", 80 81 82 ['a', 83 ["rgrep"], 84 { href: "/dna/dict#rgrep" }], ").", 85 86 87 ['br'], " If you're editing code, take a few minutes to look at the code\n around you and determine its style.", 88 89 90 ['br'], " If it prints error messages starting with a capital letter,\n you should too. If it put spaces around complex expressions\n but not around simple expressions, your complex expressions\n should also have spaces around them.", 91 92 93 94 95 ['br'], " The point of having style guidelines is to have a common\n vocabulary of coding, so people can concentrate on what\n you're saying rather than on how you're saying it.", 96 97 98 99 ['br'], " If code you add to a file looks drastically different from the\n existing code around it, it throws readers out of their\n rhythm when they go to read it.", 100 101 102 103 ['br'], " Avoid this. "]]] 104 105 106 }, 107 { 108 id: 'overview-minimal', 109 title: "Minimalistic and Condense", 110 tag: 'h3', 111 "short": "Minimalistic", 112 html: [['p', 113 [" Wherever there is no specific rule, ", 114 ['a', 115 ["always prefer minimalism"], 116 { href: "/dna#effective-minimal" }], ".", 117 118 119 ['br'], " Less tokens, higher condensity: get as much code as possible\n visible within the screen, so less scrolling is needed.", 120 121 122 ['br'], " Sparse, elaborate, defensive code is not appreciated.", 123 124 ['br'], 125 ['a', 126 ["An example of absurd over-engineering"], 127 { href: "https://chaosinmotion.blog/2011/01/25/how-not-to-write-factorial-in-java" }], ". Although it's for Java, but the general idea holds for JS. "]]] 128 129 130 131 }, 132 { 133 id: 'overview-tool', 134 title: "Tools", 135 tag: 'h3', 136 "short": "Tools", 137 html: [['p', 138 [" We write code by hand, line-by-line. We do have tools to\n assist us locating conventions mistakes ", 139 140 ['code', 141 ["zlint -c"]], ", but they are just a 'helpers'.", 142 143 144 ['br'], " The tools match our conventions only ", 145 146 ['b', 147 ["95%"]], ", so its still our personal responsibility to manually make\n sure line-by-line the code we write matches the conventions\n ", 148 149 150 151 152 ['b', 153 ["100%"]], ", whether the tool finds the mistakes or not. "]]] 154 155 156 157 }, 158 { 159 id: 'overview-text_layout', 160 title: "Text file layout", 161 tag: 'h3', 162 "short": "Text file layout", 163 html: [['p', 164 [" Tab size is 8 spaces.", 165 ['br'], " Shift width (indentation) is 4 spaces.", 166 167 ['br'], " Column width 79 char, so it fits well with 80 col terminal.", 168 169 ['br'], " Indentation is always one shift-width(4):", 170 171 ['br']]], 172 173 ['pre', 174 ["open_msg_box(\"closing file %s on server\\n\",\n file_name);\n"], 175 176
177 { className: "cm-s-default code bad has-popover", 178 cat: "bad", 179 'data-content': "BAD", 180 'data-original-title': "", 181 title: "" }], 182 183 ['pre', 184 ["open_msg_box(\"closing file %s on server\\n\",\n file_name);\n"], 185 186 187 { className: "cm-s-default code good has-popover", 188 cat: "good", 189 'data-content': "GOOD", 190 'data-original-title': "", 191 title: "" }]] 192 193 }, 194 { 195 id: 'format', 196 title: "Formatting and naming", 197 tag: 'h2', 198 "short": "Formatting and naming", 199 html: [] 200 }, 201 { 202 id: 'format-block', 203 title: "\n Code blocks and statements", 204 205 tag: 'h3', 206 "short": "Code blocks and statements", 207 html: [['ul', 208 [['li', 209 [['code', 210 ["if"]], 211 212 ['code', 213 ["for"]], 214 215 ['code', 216 ["while"]], " don't require a code block for 0 or 1 statements: open ", 217 218 219 ['code', 220 ["{"]], " on next line. only use a block for multiline blocks. "]], 221 222 223 224 ['li', 225 [['code', 226 ["try"]], 227 228 ['code', 229 ["catch"]], 230 231 ['code', 232 ["function"]], " require a code block in all cases: open ", 233 234 235 ['code', 236 ["{"]], " on the same line. "]]]]] 237 238 239 240 241 }, 242 { 243 id: 'format-block-if_for_while', 244 title: "\n if/for/while", 245 246 tag: 'h4', 247 "short": "if/for/while", 248 html: [] 249 }, 250 { 251 id: 'format-block-if_for_while-block', 252 title: "\n if/for/while block", 253 254 tag: 'h5', 255 "short": "block", 256 html: [['p', 257 [['code', 258 ["if"]], 259 260 ['code', 261 ["for"]], 262 263 ['code', 264 ["while"]], " open and close braces of a section should be on the same\n level."]], 265 266 267 268 269 ['pre', 270 ["if (pkt) {\n pkt.close();\n pkt.uninit();\n}\n"], 271 272 273 274 275 { className: "cm-s-default code bad has-popover", 276 cat: "bad", 277 'data-content': "BAD", 278 'data-original-title': "", 279 title: "" }], 280 281 ['pre', 282 ["if (pkt)\n{\n pkt.close();\n pkt.uninit();\n}\n"], 283 284 285 286 287 288 { className: "cm-s-default code good has-popover", 289 cat: "good", 290 'data-content': "GOOD", 291 'data-original-title': "", 292 title: "" }], 293 294 ['p', 295 [['code', 296 ["if"]], 297 298 ['code', 299 ["for"]], 300 301 ['code', 302 ["while"]], " statement that takes more than one line should always have\n braces", 303 304 305 306 ['br'], " same thing goes when the then/loop part is more than one line\n "]], 307 308 309 310 ['pre', 311 ["if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n slot.dw_function==pci_scan.card_slot[ret].dw_function)\n{\n break;\n}\n"], 312 313 314 315 316 317 318 { className: "cm-s-default code good has-popover", 319 cat: "good", 320 'data-content': "GOOD", 321 'data-original-title': "", 322 title: "" }], 323 324 ['pre', 325 ["if (x==y)\n{\n my_func(param1, param2, param3, param4, param5, param6,\n param7);\n}\n"], 326 327 328 329 330 331 { className: "cm-s-default code good has-popover", 332 cat: "good", 333 'data-content': "GOOD", 334 'data-original-title': "", 335 title: "" }], 336 337 ['pre', 338 ["for (ret=0; ret<pci_scan.dw_cards; ret++)\n if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n slot.dw_function==pci_scan.card_slot[ret].dw_function)\n break;\n"], 339 340 341 342 343 344 { className: "cm-s-default code bad has-popover", 345 cat: "bad", 346 'data-content': "BAD", 347 'data-original-title': "", 348 title: "" }], 349 350 ['pre', 351 ["for (ret=0; ret<pci_scan.dw_cards; ret++)\n{\n if (slot.dw_bus==pci_scan.card_slot[ret].dw_bus &&\n slot.dw_slot==pci_scan.card_slot[ret].dw_slot &&\n slot.dw_function==pci_scan.card_slot[ret].dw_function)\n {\n break;\n }\n}\n"], 352 353 354 355 356 357 358 359 360 361 { className: "cm-s-default code good has-popover", 362 cat: "good", 363 'data-content': "GOOD", 364 'data-original-title': "", 365 title: "" }]] 366 367 }, 368 { 369 id: 'format-if_for_while-no_statement', 370 title: "\n if/for/while without a statement\n", 371 372 373 tag: 'h5', 374 "short": "if/for/while without a statement", 375 html: [['pre', 376 ["while(pop_first(list))\n ;\n"], 377 378
379 { className: "cm-s-default code bad has-popover", 380 cat: "bad", 381 'data-content': "BAD", 382 'data-original-title': "", 383 title: "" }], 384 385 ['pre', 386 ["while (pop_first(list));\n"], 387 388 { className: "cm-s-default code good has-popover", 389 cat: "good", 390 'data-content': "GOOD", 391 'data-original-title': "", 392 title: "" }], 393 394 ['pre', 395 ["for(i=0; i<10; i++)\n ;\n"], 396 397 398 { className: "cm-s-default code bad has-popover", 399 cat: "bad", 400 'data-content': "BAD", 401 'data-original-title': "", 402 title: "" }], 403 404 ['pre', 405 ["for (i=0; i<10; i++);\n"], 406 407 { className: "cm-s-default code good has-popover", 408 cat: "good", 409 'data-content': "GOOD", 410 'data-original-title': "", 411 title: "" }], 412 413 ['pre', 414 ["if (a>b+10)\n ;\nelse if (a>b+5)\n do_x();\nelse if (a>b+2)\n ;\nelse\n do_y();\n"], 415 416 417 418 419 420 421 422 423 { className: "cm-s-default code bad has-popover", 424 cat: "bad", 425 'data-content': "BAD", 426 'data-original-title': "", 427 title: "" }], 428 429 ['pre', 430 ["if (a>b+10);\nelse if (a>b+5)\n do_x();\nelse if (a>b+2);\nelse\n do_y();\n"], 431 432 433 434 435 436 437 { className: "cm-s-default code good has-popover", 438 cat: "good", 439 'data-content': "GOOD", 440 'data-original-title': "", 441 title: "" }]] 442 443 }, 444 { 445 id: 'format-block-then', 446 title: "Then", 447 tag: 'h5', 448 "short": "Then", 449 html: [['p', 450 [" 'then' part of ", 451 ['code', 452 ["if"]], " statement should be in a separate line. "]], 453 454 455 456 ['pre', 457 ["if (close_file) fclose(fp);\n"], 458 459 { className: "cm-s-default code bad has-popover", 460 cat: "bad", 461 'data-content': "BAD", 462 'data-original-title': "", 463 title: "" }], 464 465 ['pre', 466 ["if (close_file)\n fclose(fp);\n"], 467 468 469 { className: "cm-s-default code good has-popover", 470 cat: "good", 471 'data-content': "GOOD", 472 'data-original-title': "", 473 title: "" }]] 474 475 }, 476 { 477 id: 'format-block-else_if', 478 title: "else if", 479 tag: 'h5', 480 "short": "else if", 481 html: [['p', 482 [['code', 483 ["else if"]], " statements should be on the same level at the starting ", 484 485 486 ['code', 487 ["if"]], " reason: this is similar to ", 488 489 490 ['code', 491 ["switch"]], " statement "]], 492 493 494 495 ['pre', 496 ["if (argv[1]===\"--help\") print_usage();\nelse if (argv[1]===\"--run\") {\n run_application();\n print_results();\n} else print_error();\n"], 497 498 499 500 501 502 { className: "cm-s-default code bad has-popover", 503 cat: "bad", 504 'data-content': "BAD", 505 'data-original-title': "", 506 title: "" }], 507 508 ['pre', 509 ["if (argv[1]===\"--help\")\n print_usage();\nelse if (argv[1]===\"--run\")\n{\n run_application();\n print_results();\n}\nelse\n print_error();\n"], 510 511 512 513 514 515 516 517 518 519 { className: "cm-s-default code good has-popover", 520 cat: "good", 521 'data-content': "GOOD", 522 'data-original-title': "", 523 title: "" }]] 524 525 }, 526 { 527 id: 'format-block-func', 528 title: "Functions", 529 tag: 'h4', 530 "short": "Functions", 531 html: [['p', 532 [" Tiny functions: same line.", 533 ['br'], " One-liner: body in second line.", 534 535 ['br'], " Two lines and above: a proper block. if anon ", 536 537 ['code', 538 ["function"]], ": block open in same line.", 539 540 541 ['br']]], 542 543 ['pre', 544 ["var tiny = function(){code;};\nvar tiny = function() { code; };\n"], 545 546 547 { className: "cm-s-default code bad has-popover", 548 cat: "bad", 549 'data-content': "BAD", 550 'data-original-title': "", 551 title: "" }], 552 553 ['pre', 554 ["var tiny = function(){ code; };\n"], 555 556 { className: "cm-s-default code good has-popover", 557 cat: "good", 558 'data-content': "GOOD", 559 'data-original-title': "", 560 title: "" }], 561 562 ['pre', 563 ["var tiny = function()\n{\n code;\n};\n"], 564 565 566 567
568 { className: "cm-s-default code bad has-popover", 569 cat: "bad", 570 'data-content': "BAD", 571 'data-original-title': "", 572 title: "" }], 573 574 ['pre', 575 ["var tiny = function(){\n code; };\nvar tiny = function(){\n code;\n};\n"], 576 577 578 579 580 581 { className: "cm-s-default code good has-popover", 582 cat: "good", 583 'data-content': "GOOD", 584 'data-original-title': "", 585 title: "" }], 586 587 ['pre', 588 ["function tiny(){code;};\nfunction tiny() { code; };\nfunction tiny()\n{\n code;\n}\n"], 589 590 591 592 593 594 595 { className: "cm-s-default code bad has-popover", 596 cat: "bad", 597 'data-content': "BAD", 598 'data-original-title': "", 599 title: "" }], 600 601 ['pre', 602 ["function tiny(){ code; }\nfunction tiny(){\n code; }\nfunction tiny(){\n code;\n}\n"], 603 604 605 606 607 608 609 { className: "cm-s-default code good has-popover", 610 cat: "good", 611 'data-content': "GOOD", 612 'data-original-title': "", 613 title: "" }], 614 615 ['pre', 616 ["function long(args){\n code;\n code; }\nfunction long(args)\n{\n code;\n code;\n}\n"], 617 618 619 620 621 622 623 624 625 { className: "cm-s-default code bad has-popover", 626 cat: "bad", 627 'data-content': "BAD", 628 'data-original-title': "", 629 title: "" }], 630 631 ['pre', 632 ["function long(args){\n code;\n code;\n}\n"], 633 634 635 636 637 { className: "cm-s-default code good has-popover", 638 cat: "good", 639 'data-content': "GOOD", 640 'data-original-title': "", 641 title: "" }], 642 643 ['pre', 644 ["function long_args(a1, a2, a3,\n a4){\n code;\n code;\n}\n"], 645 646 647 648 649 650 { className: "cm-s-default code bad has-popover", 651 cat: "bad", 652 'data-content': "BAD", 653 'data-original-title': "", 654 title: "" }], 655 656 ['pre', 657 ["function long_args(a1, a2, a3,\n a4)\n{\n code;\n code;\n}\n"], 658 659 660 661 662 663 664 { className: "cm-s-default code good has-popover", 665 cat: "good", 666 'data-content': "GOOD", 667 'data-original-title': "", 668 title: "" }]] 669 670 }, 671 { 672 id: 'format-block-func-inline', 673 title: "Inline functions", 674 tag: 'h5', 675 "short": "Inline functions", 676 html: [['p', 677 ["Function definition that fits the line:"]], 678 679 ['pre', 680 ["let x = parse_args(...args, function(line){\n let escaped = E.escape(line);\n ...\n});\n"], 681 682 683 684 685 { className: "cm-s-default code good has-popover", 686 cat: "good", 687 'data-content': "GOOD", 688 'data-original-title': "", 689 title: "" }], 690 691 ['p', 692 ["Function definition that does not fit the line:"]], 693 694 ['pre', 695 ["let x = parse_args(a, b, c, d, e,\nfunction(line, err)\n{\n let escaped = E.escape(line);\n ...\n});\n"], 696 697 698 699 700 701 702 { className: "cm-s-default code bad has-popover", 703 cat: "bad", 704 'data-content': "BAD", 705 'data-original-title': "", 706 title: "" }], 707 708 ['pre', 709 ["let x = parse_args(a, b, c, d, e, function(line,\n err)\n{\n let escaped = E.escape(line);\n ...\n});\n"], 710 711 712 713 714 715 716 { className: "cm-s-default code good has-popover", 717 cat: "good", 718 'data-content': "GOOD", 719 'data-original-title': "", 720 title: "" }], 721 722 ['pre', 723 ["let x = parse_args(a, b, c, d, e,\n function(line, err){\n let escaped = E.escape(line);\n ...\n });\n"], 724 725 726 727 728 729 { className: "cm-s-default code good has-popover", 730 cat: "good", 731 'data-content': "GOOD", 732 'data-original-title': "", 733 title: "" }], 734 735 ['pre', 736 ["let x = parse_args(a, b, c, d, e,\n function(line, err)\n{\n let escaped = E.escape(line);\n ...\n});\n"], 737 738 739 740 741 742 743 { className: "cm-s-default code good has-popover", 744 cat: "good", 745 'data-content': "GOOD", 746 'data-original-title': "", 747 title: "" }]] 748 749 }, 750 { 751 id: 'format-block-func-spacing', 752 title: "Functions spacing", 753 tag: 'h5', 754 "short": "Functions spacing", 755 html: [['p', 756 [" No space between function name and opening parenthesis", 757 ['br'], " No space between opening parenthesis and first parameter", 758 759 ['br'], " One space after comma: "]], 760 761 762 ['pre', 763 ["printf (\"hello %s\\n\", \"world\");\nprintf( \"hello world\\n\" );\nprintf(\"hello world\\n\",\"world\");\n"], 764 765 766
767 { className: "cm-s-default code bad has-popover", 768 cat: "bad", 769 'data-content': "BAD", 770 'data-original-title': "", 771 title: "" }], 772 773 ['pre', 774 ["printf(\"hello %s\\n\", \"world\");\n"], 775 776 { className: "cm-s-default code good has-popover", 777 cat: "good", 778 'data-content': "GOOD", 779 'data-original-title': "", 780 title: "" }]] 781 782 }, 783 { 784 id: 'format-block-break_line', 785 title: "Breaking a long line", 786 tag: 'h4', 787 "short": "Breaking a long line", 788 html: [['p', 789 ["When breaking up a long line, it should continue with one\n shift-width for indentation"]], 790 791 792 ['pre', 793 ["if (line_length>1 && (screen.sz.vertical<buffer.sz.vertical\n || explicit_lines))\n{\n console.log(\"this is a test section that will show how to handle \"+\n \"long lines, such as this one which is 2 lines long\");\n}\n"], 794 795 796 797 798 799 800 { className: "cm-s-default code bad has-popover", 801 cat: "bad", 802 'data-content': "BAD", 803 'data-original-title': "", 804 title: "" }], 805 806 ['pre', 807 ["if (line_length>1 && (screen.sz.vertical<buffer.sz.vertical\n || explicit_lines))\n{\n console.log('this is a test section that will show how to handle '+\n 'long lines, such as this one which is 2 lines long');\n}\n"], 808 809 810 811 812 813 814 { className: "cm-s-default code good has-popover", 815 cat: "good", 816 'data-content': "GOOD", 817 'data-original-title': "", 818 title: "" }]] 819 820 }, 821 { 822 id: 'format-block-switch', 823 title: "\n switch statements", 824 825 tag: 'h4', 826 "short": "Switch statement", 827 html: [['p', 828 [['code', 829 ["switch"]], " statements should have ", 830 831 832 ['code', 833 ["case"]], " on the same level, no space before ", 834 835 836 ['code', 837 [":"]], ".", 838 839 840 ['br']]], 841 842 ['pre', 843 ["switch (key)\n{\n case KEY_UP :\n key = UP;\n break;\n case KEY_DOWN :\n key = DN;\n break;\n default :\n key = NONE;\n}\n"], 844 845 846 847 848 849 850 851 852 853 854 855 { className: "cm-s-default code bad has-popover", 856 cat: "bad", 857 'data-content': "BAD", 858 'data-original-title': "", 859 title: "" }], 860 861 ['pre', 862 ["switch (key)\n{\ncase KEY_UP:\n key = UP;\n break;\ncase KEY_DOWN:\n key = DN;\n break;\ndefault:\n key = NONE;\n}\n"], 863 864 865 866 867 868 869 870 871 872 873 874 { className: "cm-s-default code good has-popover", 875 cat: "good", 876 'data-content': "GOOD", 877 'data-original-title': "", 878 title: "" }], 879 880 ['pre', 881 ["switch (key)\n{\ncase KEY_UP: key = UP; break;\ncase KEY_DOWN: key = DN; break;\ndefault: key = NONE;\n}\n"], 882 883 884 885 886 887 888 { className: "cm-s-default code good has-popover", 889 cat: "good", 890 'data-content': "GOOD", 891 'data-original-title': "", 892 title: "" }], 893 894 ['p', 895 [" 1-liner ", 896 ['code', 897 ["case"]], ": with single statement plus ", 898 899 900 ['code', 901 ["break"]], ", or a ", 902 903 904 ['code', 905 ["return"]], " statement. "]], 906 907 908 909 ['pre', 910 ["switch (key)\n{\ncase KEY_UP:\n line--;\n break;\ncase KEY_DOWN:\n for (x=line; x; x--)\n line++;\n break;\ncase KEY_ESC:\n return;\ndefault:\n bubble = true;\n}\n"], 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 { className: "cm-s-default code bad has-popover", 926 cat: "bad", 927 'data-content': "BAD", 928 'data-original-title': "", 929 title: "" }], 930 931 ['pre', 932 ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_DOWN:\n for (x=line; x; x--)\n line++;\n break;\ncase KEY_ESC: return;\ndefault: bubble = true;\n}\n"], 933 934 935 936 937 938 939 940 941 942 943 { className: "cm-s-default code good has-popover", 944 cat: "good", 945 'data-content': "GOOD", 946 'data-original-title': "", 947 title: "" }], 948 949 ['p', 950 ["Never ", 951 ['code', 952 ["break"]], " after ", 953 954 955 ['code', 956 ["return"]]]], 957 958 959 ['pre', 960 ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_ESC: return; break;\n}\n"], 961 962 963 964 965
966 { className: "cm-s-default code bad has-popover", 967 cat: "bad", 968 'data-content': "BAD", 969 'data-original-title': "", 970 title: "" }], 971 972 ['pre', 973 ["switch (key)\n{\ncase KEY_UP: line--; break;\ncase KEY_ESC: return;\n}\n"], 974 975 976 977 978 979 { className: "cm-s-default code good has-popover", 980 cat: "good", 981 'data-content': "GOOD", 982 'data-original-title': "", 983 title: "" }], 984 985 ['p', 986 ["Never ", 987 ['code', 988 ["break"]], " at end of ", 989 990 991 ['code', 992 ["default"]]]], 993 994 995 ['pre', 996 ["switch (key)\n{\ncase KEY_UP: line--; break;\ndefault: line++; break;\n}\n"], 997 998 999 1000 1001 1002 { className: "cm-s-default code bad has-popover", 1003 cat: "bad", 1004 'data-content': "BAD", 1005 'data-original-title': "", 1006 title: "" }], 1007 1008 ['pre', 1009 ["switch (key)\n{\ncase KEY_UP: line--; break;\ndefault: line++;\n}\n"], 1010 1011 1012 1013 1014 1015 { className: "cm-s-default code good has-popover", 1016 cat: "good", 1017 'data-content': "GOOD", 1018 'data-original-title': "", 1019 title: "" }]] 1020 1021 }, 1022 { 1023 id: 'format-block-reserved', 1024 title: "Reserved words", 1025 tag: 'h4', 1026 "short": "Reserved words", 1027 html: [['p', 1028 [" One space after reserved words before the opening parenthesis,\n except for ", 1029 1030 ['code', 1031 ["function"]], " and ", 1032 1033 1034 ['code', 1035 ["catch"]], " (which is function like): "]], 1036 1037 1038 1039 ['pre', 1040 ["if(close_file)\n"], 1041 1042 { className: "cm-s-default code bad has-popover", 1043 cat: "bad", 1044 'data-content': "BAD", 1045 'data-original-title': "", 1046 title: "" }], 1047 1048 ['pre', 1049 ["if (close_file)\n"], 1050 1051 { className: "cm-s-default code good has-popover", 1052 cat: "good", 1053 'data-content': "GOOD", 1054 'data-original-title': "", 1055 title: "" }], 1056 1057 ['pre', 1058 ["for(i=0; !is_last(i); i++);\n"], 1059 1060 { className: "cm-s-default code bad has-popover", 1061 cat: "bad", 1062 'data-content': "BAD", 1063 'data-original-title': "", 1064 title: "" }], 1065 1066 ['pre', 1067 ["for (i=0; !is_last(i); i++);\n"], 1068 1069 { className: "cm-s-default code good has-popover", 1070 cat: "good", 1071 'data-content': "GOOD", 1072 'data-original-title': "", 1073 title: "" }], 1074 1075 ['pre', 1076 ["try{ code; } catch (e) { code; }\n"], 1077 1078 { className: "cm-s-default code bad has-popover", 1079 cat: "bad", 1080 'data-content': "BAD", 1081 'data-original-title': "", 1082 title: "" }], 1083 1084 ['pre', 1085 ["try { code; } catch(e){ code; }\n"], 1086 1087 { className: "cm-s-default code good has-popover", 1088 cat: "good", 1089 'data-content': "GOOD", 1090 'data-original-title': "", 1091 title: "" }], 1092 1093 ['pre', 1094 ["var t = function (api) { api('test'); };\n"], 1095 1096 { className: "cm-s-default code bad has-popover", 1097 cat: "bad", 1098 'data-content': "BAD", 1099 'data-original-title': "", 1100 title: "" }], 1101 1102 ['pre', 1103 ["var t = function(api){ api('test'); };\n"], 1104 1105 { className: "cm-s-default code good has-popover", 1106 cat: "good", 1107 'data-content': "GOOD", 1108 'data-original-title': "", 1109 title: "" }]] 1110 1111 }, 1112 { 1113 id: 'format-block-try_catch', 1114 title: "\n try-catch", 1115 1116 tag: 'h4', 1117 "short": "try-catch", 1118 html: [['p', 1119 [" Multiline ", 1120 ['code', 1121 ["try"]], ": close block on ", 1122 1123 1124 ['code', 1125 ["catch"]], " line (like ", 1126 1127 1128 ['code', 1129 ["do-while"]], "): "]], 1130 1131 1132 1133 ['pre', 1134 ["try { short_code; } catch(e){ code; }\n"], 1135 1136 { className: "cm-s-default code good has-popover", 1137 cat: "good", 1138 'data-content': "GOOD", 1139 'data-original-title': "", 1140 title: "" }], 1141 1142 ['pre', 1143 ["try {\n longer_code; }\ncatch(e){ code; }\n"], 1144 1145 1146 1147 { className: "cm-s-default code good has-popover", 1148 cat: "good", 1149 'data-content': "GOOD", 1150 'data-original-title': "", 1151 title: "" }], 1152 1153 ['pre', 1154 ["try {\n and_even;\n longer_code;\n} catch(e){ code; }\n"], 1155 1156 1157 1158
1159 { className: "cm-s-default code good has-popover", 1160 cat: "good", 1161 'data-content': "GOOD", 1162 'data-original-title': "", 1163 title: "" }], 1164 1165 ['p', 1166 ["Catch variable should be named 'e'"]], 1167 1168 ['pre', 1169 ["try { res = yield etask.nfn_apply(zmongo.collection, '.save', [obj]); }\ncatch(error){ handle_error(zmongo, 'save', error, obj); }\n"], 1170 1171 1172 { className: "cm-s-default code bad has-popover", 1173 cat: "bad", 1174 'data-content': "BAD", 1175 'data-original-title': "", 1176 title: "" }], 1177 1178 ['pre', 1179 ["try { res = yield etask.nfn_apply(zmongo.collection, '.save', [obj]); }\ncatch(e){ handle_error(zmongo, 'save', e, obj); }\n"], 1180 1181 1182 { className: "cm-s-default code good has-popover", 1183 cat: "good", 1184 'data-content': "GOOD", 1185 'data-original-title': "", 1186 title: "" }]] 1187 1188 }, 1189 { 1190 id: 'format-block-operator', 1191 title: "Operator spacing", 1192 tag: 'h4', 1193 "short": "Operator spacing", 1194 html: [['p', 1195 [" both sides should be equal: either space before and after, or\n no spaces at all. "]]] 1196 1197 1198 }, 1199 { 1200 id: 'format-block-operator-trivial', 1201 title: "\n Trivial > >= < <= == != expressions", 1202 1203 tag: 'h5', 1204 "short": "Trivial expressions", 1205 html: [['p', 1206 [" Trivial ", 1207 ['code', 1208 ["> >= < <= == !="]], " expressions should not have spaces around them: ", 1209 1210 1211 ['code', 1212 ["a_var"]], ". "]], 1213 1214 1215 1216 ['pre', 1217 ["if (x> 5)\nif (x >5)\nif (x > 5)\n"], 1218 1219 1220 1221 { className: "cm-s-default code bad has-popover", 1222 cat: "bad", 1223 'data-content': "BAD", 1224 'data-original-title': "", 1225 title: "" }], 1226 1227 ['pre', 1228 ["if (x>5)\n"], 1229 1230 { className: "cm-s-default code good has-popover", 1231 cat: "good", 1232 'data-content': "GOOD", 1233 'data-original-title': "", 1234 title: "" }], 1235 1236 ['p', 1237 [" Nearly-trivial expressions can be with or without spaces: ", 1238 ['code', 1239 ["a[3]"]], ", ", 1240 1241 1242 ['code', 1243 ["f(x)"]], ", ", 1244 1245 1246 ['code', 1247 ["x.y.z"]], ", ", 1248 1249 1250 ['code', 1251 ["a.b.c(x, y, z)"]], ". "]], 1252 1253 1254 1255 ['pre', 1256 ["if (f(x, y) > g(y, z))\nif (f(x, y)>g(y, z))\nif (x.y == 5)\nif (x.y==5)\nif (x.y>=5)\nif (x.y >= 5)\n"], 1257 1258 1259 1260 1261 1262 1263 { className: "cm-s-default code good has-popover", 1264 cat: "good", 1265 'data-content': "GOOD", 1266 'data-original-title': "", 1267 title: "" }], 1268 1269 ['p', 1270 [" We consider simple short arithmetics also as nearly-trivial\n expressions: ", 1271 1272 ['code', 1273 ["x+1"]], ", ", 1274 1275 1276 ['code', 1277 ["2*x"]], ". "]], 1278 1279 1280 1281 ['pre', 1282 ["if (x+1>5)\nif (x+1 > 5)\n"], 1283 1284 1285 { className: "cm-s-default code good has-popover", 1286 cat: "good", 1287 'data-content': "GOOD", 1288 'data-original-title': "", 1289 title: "" }], 1290 1291 ['p', 1292 ["if one side is not trivial, then must have spaces."]], 1293 1294 ['pre', 1295 ["if (a&&a.b)\nif (a && a.b)\n"], 1296 1297 1298 { className: "cm-s-default code good has-popover", 1299 cat: "good", 1300 'data-content': "GOOD", 1301 'data-original-title': "", 1302 title: "" }], 1303 1304 ['pre', 1305 ["if (!a&&a.b)\n"], 1306 1307 { className: "cm-s-default code bad has-popover", 1308 cat: "bad", 1309 'data-content': "BAD", 1310 'data-original-title': "", 1311 title: "" }], 1312 1313 ['pre', 1314 ["if (!a && a.b)\n"], 1315 1316 { className: "cm-s-default code good has-popover", 1317 cat: "good", 1318 'data-content': "GOOD", 1319 'data-original-title': "", 1320 title: "" }], 1321 1322 ['p', 1323 ["if one side is long, then prefer to have spaces."]], 1324 1325 ['pre', 1326 ["if (a&&Array.isArray(a))\n"], 1327 1328 { className: "cm-s-default code ok has-popover", 1329 cat: "ok", 1330 'data-content': "OK", 1331 'data-original-title': "", 1332 title: "" }], 1333 1334 ['pre', 1335 ["if (a && Array.isArray(a))\n"], 1336 1337 { className: "cm-s-default code good has-popover", 1338 cat: "good", 1339 'data-content': "GOOD", 1340 'data-original-title': "", 1341 title: "" }]] 1342 1343 }, 1344 { 1345 id: 'format-block-operator-assign', 1346 title: "\n Assignments spaces", 1347 1348 tag: 'h5', 1349 "short": "Assignments spaces", 1350 html: [['p', 1351 [" Spaces around assignments ", 1352 ['code', 1353 ["= += -= *= /= &= |="]], " are not mandatory in ", 1354 1355 1356 ['code', 1357 ["for()"]], " loops. "]], 1358 1359 1360 1361 ['pre', 1362 ["a=b;\nd+=x;\n"], 1363 1364
1365 { className: "cm-s-default code bad has-popover", 1366 cat: "bad", 1367 'data-content': "BAD", 1368 'data-original-title': "", 1369 title: "" }], 1370 1371 ['pre', 1372 ["a = b;\nd += x;\n"], 1373 1374 1375 { className: "cm-s-default code good has-popover", 1376 cat: "good", 1377 'data-content': "GOOD", 1378 'data-original-title': "", 1379 title: "" }], 1380 1381 ['pre', 1382 ["for (i=0; i<10; i+=4);\nfor (i = 0; i<10; i += 4);\n"], 1383 1384 1385 { className: "cm-s-default code good has-popover", 1386 cat: "good", 1387 'data-content': "GOOD", 1388 'data-original-title': "", 1389 title: "" }]] 1390 1391 }, 1392 { 1393 id: 'format-block-operator-unary', 1394 title: "Unary operators", 1395 tag: 'h5', 1396 "short": "Unary operators", 1397 html: [['p', 1398 [" Don't put a space after ", 1399 ['code', 1400 ["++"]], 1401 1402 ['code', 1403 ["--"]], 1404 1405 ['code', 1406 ["!"]], ", and other unary operators. increment after the value, not\n before. "]], 1407 1408 1409 1410 1411 ['pre', 1412 ["i --;\n++j;\n"], 1413 1414 1415 { className: "cm-s-default code bad has-popover", 1416 cat: "bad", 1417 'data-content': "BAD", 1418 'data-original-title': "", 1419 title: "" }], 1420 1421 ['pre', 1422 ["i--;\nj++;\n"], 1423 1424 1425 { className: "cm-s-default code good has-popover", 1426 cat: "good", 1427 'data-content': "GOOD", 1428 'data-original-title': "", 1429 title: "" }], 1430 1431 ['pre', 1432 ["if (! i)\n"], 1433 1434 { className: "cm-s-default code bad has-popover", 1435 cat: "bad", 1436 'data-content': "BAD", 1437 'data-original-title': "", 1438 title: "" }], 1439 1440 ['pre', 1441 ["if (!i)\n"], 1442 1443 { className: "cm-s-default code good has-popover", 1444 cat: "good", 1445 'data-content': "GOOD", 1446 'data-original-title': "", 1447 title: "" }], 1448 1449 ['pre', 1450 ["var speed_int = + speed_str;\n"], 1451 1452 { className: "cm-s-default code bad has-popover", 1453 cat: "bad", 1454 'data-content': "BAD", 1455 'data-original-title': "", 1456 title: "" }], 1457 1458 ['pre', 1459 ["var speed_int = +speed_str;\n"], 1460 1461 { className: "cm-s-default code good has-popover", 1462 cat: "good", 1463 'data-content': "GOOD", 1464 'data-original-title': "", 1465 title: "" }]] 1466 1467 }, 1468 { 1469 id: 'format-block-operator-multi', 1470 title: "\n Multiple +", 1471 1472 tag: 'h5', 1473 "short": "Multiple +", 1474 html: [['p', 1475 [" Multiple ", 1476 ['code', 1477 ["+"]], " operators are trivial expressions, and thus we prefer not to\n put spaces around them (such as string concatenation). "]], 1478 1479 1480 1481 1482 ['pre', 1483 ["msg = 'hello ' + name + '!';\n"], 1484 1485 { className: "cm-s-default code bad has-popover", 1486 cat: "bad", 1487 'data-content': "BAD", 1488 'data-original-title': "", 1489 title: "" }], 1490 1491 ['pre', 1492 ["msg = 'hello '+name+'!';\nmsg = 'hello '+get_my_name()+'!';\nmsg = 'hello ' + get_my_name()+'!';\n"], 1493 1494 1495 1496 { className: "cm-s-default code good has-popover", 1497 cat: "good", 1498 'data-content': "GOOD", 1499 'data-original-title': "", 1500 title: "" }]] 1501 1502 }, 1503 { 1504 id: 'format-block-operator-cond', 1505 title: "\n Conditionals ? :", 1506 1507 tag: 'h5', 1508 "short": "Conditionals", 1509 html: [['p', 1510 [['code', 1511 ["? :"]], " should have spaces all around them."]], 1512 1513 1514 1515 ['pre', 1516 ["var msg = login_ok?'Welcome':'Please login';\n"], 1517 1518 { className: "cm-s-default code bad has-popover", 1519 cat: "bad", 1520 'data-content': "BAD", 1521 'data-original-title': "", 1522 title: "" }], 1523 1524 ['pre', 1525 ["var msg = login_ok ? 'Welcome' : 'Please login';\n"], 1526 1527 { className: "cm-s-default code good has-popover", 1528 cat: "good", 1529 'data-content': "GOOD", 1530 'data-original-title': "", 1531 title: "" }]] 1532 1533 }, 1534 { 1535 id: 'format-minimal', 1536 title: "Minimalism", 1537 tag: 'h3', 1538 "short": "Minimal code", 1539 html: [] 1540 }, 1541 { 1542 id: 'format-minimal-unneeded_parentheses', 1543 title: "\n Do not use unneeded parentheses in expressions:", 1544 1545 tag: 'h4', 1546 "short": "Unneeded parentheses", 1547 html: [['pre', 1548 ["if ((a!=b) || (c!=d))\n ...\n"], 1549 1550
1551 { className: "cm-s-default code bad has-popover", 1552 cat: "bad", 1553 'data-content': "BAD", 1554 'data-original-title': "", 1555 title: "" }], 1556 1557 ['pre', 1558 ["if (a!=b || c!=d)\n ...\n"], 1559 1560 1561 { className: "cm-s-default code good has-popover", 1562 cat: "good", 1563 'data-content': "GOOD", 1564 'data-original-title': "", 1565 title: "" }]] 1566 1567 }, 1568 { 1569 id: 'format-minimal-empty_line', 1570 title: "\n Avoid empty lines", 1571 1572 tag: 'h4', 1573 "short": "Avoid empty lines", 1574 html: [['p', 1575 [" Never in any case have two empty lines together.", 1576 ['br'], " A single empty line is allowed in global scope and between\n functions, but use it sparsely.", 1577 1578 1579 ['br']]]] 1580 1581 }, 1582 { 1583 id: 'format-minimal-separate_line', 1584 title: "\n Separate line", 1585 1586 tag: 'h4', 1587 "short": "Separate line", 1588 html: [['p', 1589 [" Should not separate with more than one blank line between\n sections, functions etc. "]], 1590 1591 1592 ['pre', 1593 ["function init(){ ...; };\n\n\nfunction end(){ ...; };\n"], 1594 1595 1596 1597 1598 { className: "cm-s-default code bad has-popover", 1599 cat: "bad", 1600 'data-content': "BAD", 1601 'data-original-title': "", 1602 title: "" }], 1603 1604 ['pre', 1605 ["function init(){ ...; };\n\nfunction end(){ ...; };\n"], 1606 1607 1608 1609 { className: "cm-s-default code good has-popover", 1610 cat: "good", 1611 'data-content': "GOOD", 1612 'data-original-title': "", 1613 title: "" }], 1614 1615 ['pre', 1616 ["function init(){ ...; };\nfunction end(){ ...; };\n"], 1617 1618 1619 { className: "cm-s-default code good has-popover", 1620 cat: "good", 1621 'data-content': "GOOD", 1622 'data-original-title': "", 1623 title: "" }], 1624 1625 ['p', 1626 [" Inside functions, should never have an empty line. Use\n comments to separate. "]], 1627 1628 1629 ['pre', 1630 ["function setup_conn(orig){\n var conn = net.connect(dst);\n conn.pipe(orig);\n\n conn.set_speed('fast');\n if (conn.rx>MAX_SPEED)\n conn.set_speed('medium');\n return conn;\n}\n"], 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 { className: "cm-s-default code bad has-popover", 1641 cat: "bad", 1642 'data-content': "BAD", 1643 'data-original-title': "", 1644 title: "" }], 1645 1646 ['pre', 1647 ["function setup_conn(orig){\n var conn = net.connect(dst);\n conn.pipe(orig);\n // setup speed\n conn.set_speed('fast');\n if (conn.rx>MAX_SPEED)\n conn.set_speed('medium');\n return conn;\n}\n"], 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 { className: "cm-s-default code ok has-popover", 1658 cat: "ok", 1659 'data-content': "OK", 1660 'data-original-title': "", 1661 title: "" }], 1662 1663 ['pre', 1664 ["function setup_conn(orig){\n var conn = net.connect(dst);\n conn.pipe(orig);\n conn.set_speed('fast');\n if (conn.rx>MAX_SPEED)\n conn.set_speed('medium');\n return conn;\n}\n"], 1665 1666 1667 1668 1669 1670 1671 1672 1673 { className: "cm-s-default code good has-popover", 1674 cat: "good", 1675 'data-content': "GOOD", 1676 'data-original-title': "", 1677 title: "" }]] 1678 1679 }, 1680 { 1681 id: 'format-minimal-arrow_func', 1682 title: "\n Arrow function short syntax", 1683 1684 tag: 'h5', 1685 "short": "Arrow function short syntax", 1686 html: [['p', 1687 ["When possible, use arrow function short syntax"]], 1688 1689 ['pre', 1690 ["let t = data=>{ return do_something(data); }\n"], 1691 1692 { className: "cm-s-default code bad has-popover", 1693 cat: "bad", 1694 'data-content': "BAD", 1695 'data-original-title': "", 1696 title: "" }], 1697 1698 ['pre', 1699 ["let t = data=>do_something(data);\n"], 1700 1701 { className: "cm-s-default code good has-popover", 1702 cat: "good", 1703 'data-content': "GOOD", 1704 'data-original-title': "", 1705 title: "" }]] 1706 1707 }, 1708 { 1709 id: 'format-minimal-separate_line-return', 1710 title: "return statements", 1711 tag: 'h4', 1712 "short": "return statements", 1713 html: [] 1714 }, 1715 { 1716 id: 'format-minimal-separate_line-return-min', 1717 title: "Minimal return statement", 1718 tag: 'h5', 1719 "short": "Minimal return statement", 1720 html: [['p', 1721 [['code', 1722 ["return"]], " statements should not have parentheses and should not have a\n space after them:"]], 1723 1724 1725 1726 1727 ['pre', 1728 ["return (0);\n"], 1729
1730 { className: "cm-s-default code bad has-popover", 1731 cat: "bad", 1732 'data-content': "BAD", 1733 'data-original-title': "", 1734 title: "" }], 1735 1736 ['pre', 1737 ["return 0;\n"], 1738 1739 { className: "cm-s-default code good has-popover", 1740 cat: "good", 1741 'data-content': "GOOD", 1742 'data-original-title': "", 1743 title: "" }], 1744 1745 ['pre', 1746 ["return ;\n"], 1747 1748 { className: "cm-s-default code bad has-popover", 1749 cat: "bad", 1750 'data-content': "BAD", 1751 'data-original-title': "", 1752 title: "" }], 1753 1754 ['pre', 1755 ["return;\n"], 1756 1757 { className: "cm-s-default code good has-popover", 1758 cat: "good", 1759 'data-content': "GOOD", 1760 'data-original-title': "", 1761 title: "" }]] 1762 1763 }, 1764 { 1765 id: 'format-minimal-separate_line-return-undefined', 1766 title: "return undefined", 1767 tag: 'h5', 1768 "short": "return undefined", 1769 html: [['p', 1770 ["For ", 1771 ['code', 1772 ["return undefined"]], ", just do ", 1773 1774 1775 ['code', 1776 ["return"]], ", ", 1777 1778 1779 ['code', 1780 ["undefined"]], " is the default of JS."]], 1781 1782 1783 1784 ['p', 1785 ["If a function returns ", 1786 ['code', 1787 ["undefined"]], " at exit, you don't need to call ", 1788 1789 1790 ['code', 1791 ["return"]], "."]], 1792 1793 1794 1795 ['pre', 1796 ["function x(x){\n if (!x)\n return undefined;\n ...;\n if (x_is_valid(x))\n return x+5;\n ...;\n}\n"], 1797 1798 1799 1800 1801 1802 1803 1804 1805 { className: "cm-s-default code bad has-popover", 1806 cat: "bad", 1807 'data-content': "BAD", 1808 'data-original-title': "", 1809 title: "" }], 1810 1811 ['pre', 1812 ["function x(x){\n if (!x)\n return;\n ...;\n if (x_is_valid(x))\n return x+5;\n ...;\n}\n"], 1813 1814 1815 1816 1817 1818 1819 1820 1821 { className: "cm-s-default code good has-popover", 1822 cat: "good", 1823 'data-content': "GOOD", 1824 'data-original-title': "", 1825 title: "" }]] 1826 1827 }, 1828 { 1829 id: 'format-minimal-return-assign', 1830 title: "\n return an assignment", 1831 1832 tag: 'h5', 1833 "short": "return an assignment", 1834 html: [['p', 1835 ["You may return an assignment in order to merge assignment and\n return statments. Do not add unneeded brackets"]], 1836 1837 1838 ['pre', 1839 ["return (a = b);\n"], 1840 1841 { className: "cm-s-default code bad has-popover", 1842 cat: "bad", 1843 'data-content': "BAD", 1844 'data-original-title': "", 1845 title: "" }], 1846 1847 ['pre', 1848 ["return a = b;\n"], 1849 1850 { className: "cm-s-default code good has-popover", 1851 cat: "good", 1852 'data-content': "GOOD", 1853 'data-original-title': "", 1854 title: "" }]] 1855 1856 }, 1857 { 1858 id: 'format-minimal-return-void_cast', 1859 title: "Cast to void", 1860 tag: 'h5', 1861 "short": "Cast to void", 1862 html: [['p', 1863 ["You may 'cast' to ", 1864 ['code', 1865 ["void"]], " in order to merge an action and ", 1866 1867 1868 ['code', 1869 ["return undefined"]], " into a single line."]], 1870 1871 1872 1873 ['pre', 1874 ["return void sock.close();\n"], 1875 1876 { className: "cm-s-default code good has-popover", 1877 cat: "good", 1878 'data-content': "GOOD", 1879 'data-original-title': "", 1880 title: "" }], 1881 1882 ['pre', 1883 ["if (ret)\n return void (cache[id] = ret);\n"], 1884 1885 1886 { className: "cm-s-default code good has-popover", 1887 cat: "good", 1888 'data-content': "GOOD", 1889 'data-original-title': "", 1890 title: "" }], 1891 1892 ['pre', 1893 ["if (clock)\n clock = void clock.restore();\n"], 1894 1895 1896 { className: "cm-s-default code good has-popover", 1897 cat: "good", 1898 'data-content': "GOOD", 1899 'data-original-title': "", 1900 title: "" }]] 1901 1902 }, 1903 { 1904 id: 'format-minimal-eqal-zero', 1905 title: "Compare to 0", 1906 tag: 'h4', 1907 "short": "compare to 0", 1908 html: [['p', 1909 ["When 0 stands as non valid or empty option, avoid comparing to\n 0"]], 1910 1911 1912 ['pre', 1913 ["if (total==0)\n return 'NA';\n"], 1914 1915 1916 { className: "cm-s-default code bad has-popover", 1917 cat: "bad", 1918 'data-content': "BAD", 1919 'data-original-title': "", 1920 title: "" }], 1921 1922 ['pre', 1923 ["if (!total)\n return 'NA';\n"], 1924 1925
1926 { className: "cm-s-default code good has-popover", 1927 cat: "good", 1928 'data-content': "GOOD", 1929 'data-original-title': "", 1930 title: "" }]] 1931 1932 }, 1933 { 1934 id: 'format-long_string', 1935 title: "Long strings", 1936 tag: 'h3', 1937 "short": "Long strings", 1938 html: [['p', 1939 [" Breaking up long strings: no space around ", 1940 ['code', 1941 ["+"]], ", and prefer ", 1942 1943 1944 ['code', 1945 ["+"]], " at beginning of next line. "]], 1946 1947 1948 1949 ['pre', 1950 ["msg = 'this ' +\n 'is a long string.';\nmsg = 'this '\n + 'is a long string.';\n"], 1951 1952 1953 1954 1955 { className: "cm-s-default code bad has-popover", 1956 cat: "bad", 1957 'data-content': "BAD", 1958 'data-original-title': "", 1959 title: "" }], 1960 1961 ['pre', 1962 ["msg = 'this '+\n 'is a long string.';\nmsg = 'this '\n +'is a long string.';\n"], 1963 1964 1965 1966 1967 { className: "cm-s-default code ok has-popover", 1968 cat: "ok", 1969 'data-content': "OK", 1970 'data-original-title': "", 1971 title: "" }], 1972 1973 ['pre', 1974 ["msg = 'this '\n+'is a long string.';\n"], 1975 1976 1977 { className: "cm-s-default code good has-popover", 1978 cat: "good", 1979 'data-content': "GOOD", 1980 'data-original-title': "", 1981 title: "" }], 1982 1983 ['p', 1984 ["Space, if needed should be at the end of each line and not at\n the beginning of the next line"]], 1985 1986 1987 ['pre', 1988 ["msg = 'this'\n+' is a long string';\n"], 1989 1990 1991 { className: "cm-s-default code bad has-popover", 1992 cat: "bad", 1993 'data-content': "BAD", 1994 'data-original-title': "", 1995 title: "" }], 1996 1997 ['pre', 1998 ["msg = 'this '\n+'is a long string';\n"], 1999 2000 2001 { className: "cm-s-default code good has-popover", 2002 cat: "good", 2003 'data-content': "GOOD", 2004 'data-original-title': "", 2005 title: "" }]] 2006 2007 }, 2008 { 2009 id: 'format-file_lvl_closure', 2010 title: "\n File-level closures", 2011 2012 tag: 'h3', 2013 "short": "File-level closures", 2014 html: [['p', 2015 ["File-level closures: do not indent the whole file. leave a\n space after the opening, and before the closing:"]], 2016 2017 2018 ['pre', 2019 ["(function($, chrome, console){\n code;\n code;\n})(jQuery, chrome, console);\n"], 2020 2021 2022 2023 2024 { className: "cm-s-default code bad has-popover", 2025 cat: "bad", 2026 'data-content': "BAD", 2027 'data-original-title': "", 2028 title: "" }], 2029 2030 ['pre', 2031 ["(function($, chrome, console){\n\ncode;\ncode;\n\n})(jQuery, chrome, console);\n"], 2032 2033 2034 2035 2036 2037 2038 { className: "cm-s-default code good has-popover", 2039 cat: "good", 2040 'data-content': "GOOD", 2041 'data-original-title': "", 2042 title: "" }]] 2043 2044 }, 2045 { 2046 id: 'format-file_template', 2047 title: "JS file template", 2048 tag: 'h3', 2049 "short": "JS file template", 2050 html: [] 2051 }, 2052 { 2053 id: 'format-file_template-browser', 2054 title: "\n IE/Chrome/FF template", 2055 2056 tag: 'h4', 2057 "short": "IE/Chrome/FF template", 2058 html: [['pre', 2059 ["// LICENSE_CODE ZON\n'use strict'; /*jslint browser:true*/\n"], 2060 2061 2062 { className: "cm-s-default code ", 2063 cat: "" }]] 2064 2065 }, 2066 { 2067 id: 'format-file_template-nodejs_app', 2068 title: "NodeJS application template", 2069 tag: 'h4', 2070 "short": "NodeJS application template", 2071 html: [['pre', 2072 ["#!/usr/bin/env node\n// LICENSE_CODE ZON\n'use strict'; /*jslint node:true*/\nrequire('util/config.js');\n"], 2073 2074 2075 2076 2077 { className: "cm-s-default code ", 2078 cat: "" }]] 2079 2080 }, 2081 { 2082 id: 'format-file_template-nodejs_mod', 2083 title: "\n NodeJS module template", 2084 2085 tag: 'h4', 2086 "short": "NodeJS module template", 2087 html: [['pre', 2088 ["// LICENSE_CODE ZON\n'use strict'; /*jslint node:true*/\nrequire('util/config.js');\n"], 2089 2090 2091 2092 { className: "cm-s-default code ", 2093 cat: "" }]] 2094 2095 }, 2096 { 2097 id: 'format-require', 2098 title: "require()", 2099 tag: 'h3', 2100 "short": "require()", 2101 html: [['p', 2102 [" Local packages should include ", 2103 ['code', 2104 [".js"]], " in the name. Global packages should be the package name only\n (", 2105 2106 2107 2108 ['code', 2109 ["NODE_PATH"]], " environment variable should be defined). "]], 2110 2111 2112 2113 ['pre', 2114 ["const express = require('/usr/lib/node_modules/express');\n"], 2115
2116 { className: "cm-s-default code bad has-popover", 2117 cat: "bad", 2118 'data-content': "BAD", 2119 'data-original-title': "", 2120 title: "" }], 2121 2122 ['pre', 2123 ["const express = require('express');\n"], 2124 2125 { className: "cm-s-default code good has-popover", 2126 cat: "good", 2127 'data-content': "GOOD", 2128 'data-original-title': "", 2129 title: "" }], 2130 2131 ['pre', 2132 ["const get_rules = require('./get_rules');\n"], 2133 2134 { className: "cm-s-default code bad has-popover", 2135 cat: "bad", 2136 'data-content': "BAD", 2137 'data-original-title': "", 2138 title: "" }], 2139 2140 ['pre', 2141 ["const get_rules = require('./get_rules.js');\n"], 2142 2143 { className: "cm-s-default code good has-popover", 2144 cat: "good", 2145 'data-content': "GOOD", 2146 'data-original-title': "", 2147 title: "" }], 2148 2149 ['p', 2150 [['code', 2151 ["require"]], " should be called at the top of the file, not locally, so that\n unit-tests will surface all the problems."]], 2152 2153 2154 2155 2156 ['pre', 2157 ["function readconf(){\n return require('fs').readFileSync('conf'); }\n"], 2158 2159 2160 { className: "cm-s-default code bad has-popover", 2161 cat: "bad", 2162 'data-content': "BAD", 2163 'data-original-title': "", 2164 title: "" }], 2165 2166 ['pre', 2167 ["// top of file...\nconst fs = require('fs');\n// later down in the file...\nfunction f(){\n return fs.readFileSync('conf'); }\n"], 2168 2169 2170 2171 2172 2173 { className: "cm-s-default code good has-popover", 2174 cat: "good", 2175 'data-content': "GOOD", 2176 'data-original-title': "", 2177 title: "" }], 2178 2179 ['p', 2180 ["Constants and variable names of required modules should\n normally be the same, according to the module name."]], 2181 2182 2183 ['pre', 2184 ["const rules = require('./get_rules.js'); // in foo.js\nconst actions = require('./get_rules.js'); // in bar.js\n"], 2185 2186 2187 { className: "cm-s-default code bad has-popover", 2188 cat: "bad", 2189 'data-content': "BAD", 2190 'data-original-title': "", 2191 title: "" }], 2192 2193 ['pre', 2194 ["const get_rules = require('./get_rules.js'); // in foo.js and bar.js\n"], 2195 2196 { className: "cm-s-default code good has-popover", 2197 cat: "good", 2198 'data-content': "GOOD", 2199 'data-original-title': "", 2200 title: "" }], 2201 2202 ['p', 2203 ["Use ", 2204 ['code', 2205 ["_"]], " instead of ", 2206 2207 2208 ['code', 2209 ["-"]], 2210 2211 ['code', 2212 ["/"]]]], 2213 2214 2215 ['pre', 2216 ["const node_getopt = require('node-getopt');\nconst svc_reconf = require('../svc/reconf.js');\n"], 2217 2218 2219 { className: "cm-s-default code good has-popover", 2220 cat: "good", 2221 'data-content': "GOOD", 2222 'data-original-title': "", 2223 title: "" }], 2224 2225 ['p', 2226 [" Always prepend ", 2227 ['code', 2228 ["z"]], " to variable names for the following modules from ", 2229 2230 2231 ['code', 2232 ["pkg/util"]], ", and, when necessary, for other modules that clash with global\n packages. "]], 2233 2234 2235 2236 2237 ['pre', 2238 ["const zconf = require('util/config.js');\nconst zconf = require('util/config_int.js');\nconst zescape = require('util/escape.js');\nconst zhttp = require('util/zhttp.js');\nconst zhttp = require('util/http.js');\nconst zurl = require('util/url.js');\nconst zutil = require('util/util.js');\nconst zos = require('util/os.js');\n"], 2239 2240 2241 2242 2243 2244 2245 2246 2247 { className: "cm-s-default code good has-popover", 2248 cat: "good", 2249 'data-content': "GOOD", 2250 'data-original-title': "", 2251 title: "" }], 2252 2253 ['p', 2254 ["You may drop the ", 2255 ['code', 2256 ["node-"]], " prefix, or ", 2257 2258 2259 ['code', 2260 ["-js"]], " suffix. "]], 2261 2262 2263 2264 ['pre', 2265 ["const getopt = require('node-getopt');\nconst uglify = require('uglify-js');\n"], 2266 2267 2268 { className: "cm-s-default code good has-popover", 2269 cat: "good", 2270 'data-content': "GOOD", 2271 'data-original-title': "", 2272 title: "" }], 2273 2274 ['p', 2275 ["Special modules with short names: jquery and lodash."]], 2276 2277 ['pre', 2278 ["var $ = require('jquery');\nvar _ = require('lodash');\n"], 2279 2280
2281 { className: "cm-s-default code good has-popover", 2282 cat: "good", 2283 'data-content': "GOOD", 2284 'data-original-title': "", 2285 title: "" }]] 2286 2287 }, 2288 { 2289 id: 'format-comment', 2290 title: "Comments", 2291 tag: 'h3', 2292 "short": "Comments", 2293 html: [] 2294 }, 2295 { 2296 id: 'format-comment-comment_cpp', 2297 title: "\n Prefer C++ comment over C comments.", 2298 2299 tag: 'h4', 2300 "short": "Prefer C++ comment over C comments.", 2301 html: [['pre', 2302 ["/* close all files */\nfclose(fp);\n"], 2303 2304 2305 { className: "cm-s-default code bad has-popover", 2306 cat: "bad", 2307 'data-content': "BAD", 2308 'data-original-title': "", 2309 title: "" }], 2310 2311 ['pre', 2312 ["// close all files\nfclose(fp);\n"], 2313 2314 2315 { className: "cm-s-default code good has-popover", 2316 cat: "good", 2317 'data-content': "GOOD", 2318 'data-original-title': "", 2319 title: "" }], 2320 2321 ['pre', 2322 ["/* multi\n * line\n * comment */\n"], 2323 2324 2325 2326 { className: "cm-s-default code bad has-popover", 2327 cat: "bad", 2328 'data-content': "BAD", 2329 'data-original-title': "", 2330 title: "" }], 2331 2332 ['pre', 2333 ["// multi\n// line\n// comment\n"], 2334 2335 2336 2337 { className: "cm-s-default code good has-popover", 2338 cat: "good", 2339 'data-content': "GOOD", 2340 'data-original-title': "", 2341 title: "" }]] 2342 2343 }, 2344 { 2345 id: 'format-comment-aligned', 2346 title: "Comments aligned", 2347 tag: 'h4', 2348 "short": "Comments aligned", 2349 html: [['p', 2350 ["Comments should be aligned as the code they comment, or one\n space after the end of the line."]], 2351 2352 2353 ['pre', 2354 ["/*\n * close all files\n */\nfclose(fp);\n"], 2355 2356 2357 2358 2359 { className: "cm-s-default code bad has-popover", 2360 cat: "bad", 2361 'data-content': "BAD", 2362 'data-original-title': "", 2363 title: "" }], 2364 2365 ['pre', 2366 ["/* close all files */\nfclose(fp);\n"], 2367 2368 2369 { className: "cm-s-default code good has-popover", 2370 cat: "good", 2371 'data-content': "GOOD", 2372 'data-original-title': "", 2373 title: "" }], 2374 2375 ['pre', 2376 ["fclose(fp); /* close all files */\n"], 2377 2378 { className: "cm-s-default code good has-popover", 2379 cat: "good", 2380 'data-content': "GOOD", 2381 'data-original-title': "", 2382 title: "" }]] 2383 2384 }, 2385 { 2386 id: 'format-comment-long', 2387 title: "Long comments", 2388 tag: 'h4', 2389 "short": "Long comments", 2390 html: [['p', 2391 ["Comments which occupy more than one line should adhere to the\n following guideline:"]], 2392 2393 2394 ['pre', 2395 ["//\n// close all the files that were opened before the function was called\n// and send them to the output file\n//\nfclose(fp);\n"], 2396 2397 2398 2399 2400 2401 { className: "cm-s-default code bad has-popover", 2402 cat: "bad", 2403 'data-content': "BAD", 2404 'data-original-title': "", 2405 title: "" }], 2406 2407 ['pre', 2408 ["// close all the files that were opened before the function was called\n// and send them to the output file\nfclose(fp);\n"], 2409 2410 2411 2412 { className: "cm-s-default code good has-popover", 2413 cat: "good", 2414 'data-content': "GOOD", 2415 'data-original-title': "", 2416 title: "" }]] 2417 2418 }, 2419 { 2420 id: 'format-comment-multiline', 2421 title: "\n Multiline comments", 2422 2423 tag: 'h4', 2424 "short": "Multiline comments", 2425 html: [['p', 2426 ["Multiline comments should always be on their own, not continue\n on existing statements. If longer, put the comment at the\n line above."]], 2427 2428 2429 2430 ['pre', 2431 ["var isa_pnp_scan = {\n search_id: 'a-test', // if search_id.vendor[0]==0 - scan all vendor\n // IDs\n // if searchId.dwSerial==0 - scan all serial\n // numbers\n cards: 2, // number of cards found\n card: [card1, card2], // cards found\n};\n"], 2432 2433 2434 2435 2436 2437 2438 2439 2440 { className: "cm-s-default code bad has-popover", 2441 cat: "bad", 2442 'data-content': "BAD", 2443 'data-original-title': "", 2444 title: "" }], 2445 2446 ['pre', 2447 ["var isa_pnp_scan = {\n search_id: 'a-test', // if search_id.vendor[0]==0 - scan\n // all vendor IDs\n // if searchId.dwSerial==0 - scan all\n // serial numbers\n cards: 2, // number of cards foun
2447d\n card: [card1, card2]; // cards found\n};\n"], 2448 2449 2450 2451 2452 2453 2454 2455 2456 { className: "cm-s-default code bad has-popover", 2457 cat: "bad", 2458 'data-content': "BAD", 2459 'data-original-title': "", 2460 title: "" }], 2461 2462 ['pre', 2463 ["var isa_pnp_scan = {\n // if search_id.vendor[0]==0 - scan all vendor IDs\n // if searchId.dwSerial==0 - scan all serial numbers\n search_id: 's-test',\n cards: 2, // number of cards found\n card: [card1, card2], // cards found\n};\n"], 2464 2465 2466 2467 2468 2469 2470 2471 { className: "cm-s-default code good has-popover", 2472 cat: "good", 2473 'data-content': "GOOD", 2474 'data-original-title': "", 2475 title: "" }]] 2476 2477 }, 2478 { 2479 id: 'format-comment-xxx', 2480 title: "XXX - todo mark", 2481 tag: 'h4', 2482 "short": "XXX - todo mark", 2483 html: [['p', 2484 [" Comments of ", 2485 ['code', 2486 ["XXX"]], " should be used for temporary code, that would be changed in\n the future: hack, quick workaround, non-elegant code, bug.\n They should be ", 2487 2488 2489 2490 2491 ['code', 2492 ["XXX [login]: COMMENT"]], ", multiple names should be separated with ", 2493 2494 2495 ['code', 2496 ["/"]], ". "]], 2497 2498 2499 2500 ['pre', 2501 ["XXX derry: ANDROID move to compat\nXXX derry: arik: move to compat\nXXX derry arik: move to compat\n"], 2502 2503 2504 2505 { className: "cm-s-default code bad has-popover", 2506 cat: "bad", 2507 'data-content': "BAD", 2508 'data-original-title': "", 2509 title: "" }], 2510 2511 ['pre', 2512 ["XXX derry: move to compat\nXXX derry ANDROID: move to compat\nXXX derry/arik: move to compat\n"], 2513 2514 2515 2516 { className: "cm-s-default code good has-popover", 2517 cat: "good", 2518 'data-content': "GOOD", 2519 'data-original-title': "", 2520 title: "" }], 2521 2522 ['p', 2523 [['code', 2524 ["XXX"]], " comments are tasks, so they should always have someone\n assigned. ", 2525 2526 2527 2528 ['a', 2529 ["Preferably yourself"], 2530 { href: "/dna#individual-solve" }], "! "]], 2531 2532 2533 2534 ['pre', 2535 ["XXX: move to compat\n"], 2536 2537 { className: "cm-s-default code bad has-popover", 2538 cat: "bad", 2539 'data-content': "BAD", 2540 'data-original-title': "", 2541 title: "" }], 2542 2543 ['pre', 2544 ["XXX some-other-developer: move to compat\n"], 2545 2546 { className: "cm-s-default code bad has-popover", 2547 cat: "bad", 2548 'data-content': "BAD", 2549 'data-original-title': "", 2550 title: "" }], 2551 2552 ['pre', 2553 ["XXX derry: move to compat\n"], 2554 2555 { className: "cm-s-default code good has-popover", 2556 cat: "good", 2557 'data-content': "GOOD", 2558 'data-original-title': "", 2559 title: "" }], 2560 2561 ['p', 2562 [" Using XXX comments can be used, when needed, to override any\n possible rules! "]], 2563 2564 2565 ['pre', 2566 ["if (0)\nit('pause_disconnect', ()=>etask(function*(){\n"], 2567 2568 2569 { className: "cm-s-default code bad has-popover", 2570 cat: "bad", 2571 'data-content': "BAD", 2572 'data-original-title': "", 2573 title: "" }], 2574 2575 ['pre', 2576 ["if (0) // XXX sergey: lots of sporadic failues\nit('pause_disconnect', ()=>etask(function*(){\n"], 2577 2578 2579 { className: "cm-s-default code good has-popover", 2580 cat: "good", 2581 'data-content': "GOOD", 2582 'data-original-title': "", 2583 title: "" }], 2584 2585 ['pre', 2586 ["// XXX derry: copied urgent gist as-is to hack around a bug from angular\n// http://github.com/....\n// will fix by 8-Nov-2016\n"], 2587 2588 2589 2590 { className: "cm-s-default code good has-popover", 2591 cat: "good", 2592 'data-content': "GOOD", 2593 'data-original-title': "", 2594 title: "" }]] 2595 2596 }, 2597 { 2598 id: 'format-loop', 2599 title: "Loops", 2600 tag: 'h3', 2601 "short": "Loops", 2602 html: [] 2603 }, 2604 { 2605 id: 'format-loop-for_vs_while', 2606 title: "\n for vs while", 2607 2608 tag: 'h4', 2609 "short": "for vs while", 2610 html: [['p', 2611 [" If a ", 2612 ['code', 2613 ["while"]], " loop has an ", 2614 2615 2616 ['code', 2617 ["init"]], " and/or ", 2618 2619 2620 ['code', 2621 ["next"]], " expression, then use a ", 2622 2623 2624 ['code', 2625 ["for"]], " loop: "]], 2626 2627 2628 2629 ['pre', 2630 ["i = 0;\nwhile (i<10)\n{\n ...;\n i++;\n}\n"], 2631 2632 2633 2634 2635 2636
2637 { className: "cm-s-default code bad has-popover", 2638 cat: "bad", 2639 'data-content': "BAD", 2640 'data-original-title': "", 2641 title: "" }], 2642 2643 ['pre', 2644 ["for (i = 0; i<10; i++)\n ...;\n"], 2645 2646 2647 { className: "cm-s-default code good has-popover", 2648 cat: "good", 2649 'data-content': "GOOD", 2650 'data-original-title': "", 2651 title: "" }], 2652 2653 ['p', 2654 [" If a ", 2655 ['code', 2656 ["for"]], " loop has only a ", 2657 2658 2659 ['code', 2660 ["condition"]], ", then use ", 2661 2662 2663 ['code', 2664 ["while"]], ": "]], 2665 2666 2667 2668 ['pre', 2669 ["for (; have_more();)\n ...;\n"], 2670 2671 2672 { className: "cm-s-default code bad has-popover", 2673 cat: "bad", 2674 'data-content': "BAD", 2675 'data-original-title': "", 2676 title: "" }], 2677 2678 ['pre', 2679 ["while (have_more())\n ...;\n"], 2680 2681 2682 { className: "cm-s-default code good has-popover", 2683 cat: "good", 2684 'data-content': "GOOD", 2685 'data-original-title': "", 2686 title: "" }], 2687 2688 ['p', 2689 [" If no ", 2690 ['code', 2691 ["init"]], "/", 2692 2693 2694 ['code', 2695 ["condition"]], "/", 2696 2697 2698 ['code', 2699 ["next"]], ", then any option is ok: "]], 2700 2701 2702 2703 ['pre', 2704 ["for (;;)\n do_endless_work();\n"], 2705 2706 2707 { className: "cm-s-default code good has-popover", 2708 cat: "good", 2709 'data-content': "GOOD", 2710 'data-original-title': "", 2711 title: "" }], 2712 2713 ['pre', 2714 ["while (1)\n do_endless_work();\n"], 2715 2716 2717 { className: "cm-s-default code good has-popover", 2718 cat: "good", 2719 'data-content': "GOOD", 2720 'data-original-title': "", 2721 title: "" }]] 2722 2723 }, 2724 { 2725 id: 'format-loop-for', 2726 title: "for loops", 2727 tag: 'h4', 2728 "short": "for loops", 2729 html: [['p', 2730 [" In ", 2731 ['code', 2732 ["for"]], " loops, when there is a function that gets the next element, it\n should be done once (inside the step condition):", 2733 2734 2735 2736 ['br'], " assign inside a statement: "]], 2737 2738 2739 ['pre', 2740 ["for (i = 0, result = get_char(); result=='\\r'; result = get_char(), i++)\n handle_result(result);\n"], 2741 2742 2743 { className: "cm-s-default code bad has-popover", 2744 cat: "bad", 2745 'data-content': "BAD", 2746 'data-original-title': "", 2747 title: "" }], 2748 2749 ['pre', 2750 ["for (i = 0; (result = get_char())=='\\r'; i++)\n handle_result(result);\n"], 2751 2752 2753 { className: "cm-s-default code good has-popover", 2754 cat: "good", 2755 'data-content': "GOOD", 2756 'data-original-title': "", 2757 title: "" }]] 2758 2759 }, 2760 { 2761 id: 'format-loop-do_while', 2762 title: "\n do-while", 2763 2764 tag: 'h4', 2765 "short": "do-while", 2766 html: [['p', 2767 [['code', 2768 ["do-while"]], ": long ", 2769 2770 2771 ['code', 2772 ["do"]], " block should be closed on ", 2773 2774 2775 ['code', 2776 ["while"]], " line: "]], 2777 2778 2779 2780 ['pre', 2781 ["do add_item();\nwhile (have_items);\n"], 2782 2783 2784 { className: "cm-s-default code good has-popover", 2785 cat: "good", 2786 'data-content': "GOOD", 2787 'data-original-title': "", 2788 title: "" }], 2789 2790 ['pre', 2791 ["do\n add_item();\nwhile (have_items);\n"], 2792 2793 2794 2795 { className: "cm-s-default code good has-popover", 2796 cat: "good", 2797 'data-content': "GOOD", 2798 'data-original-title': "", 2799 title: "" }], 2800 2801 ['pre', 2802 ["do {\n add_item();\n another_action();\n} while (have_items);\n"], 2803 2804 2805 2806 2807 { className: "cm-s-default code good has-popover", 2808 cat: "good", 2809 'data-content': "GOOD", 2810 'data-original-title': "", 2811 title: "" }]] 2812 2813 }, 2814 { 2815 id: 'format-spacing', 2816 title: "Spacing", 2817 tag: 'h3', 2818 "short": "Spacing", 2819 html: [['p', 2820 ["Put one space before and after an assignment."]], 2821 2822 ['pre', 2823 ["var a=0;\nx= x+1;\nbits|=BIT5;\n"], 2824 2825 2826 2827 { className: "cm-s-default code bad has-popover", 2828 cat: "bad", 2829 'data-content': "BAD", 2830 'data-original-title': "", 2831 title: "" }], 2832 2833 ['pre', 2834 ["var a = 0;\nx = x+1;\nbits |= BIT5;\n"], 2835 2836 2837
2838 { className: "cm-s-default code good has-popover", 2839 cat: "good", 2840 'data-content': "GOOD", 2841 'data-original-title': "", 2842 title: "" }], 2843 2844 ['p', 2845 ["If it is in a ", 2846 ['code', 2847 ["for"]], " loop, you can skip the spaces. if you skip one of the spaces,\n skip both:"]], 2848 2849 2850 2851 2852 ['pre', 2853 ["for (i= 0; i; i--)\n printf(\"%d\", i);\n"], 2854 2855 2856 { className: "cm-s-default code bad has-popover", 2857 cat: "bad", 2858 'data-content': "BAD", 2859 'data-original-title': "", 2860 title: "" }], 2861 2862 ['pre', 2863 ["for (i=0; i; i--)\n printf(\"%d\", i);\n"], 2864 2865 2866 { className: "cm-s-default code good has-popover", 2867 cat: "good", 2868 'data-content': "GOOD", 2869 'data-original-title': "", 2870 title: "" }], 2871 2872 ['pre', 2873 ["for (i = 0; i; i--)\n printf(\"%d\", i);\n"], 2874 2875 2876 { className: "cm-s-default code good has-popover", 2877 cat: "good", 2878 'data-content': "GOOD", 2879 'data-original-title': "", 2880 title: "" }], 2881 2882 ['p', 2883 ["Don't put a space before a statement separator, put one after\n it:"]], 2884 2885 2886 ['pre', 2887 ["for (i=0 ;i ;i--, j*=2) ;\n"], 2888 2889 { className: "cm-s-default code bad has-popover", 2890 cat: "bad", 2891 'data-content': "BAD", 2892 'data-original-title': "", 2893 title: "" }], 2894 2895 ['pre', 2896 ["for (i=0; i; i--, j*=2);\n"], 2897 2898 { className: "cm-s-default code good has-popover", 2899 cat: "good", 2900 'data-content': "GOOD", 2901 'data-original-title': "", 2902 title: "" }], 2903 2904 ['pre', 2905 ["for (i = 0; i; i--, j *= 2);\n"], 2906 2907 { className: "cm-s-default code good has-popover", 2908 cat: "good", 2909 'data-content': "GOOD", 2910 'data-original-title': "", 2911 title: "" }]] 2912 2913 }, 2914 { 2915 id: 'format-callfail', 2916 title: "\n Check fail in same line of call", 2917 2918 tag: 'h3', 2919 "short": "Check fail in same line of call", 2920 html: [['p', 2921 [" Prefer to check for failures in same line of calling the\n function. "]], 2922 2923 2924 ['pre', 2925 ["i = str.indexOf(\"\\r\\n\");\nif (i<0)\n return;\n"], 2926 2927 2928 2929 { className: "cm-s-default code not_preferred has-popover", 2930 cat: "not_preferred", 2931 'data-content': "NOT PREFERRED", 2932 'data-original-title': "", 2933 title: "" }], 2934 2935 ['pre', 2936 ["if ((i = str.indexOf(\"\\r\\n\"))<0)\n return;\n"], 2937 2938 2939 { className: "cm-s-default code good has-popover", 2940 cat: "good", 2941 'data-content': "GOOD", 2942 'data-original-title': "", 2943 title: "" }], 2944 2945 ['pre', 2946 ["m = str.match(\"EOF\");\nif (!m)\n return;\n"], 2947 2948 2949 2950 { className: "cm-s-default code not_preferred has-popover", 2951 cat: "not_preferred", 2952 'data-content': "NOT PREFERRED", 2953 'data-original-title': "", 2954 title: "" }], 2955 2956 ['pre', 2957 ["if (!(m = str.match(\"EOF\")))\n return;\n"], 2958 2959 2960 { className: "cm-s-default code good has-popover", 2961 cat: "good", 2962 'data-content': "GOOD", 2963 'data-original-title': "", 2964 title: "" }]] 2965 2966 }, 2967 { 2968 id: 'format-object', 2969 title: "Object notation", 2970 tag: 'h3', 2971 "short": "Object notation", 2972 html: [['pre', 2973 ["var node =\n{\n name: 'server',\n port: 42,\n status: 'updated',\n setup_time: 10*1000,\n};\n"], 2974 2975 2976 2977 2978 2979 2980 2981 { className: "cm-s-default code bad has-popover", 2982 cat: "bad", 2983 'data-content': "BAD", 2984 'data-original-title': "", 2985 title: "" }], 2986 2987 ['pre', 2988 ["var node = {\n name: 'server',\n port: 42,\n status: 'updated',\n setup_time: 10*1000,\n};\n"], 2989 2990 2991 2992 2993 2994 2995 { className: "cm-s-default code good has-popover", 2996 cat: "good", 2997 'data-content': "GOOD", 2998 'data-original-title': "", 2999 title: "" }], 3000 3001 ['p', 3002 ["Multiline objects: should have a comma after last property."]], 3003 3004 ['pre', 3005 ["var node = {\n name: 'server',\n status: 'updated',\n setup_time: 10*1000\n};\n"], 3006 3007 3008 3009 3010
3011 { className: "cm-s-default code bad has-popover", 3012 cat: "bad", 3013 'data-content': "BAD", 3014 'data-original-title': "", 3015 title: "" }], 3016 3017 ['pre', 3018 ["var node = {\n name: 'server',\n status: 'updated',\n setup_time: 10*1000,\n};\n"], 3019 3020 3021 3022 3023 3024 { className: "cm-s-default code good has-popover", 3025 cat: "good", 3026 'data-content': "GOOD", 3027 'data-original-title': "", 3028 title: "" }], 3029 3030 ['p', 3031 ["Short objects: should be in a single line if they are very\n short."]], 3032 3033 3034 ['pre', 3035 ["var node = {name: 'server', port: 42,};\n"], 3036 3037 { className: "cm-s-default code bad has-popover", 3038 cat: "bad", 3039 'data-content': "BAD", 3040 'data-original-title': "", 3041 title: "" }], 3042 3043 ['pre', 3044 ["var node = {\n name: 'server',\n port: 42,\n};\n"], 3045 3046 3047 3048 3049 { className: "cm-s-default code ok has-popover", 3050 cat: "ok", 3051 'data-content': "OK", 3052 'data-original-title': "", 3053 title: "" }], 3054 3055 ['pre', 3056 ["var node = {name: 'server', port: 42};\n"], 3057 3058 { className: "cm-s-default code good has-popover", 3059 cat: "good", 3060 'data-content': "GOOD", 3061 'data-original-title': "", 3062 title: "" }], 3063 3064 ['p', 3065 ["Object contains short object: should be in a single line."]], 3066 3067 ['pre', 3068 ["var node = {info: {name: 'server', port: 42},\n};\n"], 3069 3070 3071 { className: "cm-s-default code bad has-popover", 3072 cat: "bad", 3073 'data-content': "BAD", 3074 'data-original-title': "", 3075 title: "" }], 3076 3077 ['pre', 3078 ["var node = {\n info: {name: 'server', port: 42},\n};\n"], 3079 3080 3081 3082 { className: "cm-s-default code ok has-popover", 3083 cat: "ok", 3084 'data-content': "OK", 3085 'data-original-title': "", 3086 title: "" }], 3087 3088 ['pre', 3089 ["var node = {info: {name: 'server', port: 42}};\n"], 3090 3091 { className: "cm-s-default code good has-popover", 3092 cat: "good", 3093 'data-content': "GOOD", 3094 'data-original-title': "", 3095 title: "" }], 3096 3097 ['p', 3098 ["Objects spacing:"]], 3099 3100 ['ul', 3101 [['li', 3102 ["before ", 3103 ['code', 3104 [","]], " and ", 3105 3106 3107 ['code', 3108 [":"]], " signs, there should not be a space, while after those\n signs, space is required."]], 3109 3110 3111 3112 3113 ['li', 3114 ["after ", 3115 ['code', 3116 ["{"]], " and before ", 3117 3118 3119 ['code', 3120 ["}"]], " signs, there should not be a space."]]]], 3121 3122 3123 3124 3125 ['pre', 3126 ["var node = {name: 'server', port: 42};\n"], 3127 3128 { className: "cm-s-default code good has-popover", 3129 cat: "good", 3130 'data-content': "GOOD", 3131 'data-original-title': "", 3132 title: "" }], 3133 3134 ['pre', 3135 ["var node = {name: 'server' , port: 42};\n"], 3136 3137 { className: "cm-s-default code bad has-popover", 3138 cat: "bad", 3139 'data-content': "BAD", 3140 'data-original-title': "", 3141 title: "" }], 3142 3143 ['pre', 3144 ["var node = {name : 'server', port : 42};\n"], 3145 3146 { className: "cm-s-default code bad has-popover", 3147 cat: "bad", 3148 'data-content': "BAD", 3149 'data-original-title': "", 3150 title: "" }], 3151 3152 ['pre', 3153 ["var node = { name: 'server', port: 42 };\n"], 3154 3155 { className: "cm-s-default code bad has-popover", 3156 cat: "bad", 3157 'data-content': "BAD", 3158 'data-original-title': "", 3159 title: "" }]] 3160 3161 }, 3162 { 3163 id: 'format-casting', 3164 title: "Casting", 3165 tag: 'h3', 3166 "short": "Casting", 3167 html: [['p', 3168 [" Convert to number: ", 3169 ['code', 3170 ["+val"]], 3171 3172 ['br'], " Convert to signed 32bit int: ", 3173 3174 ['code', 3175 ["val|0"]], 3176 3177 ['br'], " Convert to unsigned 32bit int: ", 3178 3179 ['code', 3180 ["val>>>0"]], 3181 3182 ['br'], " Convert to Boolean: ", 3183 3184 ['code', 3185 ["!!val"]], 3186 3187 ['br'], " Convert Boolean to 0/1: ", 3188 3189 ['code', 3190 ["+bool_val"]], " or ", 3191 3192 3193 ['code', 3194 ["+!!any_val"]], 3195 3196 ['br'], 3197 ['br'], " String literals: prefer ", 3198 3199 ['code', 3200 ["'single quotes'"]], " over ", 3201 3202 3203 ['code', 3204 ["\"double quotes\""]], 3205 3206 ['br']]], 3207 3208 ['pre', 3209 ["\"I am the walrus.\"\n"], 3210
3211 { className: "cm-s-default code ok has-popover", 3212 cat: "ok", 3213 'data-content': "OK", 3214 'data-original-title': "", 3215 title: "" }], 3216 3217 ['pre', 3218 ["'I am the walrus.'\n"], 3219 3220 { className: "cm-s-default code good has-popover", 3221 cat: "good", 3222 'data-content': "GOOD", 3223 'data-original-title': "", 3224 title: "" }], 3225 3226 ['pre', 3227 ["\"I'm the walrus.\"\n"], 3228 3229 { className: "cm-s-default code good has-popover", 3230 cat: "good", 3231 'data-content': "GOOD", 3232 'data-original-title': "", 3233 title: "" }]] 3234 3235 }, 3236 { 3237 id: 'format-export', 3238 title: "exports", 3239 tag: 'h3', 3240 "short": "exports", 3241 html: [] 3242 }, 3243 { 3244 id: 'format-export-e', 3245 title: "\n Use variable E as alias to exports.", 3246 3247 tag: 'h4', 3248 "short": "exports E", 3249 html: [['pre', 3250 ["exports.foo = function(){ ... };\n"], 3251 3252 { className: "cm-s-default code bad has-popover", 3253 cat: "bad", 3254 'data-content': "BAD", 3255 'data-original-title': "", 3256 title: "" }], 3257 3258 ['pre', 3259 ["const E = exports;\nE.foo = function(){ ... };\n"], 3260 3261 3262 { className: "cm-s-default code good has-popover", 3263 cat: "good", 3264 'data-content': "GOOD", 3265 'data-original-title': "", 3266 title: "" }]] 3267 3268 }, 3269 { 3270 id: 'format-export-function', 3271 title: "\n Export functions", 3272 3273 tag: 'h4', 3274 "short": "Export functions", 3275 html: [['p', 3276 [" Only export functions which are used outside of the module,\n keep everything else local. "]], 3277 3278 3279 ['pre', 3280 ["E.internal_helper = function(){ ... };\n...\nE.internal_helper();\n"], 3281 3282 3283 3284 { className: "cm-s-default code bad has-popover", 3285 cat: "bad", 3286 'data-content': "BAD", 3287 'data-original-title': "", 3288 title: "" }], 3289 3290 ['pre', 3291 ["function internal_helper(){ ... }\n...\ninternal_helper();\n"], 3292 3293 3294 3295 { className: "cm-s-default code good has-popover", 3296 cat: "good", 3297 'data-content': "GOOD", 3298 'data-original-title': "", 3299 title: "" }]] 3300 3301 }, 3302 { 3303 id: 'format-export-test', 3304 title: "\n Unit-test exports", 3305 3306 tag: 'h4', 3307 "short": "Unit-test exports", 3308 html: [['p', 3309 [" Use variable ", 3310 ['code', 3311 ["E.t"]], " for exports only used in tests, give the function name to use\n inside module. "]], 3312 3313 3314 3315 3316 ['pre', 3317 ["// in foo.js\nE.internal_function = function(){ ... };\n...\nE.internal_function();\n\n// in test.js\nfoo.internal_function();\n"], 3318 3319 3320 3321 3322 3323 3324 3325 { className: "cm-s-default code bad has-popover", 3326 cat: "bad", 3327 'data-content': "BAD", 3328 'data-original-title': "", 3329 title: "" }], 3330 3331 ['pre', 3332 ["// in foo.js\nconst E = exports;\n...\nfunction internal_function(){ ... }\n...\ninternal_function();\n...\nE.t = {internal_function: internal_function, ...};\n// in test.js\nfoo.t.internal_function();\n"], 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 { className: "cm-s-default code good has-popover", 3344 cat: "good", 3345 'data-content': "GOOD", 3346 'data-original-title': "", 3347 title: "" }]] 3348 3349 }, 3350 { 3351 id: 'format-continuation_method', 3352 title: "\n Continuation .method()\n", 3353 3354 3355 tag: 'h3', 3356 "short": "Continuation .method()", 3357 html: [['p', 3358 ["Continuation ", 3359 ['code', 3360 [".method()"]], " or ", 3361 3362 3363 ['code', 3364 ["+'str'"]], " on next line can be same indentation as parent line. Same goes\n for single ", 3365 3366 3367 3368 ['code', 3369 ["var"]], " definition, and ", 3370 3371 3372 ['code', 3373 ["return"]], ". "]], 3374 3375 3376 3377 ['pre', 3378 ["$('<h1>', $('<div>')\n.append('<span>'));\n"], 3379 3380 3381 { className: "cm-s-default code bad has-popover", 3382 cat: "bad", 3383 'data-content': "BAD", 3384 'data-original-title': "", 3385 title: "" }], 3386 3387 ['pre', 3388 ["$('<h1>', $('<div>')\n .append('<span>'));\n"], 3389 3390 3391 { className: "cm-s-default code good has-popover", 3392 cat: "good", 3393 'data-content': "GOOD", 3394 'data-original-title': "", 3395 title: "" }], 3396 3397 ['pre', 3398 ["$('<div>')\n .append('<span>');\n"], 3399 3400
3401 { className: "cm-s-default code ok has-popover", 3402 cat: "ok", 3403 'data-content': "OK", 3404 'data-original-title': "", 3405 title: "" }], 3406 3407 ['pre', 3408 ["$('<div>')\n.append('<span>');\n"], 3409 3410 3411 { className: "cm-s-default code good has-popover", 3412 cat: "good", 3413 'data-content': "GOOD", 3414 'data-original-title': "", 3415 title: "" }], 3416 3417 ['pre', 3418 ["elm = $('<span>')\n.append('<span>');\n"], 3419 3420 3421 { className: "cm-s-default code good has-popover", 3422 cat: "good", 3423 'data-content': "GOOD", 3424 'data-original-title': "", 3425 title: "" }], 3426 3427 ['pre', 3428 ["var elm = $('<span>')\n.append('<span>');\n"], 3429 3430 3431 { className: "cm-s-default code good has-popover", 3432 cat: "good", 3433 'data-content': "GOOD", 3434 'data-original-title': "", 3435 title: "" }], 3436 3437 ['pre', 3438 ["var e1 = $('<div>'), e2 = $('<span>')\n.append('<span>');\n"], 3439 3440 3441 { className: "cm-s-default code bad has-popover", 3442 cat: "bad", 3443 'data-content': "BAD", 3444 'data-original-title': "", 3445 title: "" }], 3446 3447 ['pre', 3448 ["var e1 = $('<div>');\nvar e2 = $('<span>')\n.append('<span>');\n"], 3449 3450 3451 3452 { className: "cm-s-default code good has-popover", 3453 cat: "good", 3454 'data-content': "GOOD", 3455 'data-original-title': "", 3456 title: "" }], 3457 3458 ['pre', 3459 ["return $('<div>')\n.append('<span>');\n"], 3460 3461 3462 { className: "cm-s-default code good has-popover", 3463 cat: "good", 3464 'data-content': "GOOD", 3465 'data-original-title': "", 3466 title: "" }], 3467 3468 ['pre', 3469 ["return $('<h2>', $('<div>')\n.append('<span>'));\n"], 3470 3471 3472 { className: "cm-s-default code bad has-popover", 3473 cat: "bad", 3474 'data-content': "BAD", 3475 'data-original-title': "", 3476 title: "" }], 3477 3478 ['pre', 3479 ["return $('<h2>', $('<div>')\n .append('<span>'));\n"], 3480 3481 3482 { className: "cm-s-default code good has-popover", 3483 cat: "good", 3484 'data-content': "GOOD", 3485 'data-original-title': "", 3486 title: "" }], 3487 3488 ['pre', 3489 ["var s = '<div>'\n+'<span>';\n"], 3490 3491 3492 { className: "cm-s-default code good has-popover", 3493 cat: "good", 3494 'data-content': "GOOD", 3495 'data-original-title': "", 3496 title: "" }], 3497 3498 ['pre', 3499 ["s = x ? '<child>' : '<nothing>'\n+'<span>';\n"], 3500 3501 3502 { className: "cm-s-default code bad has-popover", 3503 cat: "bad", 3504 'data-content': "BAD", 3505 'data-original-title': "", 3506 title: "" }], 3507 3508 ['pre', 3509 ["s = '<div>'\n+'<span>';\n"], 3510 3511 3512 { className: "cm-s-default code good has-popover", 3513 cat: "good", 3514 'data-content': "GOOD", 3515 'data-original-title': "", 3516 title: "" }], 3517 3518 ['pre', 3519 ["return '<div>'\n+'<span>';\n"], 3520 3521 3522 { className: "cm-s-default code good has-popover", 3523 cat: "good", 3524 'data-content': "GOOD", 3525 'data-original-title': "", 3526 title: "" }]] 3527 3528 }, 3529 { 3530 id: 'format-dot_method', 3531 title: "\n . of .method()", 3532 3533 tag: 'h3', 3534 "short": ". of .method()", 3535 html: [['p', 3536 [['code', 3537 ["."]], " of ", 3538 3539 3540 ['code', 3541 [".method()"]], " MUST be the first character on a method call continuation\n line. "]], 3542 3543 3544 3545 3546 ['pre', 3547 ["set_user(db.open('users').\n get$(user));\n"], 3548 3549 3550 { className: "cm-s-default code bad has-popover", 3551 cat: "bad", 3552 'data-content': "BAD", 3553 'data-original-title': "", 3554 title: "" }], 3555 3556 ['pre', 3557 ["set_user(db.open('users')\n .get$(user));\n"], 3558 3559 3560 { className: "cm-s-default code good has-popover", 3561 cat: "good", 3562 'data-content': "GOOD", 3563 'data-original-title': "", 3564 title: "" }], 3565 3566 ['pre', 3567 ["$('<h1>', $('<div>').\n append('<span>'));\n"], 3568 3569 3570 { className: "cm-s-default code bad has-popover", 3571 cat: "bad", 3572 'data-content': "BAD", 3573 'data-original-title': "", 3574 title: "" }], 3575 3576 ['pre', 3577 ["$('<h1>', $('<div>')\n .append('<span>'));\n"], 3578 3579
3580 { className: "cm-s-default code good has-popover", 3581 cat: "good", 3582 'data-content': "GOOD", 3583 'data-original-title': "", 3584 title: "" }]] 3585 3586 }, 3587 { 3588 id: 'format-var_declaration', 3589 title: "\n Variable declarations", 3590 3591 tag: 'h3', 3592 "short": "Variable declarations", 3593 html: [['p', 3594 [['code', 3595 ["var"]], " declarations longer than one line must have their own ", 3596 3597 3598 ['code', 3599 ["var"]], ". "]], 3600 3601 3602 3603 ['pre', 3604 ["var a = 'test',\n b = f('another', 'test'),\n c = 'yet another';\n"], 3605 3606 3607 3608 { className: "cm-s-default code bad has-popover", 3609 cat: "bad", 3610 'data-content': "BAD", 3611 'data-original-title': "", 3612 title: "" }], 3613 3614 ['pre', 3615 ["var a = 'test';\nvar b = f('another', 'test');\nvar c = 'yet another';\n"], 3616 3617 3618 3619 { className: "cm-s-default code good has-popover", 3620 cat: "good", 3621 'data-content': "GOOD", 3622 'data-original-title': "", 3623 title: "" }], 3624 3625 ['pre', 3626 ["var a = 'test';\nvar b = f('another', 'test'), c = 'yet another';\n"], 3627 3628 3629 { className: "cm-s-default code good has-popover", 3630 cat: "good", 3631 'data-content': "GOOD", 3632 'data-original-title': "", 3633 title: "" }], 3634 3635 ['pre', 3636 ["var a = 'test', b = f('another', 'test'), c = 'yet another';\n"], 3637 3638 { className: "cm-s-default code good has-popover", 3639 cat: "good", 3640 'data-content': "GOOD", 3641 'data-original-title': "", 3642 title: "" }], 3643 3644 ['pre', 3645 ["var a = 'test', b = f('another',\n 'test');\nvar c = 'yet another';\n"], 3646 3647 3648 3649 { className: "cm-s-default code bad has-popover", 3650 cat: "bad", 3651 'data-content': "BAD", 3652 'data-original-title': "", 3653 title: "" }], 3654 3655 ['pre', 3656 ["var a = 'test';\nvar b = f('another',\n 'test');\nvar c = 'yet another';\n"], 3657 3658 3659 3660 3661 { className: "cm-s-default code good has-popover", 3662 cat: "good", 3663 'data-content': "GOOD", 3664 'data-original-title': "", 3665 title: "" }]] 3666 3667 }, 3668 { 3669 id: 'format-var_compare', 3670 title: "Comparing variables", 3671 tag: 'h3', 3672 "short": "Comparing variables", 3673 html: [['p', 3674 [" When comparing to ", 3675 ['code', 3676 ["undefined"]], " use ", 3677 3678 3679 ['code', 3680 ["==="]], " and ", 3681 3682 3683 ['code', 3684 ["!=="]], " On any other case, use ", 3685 3686 3687 ['code', 3688 ["=="]], " and ", 3689 3690 3691 ['code', 3692 ["!="]]]], 3693 3694 3695 ['pre', 3696 ["if (a==='OK')\n"], 3697 3698 { className: "cm-s-default code bad has-popover", 3699 cat: "bad", 3700 'data-content': "BAD", 3701 'data-original-title': "", 3702 title: "" }], 3703 3704 ['pre', 3705 ["if (typeof a==='undefined')\n"], 3706 3707 { className: "cm-s-default code bad has-popover", 3708 cat: "bad", 3709 'data-content': "BAD", 3710 'data-original-title': "", 3711 title: "" }], 3712 3713 ['pre', 3714 ["if (a=='OK')\n"], 3715 3716 { className: "cm-s-default code good has-popover", 3717 cat: "good", 3718 'data-content': "GOOD", 3719 'data-original-title': "", 3720 title: "" }], 3721 3722 ['pre', 3723 ["if (a===undefined)\n"], 3724 3725 { className: "cm-s-default code good has-popover", 3726 cat: "good", 3727 'data-content': "GOOD", 3728 'data-original-title': "", 3729 title: "" }]] 3730 3731 }, 3732 { 3733 id: 'format-use_bind', 3734 title: "\n Prefer .bind() over this", 3735 3736 tag: 'h3', 3737 "short": "Use bind().", 3738 html: [['p', 3739 [" When assigning functions that depend on ", 3740 ['code', 3741 ["this"]], ", use ", 3742 3743 3744 ['code', 3745 ["bind()"]], ". "]], 3746 3747 3748 3749 ['pre', 3750 ["var log = console.log;\nlog('a'); // TypeError: Illegal invocation\n"], 3751 3752 3753 { className: "cm-s-default code bad has-popover", 3754 cat: "bad", 3755 'data-content': "BAD", 3756 'data-original-title': "", 3757 title: "" }], 3758 3759 ['pre', 3760 ["var log = console.log.bind(console);\nlog('a');\n"], 3761 3762 3763 { className: "cm-s-default code good has-popover", 3764 cat: "good", 3765 'data-content': "GOOD", 3766 'data-original-title': "", 3767 title: "" }]] 3768 3769 }, 3770 { 3771 id: 'format-locality', 3772 title: "\n Shorten using locality", 3773 3774 tag: 'h3', 3775 "short": "Locality", 3776 html: [['p', 3777 [" Use locality to shorten names, relying on the contexts of the\n local code scope. "]], 3778 3779 3780 ['pre', 3781 ["for (let opration_idx=0; operation_idx<operations.length; operation_idx++)\n ...;\n"], 3782 3783
3784 { className: "cm-s-default code bad has-popover", 3785 cat: "bad", 3786 'data-content': "BAD", 3787 'data-original-title': "", 3788 title: "" }], 3789 3790 ['pre', 3791 ["for (let i=0; i<operations.length; i++)\n ...;\n"], 3792 3793 3794 { className: "cm-s-default code good has-popover", 3795 cat: "good", 3796 'data-content': "GOOD", 3797 'data-original-title': "", 3798 title: "" }], 3799 3800 ['pre', 3801 ["for (let allowed_customer in allowed_customers)\n ...;\n"], 3802 3803 3804 { className: "cm-s-default code bad has-popover", 3805 cat: "bad", 3806 'data-content': "BAD", 3807 'data-original-title': "", 3808 title: "" }], 3809 3810 ['pre', 3811 ["for (let c in allowed_customers)\n ...;\n"], 3812 3813 3814 { className: "cm-s-default code good has-popover", 3815 cat: "good", 3816 'data-content': "GOOD", 3817 'data-original-title': "", 3818 title: "" }]] 3819 3820 }, 3821 { 3822 id: 'format-notation', 3823 title: "\n UNIX notation naming", 3824 3825 tag: 'h3', 3826 "short": "UNIX notation naming", 3827 html: [['p', 3828 ["Code will be in UNIX notation. UNIX names should not include\n the data type, rather the meaning of the information in the\n data."]], 3829 3830 3831 3832 ['pre', 3833 ["var bIsCompleted;\nvar iCount;\n"], 3834 3835 3836 { className: "cm-s-default code bad has-popover", 3837 cat: "bad", 3838 'data-content': "BAD", 3839 'data-original-title': "", 3840 title: "" }], 3841 3842 ['pre', 3843 ["var is_completed, data, vendor_id, count, buffer, new_name, name;\nfunction read_data_block(){}\nconst MS_PER_SEC = 1000;\n"], 3844 3845 3846 3847 { className: "cm-s-default code good has-popover", 3848 cat: "good", 3849 'data-content': "GOOD", 3850 'data-original-title': "", 3851 title: "" }]] 3852 3853 }, 3854 { 3855 id: 'format-notation-neg', 3856 title: "Positive naming", 3857 tag: 'h4', 3858 "short": "positive naming", 3859 html: [['p', 3860 ["Default to using positive naming, rather than negative\n (no/not/disable...). This helps avoid double negation (not\n not)."]], 3861 3862 3863 3864 ['pre', 3865 ["if (!not_customer(customer))\n disable_customer(customer, false);\n"], 3866 3867 3868 { className: "cm-s-default code bad has-popover", 3869 cat: "bad", 3870 'data-content': "BAD", 3871 'data-original-title': "", 3872 title: "" }], 3873 3874 ['pre', 3875 ["if (is_customer(customer))\n enable_customer(customer, true);\n"], 3876 3877 3878 { className: "cm-s-default code good has-popover", 3879 cat: "good", 3880 'data-content': "GOOD", 3881 'data-original-title': "", 3882 title: "" }], 3883 3884 ['pre', 3885 ["var no_rule = lookup_rule(rule)<0;\nif (!no_rule)\n rm_rule();\nelse\n add_rule();\n"], 3886 3887 3888 3889 3890 3891 { className: "cm-s-default code bad has-popover", 3892 cat: "bad", 3893 'data-content': "BAD", 3894 'data-original-title': "", 3895 title: "" }], 3896 3897 ['pre', 3898 ["var have_rule = lookup_rule(rule)>=0;\nif (have_rule)\n rm_rule();\nelse\n add_rule();\n"], 3899 3900 3901 3902 3903 3904 { className: "cm-s-default code good has-popover", 3905 cat: "good", 3906 'data-content': "GOOD", 3907 'data-original-title': "", 3908 title: "" }]] 3909 3910 }, 3911 { 3912 id: 'format-simplicity_usability', 3913 title: "Simplicity\n and usability", 3914 3915 tag: 'h4', 3916 "short": "simplicity and usability", 3917 html: [['p', 3918 ["Command line options, or option variable (opt), use common\n usage as default even if negative"]], 3919 3920 3921 ['pre', 3922 ["zlxc --browser\n"], 3923 3924 { className: "cm-s-default code bad has-popover", 3925 cat: "bad", 3926 'data-content': "BAD", 3927 'data-original-title': "", 3928 title: "" }], 3929 3930 ['pre', 3931 ["zlxc --no-browser\n"], 3932 3933 { className: "cm-s-default code good has-popover", 3934 cat: "good", 3935 'data-content': "GOOD", 3936 'data-original-title': "", 3937 title: "" }], 3938 3939 ['pre', 3940 ["opt = {exit_on_err: 1};\n"], 3941 3942 { className: "cm-s-default code bad has-popover", 3943 cat: "bad", 3944 'data-content': "BAD", 3945 'data-original-title': "", 3946 title: "" }], 3947 3948 ['pre', 3949 ["opt = {no_exit: 1};\n"], 3950
3951 { className: "cm-s-default code good has-popover", 3952 cat: "good", 3953 'data-content': "GOOD", 3954 'data-original-title': "", 3955 title: "" }]] 3956 3957 }, 3958 { 3959 id: 'format-default_value', 3960 title: "Default value", 3961 tag: 'h4', 3962 "short": "default value", 3963 html: [['p', 3964 ["Using implicit ", 3965 ['code', 3966 ["undefined"]], " as default value"]], 3967 3968 3969 3970 ['pre', 3971 ["let need_reconf = false;\nif (is_host(':servers'))\n need_reconf = true;\n"], 3972 3973 3974 3975 { className: "cm-s-default code bad has-popover", 3976 cat: "bad", 3977 'data-content': "BAD", 3978 'data-original-title': "", 3979 title: "" }], 3980 3981 ['pre', 3982 ["let need_reconf = undefined\nif (is_host(':servers'))\n need_reconf = true;\n"], 3983 3984 3985 3986 { className: "cm-s-default code bad has-popover", 3987 cat: "bad", 3988 'data-content': "BAD", 3989 'data-original-title': "", 3990 title: "" }], 3991 3992 ['pre', 3993 ["let need_reconf;\nif (is_host(':servers'))\n need_reconf = true;\n"], 3994 3995 3996 3997 { className: "cm-s-default code good has-popover", 3998 cat: "good", 3999 'data-content': "GOOD", 4000 'data-original-title': "", 4001 title: "" }]] 4002 4003 }, 4004 { 4005 id: 'format-poly_func', 4006 title: "\n Multi-signature functions", 4007 4008 tag: 'h3', 4009 "short": "Multi-signature functions", 4010 html: [['p', 4011 [" For functions that have multiple signatures or where there is\n an optional (not last) argument, you may optionally add the\n different possible signatures as a comment, in the nodejs\n signature documentation style. "]], 4012 4013 4014 4015 4016 ['pre', 4017 ["// _apply(opt, func[, _this], args)\n// _apply(opt, object, method, args)\nE._apply = function(opt, func, _this, args){\n ...\n};\n"], 4018 4019 4020 4021 4022 4023 { className: "cm-s-default code good has-popover", 4024 cat: "good", 4025 'data-content': "GOOD", 4026 'data-original-title': "", 4027 title: "" }]] 4028 4029 }, 4030 { 4031 id: 'format-this_value', 4032 title: "\n Saving the value of this", 4033 4034 tag: 'h3', 4035 "short": "Saving the value of `this`", 4036 html: [['p', 4037 [" When saving the value of ", 4038 ['code', 4039 ["this"]], " for use in lexically nested functions, use ", 4040 4041 4042 ['code', 4043 ["_this"]], " as the variable name. "]], 4044 4045 4046 4047 ['pre', 4048 ["var self = this;\n"], 4049 4050 { className: "cm-s-default code bad has-popover", 4051 cat: "bad", 4052 'data-content': "BAD", 4053 'data-original-title': "", 4054 title: "" }], 4055 4056 ['pre', 4057 ["var _this = this;\n"], 4058 4059 { className: "cm-s-default code good has-popover", 4060 cat: "good", 4061 'data-content': "GOOD", 4062 'data-original-title': "", 4063 title: "" }], 4064 4065 ['pre', 4066 ["function on_end(opt){\n var _this = this;\n return function on_end_cb(msg){\n if (_this.socket)\n return 'socket';\n };\n}\n"], 4067 4068 4069 4070 4071 4072 4073 4074 { className: "cm-s-default code good has-popover", 4075 cat: "good", 4076 'data-content': "GOOD", 4077 'data-original-title': "", 4078 title: "" }], 4079 4080 ['p', 4081 ["Use ", 4082 ['code', 4083 ["__this"]], " and ", 4084 4085 4086 ['code', 4087 ["___this"]], "... for deep code."]], 4088 4089 4090 4091 ['pre', 4092 ["function on_end(opt){\n var _this = this;\n return function(msg){\n if (_this.socket)\n return 'socket';\n var __this = this;\n setTimeout(function(){ __this.socket = undefined; }, 1000);\n };\n}\n"], 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 { className: "cm-s-default code good has-popover", 4103 cat: "good", 4104 'data-content': "GOOD", 4105 'data-original-title': "", 4106 title: "" }]] 4107 4108 }, 4109 { 4110 id: 'format-function_classes', 4111 title: "\n Functions as class definition", 4112 4113 tag: 'h3', 4114 "short": "Functions as class definition", 4115 html: [['p', 4116 ["When a function is a class definition, e.g. needs ", 4117 ['code', 4118 ["new"]], " in order to use it, it should start with capital letter"]], 4119 4120 4121 4122 ['pre', 4123 ["function etask(opt, states){\n ...\n}\n"], 4124 4125 4126
4127 { className: "cm-s-default code bad has-popover", 4128 cat: "bad", 4129 'data-content': "BAD", 4130 'data-original-title': "", 4131 title: "" }], 4132 4133 ['pre', 4134 ["function Etask(opt, states){\n ...\n}\n"], 4135 4136 4137 4138 { className: "cm-s-default code good has-popover", 4139 cat: "good", 4140 'data-content': "GOOD", 4141 'data-original-title': "", 4142 title: "" }]] 4143 4144 }, 4145 { 4146 id: 'format-es6', 4147 title: "ES6", 4148 tag: 'h3', 4149 "short": "ES6", 4150 html: [] 4151 }, 4152 { 4153 id: 'format-es6-arrow', 4154 title: "Arrow functions", 4155 tag: 'h4', 4156 "short": "Arrow functions", 4157 html: [['p', 4158 [" No spaces around ", 4159 ['code', 4160 ["=>"]], ". Prefer to drop ", 4161 4162 4163 ['code', 4164 ["()"]]]], 4165 4166 4167 ['pre', 4168 ["e.on('play', () => {\n player.start();\n started = 1;\n}\n"], 4169 4170 4171 4172 4173 { className: "cm-s-default code bad has-popover", 4174 cat: "bad", 4175 'data-content': "BAD", 4176 'data-original-title': "", 4177 title: "" }], 4178 4179 ['pre', 4180 ["e.on('play', ()=>{\n player.start();\n started = 1;\n}\n"], 4181 4182 4183 4184 4185 { className: "cm-s-default code good has-popover", 4186 cat: "good", 4187 'data-content': "GOOD", 4188 'data-original-title': "", 4189 title: "" }], 4190 4191 ['pre', 4192 ["socket.on('connect', ()=> state = 'CONNECTED' );\n"], 4193 4194 { className: "cm-s-default code bad has-popover", 4195 cat: "bad", 4196 'data-content': "BAD", 4197 'data-original-title': "", 4198 title: "" }], 4199 4200 ['pre', 4201 ["socket.on('connect', ()=>state = 'CONNECTED');\n"], 4202 4203 { className: "cm-s-default code good has-popover", 4204 cat: "good", 4205 'data-content': "GOOD", 4206 'data-original-title': "", 4207 title: "" }], 4208 4209 ['pre', 4210 ["docs.forEach(doc => add(doc));\n"], 4211 4212 { className: "cm-s-default code bad has-popover", 4213 cat: "bad", 4214 'data-content': "BAD", 4215 'data-original-title': "", 4216 title: "" }], 4217 4218 ['pre', 4219 ["docs.forEach(doc=>add(doc));\n"], 4220 4221 { className: "cm-s-default code good has-popover", 4222 cat: "good", 4223 'data-content': "GOOD", 4224 'data-original-title': "", 4225 title: "" }], 4226 4227 ['pre', 4228 ["docs.forEach((doc, index)=>{\n if (index)\n add(doc, index);\n});\n"], 4229 4230 4231 4232 4233 { className: "cm-s-default code good has-popover", 4234 cat: "good", 4235 'data-content': "GOOD", 4236 'data-original-title': "", 4237 title: "" }], 4238 4239 ['p', 4240 ["Drop ", 4241 ['code', 4242 ["()"]], " around single argument."]], 4243 4244 4245 4246 ['pre', 4247 ["docs.forEach((doc)=>add(doc));\n"], 4248 4249 { className: "cm-s-default code bad has-popover", 4250 cat: "bad", 4251 'data-content': "BAD", 4252 'data-original-title': "", 4253 title: "" }], 4254 4255 ['pre', 4256 ["docs.forEach(doc=>add(doc));\n"], 4257 4258 { className: "cm-s-default code good has-popover", 4259 cat: "good", 4260 'data-content': "GOOD", 4261 'data-original-title': "", 4262 title: "" }], 4263 4264 ['p', 4265 ["Prefer to drop ", 4266 ['code', 4267 ["{}"]], " around single short statement."]], 4268 4269 4270 4271 ['pre', 4272 ["docs.forEach(doc=>{ add(doc); });\n"], 4273 4274 { className: "cm-s-default code ok has-popover", 4275 cat: "ok", 4276 'data-content': "OK", 4277 'data-original-title': "", 4278 title: "" }], 4279 4280 ['pre', 4281 ["docs.forEach(doc=>add(doc));\n"], 4282 4283 { className: "cm-s-default code good has-popover", 4284 cat: "good", 4285 'data-content': "GOOD", 4286 'data-original-title': "", 4287 title: "" }]] 4288 4289 }, 4290 { 4291 id: 'format-es6-preferred_method', 4292 title: "\n Preferred Methods", 4293 4294 tag: 'h4', 4295 "short": "Preferred Methods", 4296 html: [['p', 4297 [" never use ", 4298 ['code', 4299 [".indexOf()"]], " for arrays/strings when ", 4300 4301 4302 ['code', 4303 [".includes()"]], " fits. "]], 4304 4305 4306 4307 ['pre', 4308 ["if (apps.indexOf(zserver_match[1])<0)\n apps.push(zserver_match[1]);\n"], 4309 4310 4311 { className: "cm-s-default code bad has-popover", 4312 cat: "bad", 4313 'data-content': "BAD", 4314 'data-original-title': "", 4315 title: "" }], 4316 4317 ['pre', 4318 ["if (!apps.includes(zserver_match[1]))\n apps.push(zserver_match[1]);\n"], 4319 4320
4321 { className: "cm-s-default code good has-popover", 4322 cat: "good", 4323 'data-content': "GOOD", 4324 'data-original-title': "", 4325 title: "" }], 4326 4327 ['p', 4328 [" never user ", 4329 ['code', 4330 [".indexOf()"]], " for strings when ", 4331 4332 4333 ['code', 4334 [".startsWith()"]], " fits. "]], 4335 4336 4337 4338 ['pre', 4339 ["return !patch[0].indexOf(changed_file)\n || !patch[1].indexOf(changed_file);\n"], 4340 4341 4342 { className: "cm-s-default code bad has-popover", 4343 cat: "bad", 4344 'data-content': "BAD", 4345 'data-original-title': "", 4346 title: "" }], 4347 4348 ['pre', 4349 ["return patch[0].startsWith(changed_file)\n || patch[1].startsWith(changed_file);\n"], 4350 4351 4352 { className: "cm-s-default code good has-popover", 4353 cat: "good", 4354 'data-content': "GOOD", 4355 'data-original-title': "", 4356 title: "" }]] 4357 4358 }, 4359 { 4360 id: 'format-es6-generator', 4361 title: "Generators", 4362 tag: 'h4', 4363 "short": "Generators", 4364 html: [['p', 4365 ["No spaces around ", 4366 ['code', 4367 ["*"]], "."]], 4368 4369 4370 4371 ['pre', 4372 ["etask(function* (){\n ...\n});\n"], 4373 4374 4375 4376 { className: "cm-s-default code bad has-popover", 4377 cat: "bad", 4378 'data-content': "BAD", 4379 'data-original-title': "", 4380 title: "" }], 4381 4382 ['pre', 4383 ["etask(function*(){\n ...\n});\n"], 4384 4385 4386 4387 { className: "cm-s-default code good has-popover", 4388 cat: "good", 4389 'data-content': "GOOD", 4390 'data-original-title': "", 4391 title: "" }], 4392 4393 ['pre', 4394 ["etask(function * get_request(){\n ...\n});\n"], 4395 4396 4397 4398 { className: "cm-s-default code bad has-popover", 4399 cat: "bad", 4400 'data-content': "BAD", 4401 'data-original-title': "", 4402 title: "" }], 4403 4404 ['pre', 4405 ["etask(function*get_request(){\n ...\n});\n"], 4406 4407 4408 4409 { className: "cm-s-default code good has-popover", 4410 cat: "good", 4411 'data-content': "GOOD", 4412 'data-original-title': "", 4413 title: "" }]] 4414 4415 }, 4416 { 4417 id: 'format-es6-class', 4418 title: "Class definition", 4419 tag: 'h4', 4420 "short": "Class definition", 4421 html: [['p', 4422 ["Class name start with capital leter"]], 4423 4424 ['pre', 4425 ["class SimpleView {}\n"], 4426 4427 { className: "cm-s-default code bad has-popover", 4428 cat: "bad", 4429 'data-content': "BAD", 4430 'data-original-title': "", 4431 title: "" }], 4432 4433 ['pre', 4434 ["class simple_view {}\n"], 4435 4436 { className: "cm-s-default code bad has-popover", 4437 cat: "bad", 4438 'data-content': "BAD", 4439 'data-original-title': "", 4440 title: "" }], 4441 4442 ['pre', 4443 ["class Simple_view {}\n"], 4444 4445 { className: "cm-s-default code good has-popover", 4446 cat: "good", 4447 'data-content': "GOOD", 4448 'data-original-title': "", 4449 title: "" }], 4450 4451 ['p', 4452 ["Add space between class name and ", 4453 ['code', 4454 ["{"]]]], 4455 4456 4457 ['pre', 4458 ["class A{}\n"], 4459 4460 { className: "cm-s-default code bad has-popover", 4461 cat: "bad", 4462 'data-content': "BAD", 4463 'data-original-title': "", 4464 title: "" }], 4465 4466 ['pre', 4467 ["class A {}\n"], 4468 4469 { className: "cm-s-default code good has-popover", 4470 cat: "good", 4471 'data-content': "GOOD", 4472 'data-original-title': "", 4473 title: "" }]] 4474 4475 }, 4476 { 4477 id: 'format-es6-class-etask', 4478 title: "Etask methods", 4479 tag: 'h4', 4480 "short": "Etask methods", 4481 html: [['p', 4482 ["Indentation reducing is allowed, but class methods should be\n indented"]], 4483 4484 4485 ['pre', 4486 ["class A {\n prop(){\n return etask(function*(){\n code;\n });\n }\n}\n"], 4487 4488 4489 4490 4491 4492 4493 4494 { className: "cm-s-default code good has-popover", 4495 cat: "good", 4496 'data-content': "GOOD", 4497 'data-original-title': "", 4498 title: "" }], 4499 4500 ['pre', 4501 ["class A {\n prop(){ return etask(function*(){\n code;\n }); }\n}\n"], 4502 4503 4504 4505 4506 4507 { className: "cm-s-default code ok has-popover", 4508 cat: "ok", 4509 'data-content': "OK", 4510 'data-original-title': "", 4511 title: "" }], 4512 4513 ['pre', 4514 ["class A {\nprop(){\n let _this = this;\nreturn etask(function*(){\n code;\n });\n}\n}\n"], 4515 4516 4517 4518 4519 4520 4521 4522
4523 { className: "cm-s-default code bad has-popover", 4524 cat: "bad", 4525 'data-content': "BAD", 4526 'data-original-title': "", 4527 title: "" }], 4528 4529 ['pre', 4530 ["class A {\n prop(){\n let _this = this;\n return etask(function*(){\n code;\n }); }\n}\n"], 4531 4532 4533 4534 4535 4536 4537 4538 { className: "cm-s-default code good has-popover", 4539 cat: "good", 4540 'data-content': "GOOD", 4541 'data-original-title': "", 4542 title: "" }]] 4543 4544 }, 4545 { 4546 id: 'prog_tech', 4547 title: "Programming technique", 4548 tag: 'h2', 4549 "short": "Programming technique", 4550 html: [] 4551 }, 4552 { 4553 id: 'prog_tech-generic', 4554 title: "Generic code", 4555 tag: 'h3', 4556 "short": "Generic code", 4557 html: [['p', 4558 [" Code should be written generically only if during the time you\n are writing it, it is called at least twice, if not more,\n and save code in the caller.", 4559 4560 4561 ['br'], " Generic code need a deeper unit-tests then regular code. "]], 4562 4563 4564 ['pre', 4565 ["E.first_weekday_of_month = function(wd, d){\n ...\n};\n"], 4566 4567 4568 4569 { className: "cm-s-default code bad has-popover", 4570 cat: "bad", 4571 'data-content': "BAD", 4572 'data-original-title': "", 4573 title: "" }], 4574 4575 ['pre', 4576 ["E.strftime = function(fmt, d, opt){\n ...\n};\n"], 4577 4578 4579 4580 { className: "cm-s-default code good has-popover", 4581 cat: "good", 4582 'data-content': "GOOD", 4583 'data-original-title': "", 4584 title: "" }]] 4585 4586 }, 4587 { 4588 id: 'prog_tech-early_return', 4589 title: "\n Early return", 4590 4591 tag: 'h3', 4592 "short": "Early return", 4593 html: [['p', 4594 ["Avoid ", 4595 ['code', 4596 ["if()"]], " on 50% or more of a function."]], 4597 4598 4599 4600 ['pre', 4601 ["let inited;\nE.init = ()=>{\n if (!inited)\n {\n inited = true;\n register_app();\n set_timers();\n }\n};\n"], 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 { className: "cm-s-default code bad has-popover", 4612 cat: "bad", 4613 'data-content': "BAD", 4614 'data-original-title': "", 4615 title: "" }], 4616 4617 ['pre', 4618 ["let inited;\nE.init = ()=>{\n if (inited)\n return;\n inited = true;\n register_app();\n set_timers();\n};\n"], 4619 4620 4621 4622 4623 4624 4625 4626 4627 { className: "cm-s-default code good has-popover", 4628 cat: "good", 4629 'data-content': "GOOD", 4630 'data-original-title': "", 4631 title: "" }]] 4632 4633 }, 4634 { 4635 id: 'prog_tech-defensive_code', 4636 title: "No defensive code", 4637 tag: 'h3', 4638 "short": "No defensive code", 4639 html: [['p', 4640 ["No function argument validation"]], 4641 4642 ['pre', 4643 ["function send_msg(client, msg, opt){\n if (client===undefined || msg===undefined)\n throw new Error('send_msg: wrong params');\n opt = opt||{};\n msg = prepare_msg(msg);\n ...\n}\n"], 4644 4645 4646 4647 4648 4649 4650 4651 { className: "cm-s-default code bad has-popover", 4652 cat: "bad", 4653 'data-content': "BAD", 4654 'data-original-title': "", 4655 title: "" }], 4656 4657 ['pre', 4658 ["function send_msg(client, msg, opt){\n opt = opt||{};\n msg = prepare_msg(msg);\n ...\n}\n"], 4659 4660 4661 4662 4663 4664 { className: "cm-s-default code good has-popover", 4665 cat: "good", 4666 'data-content': "GOOD", 4667 'data-original-title': "", 4668 title: "" }]] 4669 4670 }, 4671 { 4672 id: 'prog_tech-assign_truth', 4673 title: "\n Assigning in a truth value (if or while)", 4674 4675 tag: 'h3', 4676 "short": "Assigning in a truth value", 4677 html: [['p', 4678 [" Assigning truth value in ", 4679 ['code', 4680 ["if"]], 4681 4682 ['code', 4683 ["while"]], 4684 4685 ['code', 4686 ["for"]], " helps shorten and simplify code. "]], 4687 4688 4689 4690 ['pre', 4691 ["for (i = 0; get_result(i); i++)\n handle_result(get_result(i));\n"], 4692 4693 4694 { className: "cm-s-default code bad has-popover", 4695 cat: "bad", 4696 'data-content': "BAD", 4697 'data-original-title': "", 4698 title: "" }], 4699 4700 ['pre', 4701 ["for (i = 0;; i++)\n{\n result = get_result(i);\n if (!result)\n break;\n handle_result(result);\n}\n"], 4702 4703 4704 4705 4706 4707 4708
4709 { className: "cm-s-default code bad has-popover", 4710 cat: "bad", 4711 'data-content': "BAD", 4712 'data-original-title': "", 4713 title: "" }], 4714 4715 ['pre', 4716 ["for (i = 0; result = get_result(i); i++)\n handle_result(result);\n"], 4717 4718 4719 { className: "cm-s-default code good has-popover", 4720 cat: "good", 4721 'data-content': "GOOD", 4722 'data-original-title': "", 4723 title: "" }], 4724 4725 ['pre', 4726 ["if (compute_num())\n return compute_num();\n"], 4727 4728 4729 { className: "cm-s-default code bad has-popover", 4730 cat: "bad", 4731 'data-content': "BAD", 4732 'data-original-title': "", 4733 title: "" }], 4734 4735 ['pre', 4736 ["if (x = compute_num())\n return x;\n"], 4737 4738 4739 { className: "cm-s-default code good has-popover", 4740 cat: "good", 4741 'data-content': "GOOD", 4742 'data-original-title': "", 4743 title: "" }], 4744 4745 ['pre', 4746 ["while (1)\n{\n i = input();\n if (!i)\n break;\n handle_input(i);\n}\n"], 4747 4748 4749 4750 4751 4752 4753 4754 { className: "cm-s-default code bad has-popover", 4755 cat: "bad", 4756 'data-content': "BAD", 4757 'data-original-title': "", 4758 title: "" }], 4759 4760 ['pre', 4761 ["while (i = input())\n handle_input(i);\n"], 4762 4763 4764 { className: "cm-s-default code good has-popover", 4765 cat: "good", 4766 'data-content': "GOOD", 4767 'data-original-title': "", 4768 title: "" }]] 4769 4770 }, 4771 { 4772 id: 'prog_tech-diable_test', 4773 title: "\n Temporary disabling a test", 4774 4775 tag: 'h3', 4776 "short": "Temporary disable test", 4777 html: [['p', 4778 [" When temporary disabling test code that fail:", 4779 ['br'], " Do not indent the code of the disabled tests. "]], 4780 4781 4782 ['pre', 4783 ["if (0) // XXX yoni: fails on BAT\n jtest_eq(...);\nif (0) // XXX derry: need fix for Ubuntu\n{\n jtest1();\n jtest2();\n}\n"], 4784 4785 4786 4787 4788 4789 4790 4791 { className: "cm-s-default code bad has-popover", 4792 cat: "bad", 4793 'data-content': "BAD", 4794 'data-original-title': "", 4795 title: "" }], 4796 4797 ['pre', 4798 ["if (0) // XXX yoni: fails on BAT\njtest_eq(...);\nif (0){ // XXX derry: need fix for Ubuntu\njtest1();\njtest2();\n}\n"], 4799 4800 4801 4802 4803 4804 4805 { className: "cm-s-default code good has-popover", 4806 cat: "good", 4807 'data-content': "GOOD", 4808 'data-original-title': "", 4809 title: "" }], 4810 4811 ['p', 4812 ["If it is only one test (one statement), then don't use ", 4813 ['code', 4814 ["{ }"]], " even if the statement is written in 2 lines:"]], 4815 4816 4817 4818 ['pre', 4819 ["if (0) // XXX: yoni: fails on BAT\n{\njtest_run(xxx, yyy,\n zzz);\n}\n"], 4820 4821 4822 4823 4824 4825 { className: "cm-s-default code bad has-popover", 4826 cat: "bad", 4827 'data-content': "BAD", 4828 'data-original-title': "", 4829 title: "" }], 4830 4831 ['pre', 4832 ["if (0) // XXX: yoni: fails on BAT\njtest_run(xxx, yyy,\n zzz);\n"], 4833 4834 4835 4836 { className: "cm-s-default code good has-popover", 4837 cat: "good", 4838 'data-content': "GOOD", 4839 'data-original-title': "", 4840 title: "" }], 4841 4842 ['p', 4843 ["Open '{' on the same if() line:"]], 4844 4845 ['pre', 4846 ["// XXX: yoni: fails on BAT\nif (0)\n{\njtest_run(xxx, yyy, zzz);\njtest_run(xxx, yyy, zzz);\n}\n"], 4847 4848 4849 4850 4851 4852 4853 { className: "cm-s-default code bad has-popover", 4854 cat: "bad", 4855 'data-content': "BAD", 4856 'data-original-title': "", 4857 title: "" }], 4858 4859 ['pre', 4860 ["if (0){ // XXX: yoni: fails on BAT\njtest_run(xxx, yyy, zzz);\njtest_run(xxx, yyy, zzz);\n}\n"], 4861 4862 4863 4864 4865 { className: "cm-s-default code good has-popover", 4866 cat: "good", 4867 'data-content': "GOOD", 4868 'data-original-title': "", 4869 title: "" }]] 4870 4871 }, 4872 { 4873 id: 'prog_tech-perf', 4874 title: "Performance", 4875 tag: 'h3', 4876 "short": "Performance", 4877 html: [['p', 4878 [" 99% of the code is not performance critical. So always try to\n write shorter, simpler, more natural and modern code. If ES6\n gives nicer simpler constructs - we use them.", 4879 4880 4881 ['br'], " But, in the rare 1% of the code that performs tight loops, we\n deviate from 'nice simple c
4881ode', and write a little longer\n code, to avoid ", 4882 4883 4884 4885 ['a', 4886 [" JS VM JIT in-efficiencies"], 4887 { href: "http://www.incaseofstairs.com/2015/06/es6-feature-performance/" }], ".", 4888 4889 4890 ['br'], " We normally check V8, and re-check check these issues\n periodically as newer versions of JS VM's come out. "]]] 4891 4892 4893 4894 }, 4895 { 4896 id: 'prog_tech-perf-for_of', 4897 title: "\n for..of: 3x-20x slower", 4898 4899 tag: 'h4', 4900 "short": "for..of", 4901 html: [['pre', 4902 ["for (let p of patterns)\n add_pattern(p);\n"], 4903 4904 4905 { className: "cm-s-default code bad has-popover", 4906 cat: "bad", 4907 'data-content': "BAD", 4908 'data-original-title': "", 4909 title: "" }], 4910 4911 ['pre', 4912 ["for (let i=0; i<patterns.length; i++)\n add_pattern(patterns[i]);\n"], 4913 4914 4915 { className: "cm-s-default code good has-popover", 4916 cat: "good", 4917 'data-content': "GOOD", 4918 'data-original-title': "", 4919 title: "" }]] 4920 4921 }, 4922 { 4923 id: 'prog_tech-wrong_perf', 4924 title: "\n Wrong performance assumptions", 4925 4926 tag: 'h3', 4927 "short": "Wrong performance assumptions", 4928 html: [['p', 4929 [" We list here commonly mistaken performance assumptions. They\n might have been correct in the past, but JS VMs get better\n and better - so these performance improvement assumptions\n are not longer correct. "]]] 4930 4931 4932 4933 4934 }, 4935 { 4936 id: 'prog_tech-wrong_perf-map', 4937 title: "\n Map is faster than Object", 4938 4939 tag: 'h4', 4940 "short": "Map vs Object", 4941 html: [['p', 4942 [" For keys that are plain positive numbers, Object may be faster\n due to Array optimizations in the VM. But for keys that are\n strings - Map is faster. "]], 4943 4944 4945 4946 ['pre', 4947 ["let cache = {};\ncache[key] = value;\n"], 4948 4949 4950 { className: "cm-s-default code bad has-popover", 4951 cat: "bad", 4952 'data-content': "BAD", 4953 'data-original-title': "", 4954 title: "" }], 4955 4956 ['pre', 4957 ["let cache = new Map();\ncache.set(key, value);\n"], 4958 4959 4960 { className: "cm-s-default code good has-popover", 4961 cat: "good", 4962 'data-content': "GOOD", 4963 'data-original-title': "", 4964 title: "" }]] 4965 4966 }, 4967 { 4968 id: 'deep_fix', 4969 title: "Deep Fix", 4970 tag: 'h3', 4971 html: [['div', 4972 [" When you (or someone else) find a coding mistake in your code:\n ", 4973 4974 ['div', 4975 ["BAD: just fixing that specific mistake you found"], 4976 { className: "bad" }], 4977 4978 ['div', 4979 ["OK: fixing also all such mistakes you made in your own\n code"], 4980 4981 { className: "good" }], 4982 4983 ['div', 4984 ["GOOD: fixing all such mistakes, in the whole codebase,\n using smart rgrep's to find them."], 4985 4986 { className: "good" }], 4987 4988 ['div', 4989 ["GREAT: if this is a common mistake people tend to repeat,\n then once a month repeat the search to find such NEW\n mistakes."], 4990 4991 4992 { className: "good" }], 4993 4994 ['div', 4995 ["EXCELLENT: add a rule to zlint to auto detect and if\n possible auto fix the mistake."], 4996 4997 { className: "good" }]]]] 4998 4999 5000 }, 5001 { 5002 id: 'hola', 5003 title: "Hola specific API", 5004 tag: 'h2', 5005 "short": "Hola specific API", 5006 html: [] 5007 }, 5008 { 5009 id: 'hola-disable-feature', 5010 title: "Disable feature", 5011 tag: 'h3', 5012 "short": "Disable feature", 5013 html: [['li', 5014 ["dynamic using reconf: preferred"]], 5015 5016 ['li', 5017 ["env: usually when needed in init, for example port numbers"]], 5018 5019 ['li', 5020 ["if (0): unittests and non production code"]], 5021 5022 ['p', 5023 ["TBA: code examples"]]] 5024 5025 }, 5026 { 5027 id: 'hola-etask', 5028 title: "etask", 5029 tag: 'h3', 5030 "short": "etask", 5031 html: [] 5032 }, 5033 { 5034 id: 'hola-etask-overview', 5035 title: "Overview", 5036 tag: 'h4', 5037 "short": "Overview", 5038 html: [['p', 5039 [['code', 5040 ["etask"]], " is Hola's library for writing asynchronous code in a concise\n synchronous like manner. "]]] 5041 5042 5043 5044 5045 }, 5046 { 5047 id: 'hola-etask-why-etask', 5048 title: "Why etask?", 5049 tag: 'h4', 5050 "short": "Why etask?", 5051 html: [['p', 5052 [" Promises/async functions don't support structured cancelation,\n and callbacks are difficult to coordinate/compose.", 5053 5054 ['br'], 5055 ['code', 5056 ["etask"]], " supports cancelation by default and can manage callback and\n promise driven subtasks easily.", 5057 5058 5059 5060 ['br'], " For example, if we wanted to find a specific user from the DB,\n the simplest synchronous code would look like this: "]], 5061 5062 5063 5064 ['pre',
5065 ["function user_find_sync(){\n let conn = mongodb.connect();\n let iter = mongodb.find(conn.users, {});\n let u;\n while ((u = mongodb.get_next(iter)))\n {\n if (correct_user(u))\n break;\n }\n mongodb.close(conn);\n return u && u.username;\n}\n"], 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 { className: "cm-s-default code ", 5079 cat: "" }], 5080 5081 ['p', 5082 [" But this is synchronous, blocking code. JavaScript is async\n and single threaded, so blocking calls are a huge\n performance problem.", 5083 5084 5085 ['br'], " So lets see how to port the sync code to async code. Lets\n start with the ideal solution, using Hola's ", 5086 5087 5088 ['code', 5089 ["etask"]], "s and ES6 generators. "]], 5090 5091 5092 5093 ['p', 5094 ["etask ES6 (perfect!):"]], 5095 5096 ['pre', 5097 ["let user_find_es6 = ()=>etask(function*(){\n let conn = yield mongodb.connect();\n let iter = yield mongodb.find(conn.users, {});\n let u;\n while (u = yield mongodb.find_next(iter))\n {\n if (yield correct_user(u))\n break;\n }\n yield mongodb.close(conn);\n return u && u.username;\n}\n"], 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 { className: "cm-s-default code good has-popover", 5111 cat: "good", 5112 'data-content': "GOOD", 5113 'data-original-title': "", 5114 title: "" }], 5115 5116 ['p', 5117 ["Compare this with other possible approaches:"]], 5118 5119 ['p', 5120 ["callbacks (", 5121 ['a', 5122 ["callback-hell..."], 5123 { href: "http://callbackhell.com/" }], "):"]], 5124 5125 5126 5127 ['pre', 5128 ["let conn, iter;\nfunction user_find_cbs(cb){\n mongodb.connect(mongo_connected_cb, cb);\n}\n\nfunction mongo_connected_cb(cb){\n mongodb.find(conn.users, {}, users_find_cb, cb);\n}\n\nfunction users_find_cb(iter, cb){\n mongodb.get_next(iter, filter_users_cb);\n}\n\nfunction filter_users_cb(u, cb){\n if (!u)\n return mongo_disconnect(cb);\n correct_user(correct_user_cb, u, cb);\n}\n\nfunction correct_user_cb(u, is_correct, cb){\n if (is_correct)\n return mongo_disconnect(cb, u.username);\n mongo_connected_cb(cb);\n}\n\nfunction mongo_disconnect(cb, username){\n mongodb.close(conn, disconnected_cb, cb, username);\n}\n\nfunction disconnected_cb(cb, username){\n cb(username);\n}\n"], 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 { className: "cm-s-default code bad has-popover", 5162 cat: "bad", 5163 'data-content': "BAD", 5164 'data-original-title': "", 5165 title: "" }], 5166 5167 ['p', 5168 ["promise (includes ugly recursion to emulate a loop, nested ", 5169 ['code', 5170 ["then"]], ", and obscure execution flow):"]], 5171 5172 5173 5174 ['pre', 5175 ["function user_find(){\n return mongodb.connect()\n .then(function(conn){ return mongodb.find(conn.users, {}); })\n .then(function filter(){\n return mongodb.find_next(iter).then(function(u){\n if (!u)\n {\n return mongodb.close(conn)\n .then(function(){ return cb(); });\n }\n return correct_user(u).then(function(is_correct){\n if (is_correct)\n {\n return mongodb.close(conn).then(function(){\n user_find_end(user.username); });\n }\n return filter(iter);\n });\n });\n });\n}\n"], 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 { className: "cm-s-default code bad has-popover", 5198 cat: "bad", 5199 'data-content': "BAD", 5200 'data-original-title': "", 5201 title: "" }], 5202 5203 ['p', 5204 [['code', 5205 ["async function"]], " (no support for cancelation if the parent function exits\n early):"]], 5206 5207 5208 5209 5210 ['pre', 5211 ["async function user_find(){\n let conn = await mongodb.connect();\n let iter = await mongodb.find(conn.users, {});\n let u;\n while (u = await mongodb.find_next(iter))\n {\n if (await correct_user(u))\n break;\n }\n await mongodb.close(conn);\n return u && u.username;\n }\n"], 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223
5224 { className: "cm-s-default code bad has-popover", 5225 cat: "bad", 5226 'data-content': "BAD", 5227 'data-original-title': "", 5228 title: "" }], 5229 5230 ['p', 5231 ["etask ES5 (when generators are not available):"]], 5232 5233 ['pre', 5234 ["function user_find(){\n return etask([function(){\n return mongodb.connect();\n }, function(conn){\n return mongodb.find(conn.users, {});\n }, function(iter){\n return etask.while([function(){\n return mongodb.find_next(iter);\n }, function(u){\n if (!u)\n return this.break();\n return correct_user(u);\n }, function(is_correct){\n if (is_correct)\n this.break(u.username);\n }]);\n }, function(u){\n username = u;\n return mongodb.close(conn);\n }, function(){\n return username;\n }]);\n}\n"], 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 { className: "cm-s-default code good has-popover", 5259 cat: "good", 5260 'data-content': "GOOD", 5261 'data-original-title': "", 5262 title: "" }]] 5263 5264 }, 5265 { 5266 id: 'hola-etask-cheat_sheet', 5267 title: "Cheat sheet", 5268 tag: 'h4', 5269 "short": "Cheat sheet", 5270 html: [['table', 5271 [['tbody', 5272 [['tr', 5273 [['td', 5274 ["synchronous"]], 5275 5276 ['td', 5277 ["etask ES5"]], 5278 5279 ['td', 5280 ["etask ES6"]]]], 5281 5282 5283 ['tr', 5284 [['td', 5285 [['code', 5286 ["for"]]]], 5287 5288 5289 ['td', 5290 [['code', 5291 ["this.for()"]]]], 5292 5293 5294 ['td', 5295 [['code', 5296 ["for"]]]]]], 5297 5298 5299 5300 ['tr', 5301 [['td', 5302 [['code', 5303 ["continue"]]]], 5304 5305 5306 ['td', 5307 [['code', 5308 ["this.continue()"]]]], 5309 5310 5311 ['td', 5312 [['code', 5313 ["continue"]]]]]], 5314 5315 5316 5317 ['tr', 5318 [['td', 5319 [['code', 5320 ["return"]]]], 5321 5322 5323 ['td', 5324 [['code', 5325 ["this.return()"]]]], 5326 5327 5328 ['td', 5329 [['code', 5330 ["return"]]]]]]]]]]] 5331 5332 5333 5334 5335 5336 }, 5337 { 5338 id: 'hola-etask-usage', 5339 title: "Usage examples", 5340 tag: 'h4', 5341 html: [['p', 5342 ["Simple calls to etask or promise returning functions:"]], 5343 5344 ['pre', 5345 ["let process_items = ()=>etask(function*(){\n let items = yield get_items();\n for (let item of items)\n {\n if (!(yield item_valid(item))\n return false;\n }\n return true;\n});\n"], 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 { className: "cm-s-default code good has-popover", 5356 cat: "good", 5357 'data-content': "GOOD", 5358 'data-original-title': "", 5359 title: "" }], 5360 5361 ['p', 5362 ["Call a callback driven function:"]], 5363 5364 ['pre', 5365 ["let make_request = url=>etask(function*(){\n return yield etask.nfn_apply(request, [url]);\n});\n"], 5366 5367 5368 5369 { className: "cm-s-default code good has-popover", 5370 cat: "good", 5371 'data-content': "GOOD", 5372 'data-original-title': "", 5373 title: "" }], 5374 5375 ['p', 5376 ["Wait on an event emitter:"]], 5377 5378 ['pre', 5379 ["let save_request = (req, file)=>etask(function*(){\n req.pipe(file)\n .on('end', ()=>this.continue())\n .on('error', e=>this.throw(e));\n return yield this.wait();\n});\n"], 5380 5381 5382 5383 5384 5385 5386 { className: "cm-s-default code ok has-popover", 5387 cat: "ok", 5388 'data-content': "OK", 5389 'data-original-title': "", 5390 title: "" }], 5391 5392 ['pre', 5393 ["let save_request = (req, file)=>etask(function*(){\n req.pipe(file)\n .on('end', this.continue_fn())\n .on('error', this.throw_fn());\n return yield this.wait();\n});\n"], 5394 5395 5396 5397 5398 5399 5400 { className: "cm-s-default code good has-popover", 5401 cat: "good", 5402 'data-content': "GOOD", 5403 'data-original-title': "", 5404 title: "" }], 5405 5406 ['p', 5407 ["Scheduled resource cleanup (like Go's ", 5408 ['code', 5409 ["defer"]], " statement):"]], 5410 5411 5412 5413 ['pre', 5414 ["let do_something = ()=>etask(function*(){\n let temp_dir = yield make_temp_dir();\n // temp dir will be cleaned up whether the function succeeds or throws\n this.finally(()=>unlink(temp_dir));\n yield do_step1();\n yield do_step2();\n return yield do_step3();\n});\n"], 5415 5416 5417 5418 5419 5420 5421 5422
5423 { className: "cm-s-default code good has-popover", 5424 cat: "good", 5425 'data-content': "GOOD", 5426 'data-original-title': "", 5427 title: "" }]] 5428 5429 }, 5430 { 5431 id: 'hola-etask-coding', 5432 title: "Coding", 5433 tag: 'h4', 5434 "short": "Coding", 5435 html: [['p', 5436 ["When possible, use ES6 arrow function with no brackets and no ", 5437 ['code', 5438 ["return"]]]], 5439 5440 5441 ['pre', 5442 ["let t = function(fn, domain, expected){\n let i = 7;\n return etask(function*(){\n ...\n };\n});\n"], 5443 5444 5445 5446 5447 5448 5449 { className: "cm-s-default code bad has-popover", 5450 cat: "bad", 5451 'data-content': "BAD", 5452 'data-original-title': "", 5453 title: "" }], 5454 5455 ['pre', 5456 ["let t = (fn, domain, expected)=>etask(function*(){\n let i = 7;\n ...\n});\n"], 5457 5458 5459 5460 5461 { className: "cm-s-default code good has-popover", 5462 cat: "good", 5463 'data-content': "GOOD", 5464 'data-original-title': "", 5465 title: "" }], 5466 5467 ['p', 5468 [['code', 5469 ["return etask()"]], " in the middle of a function should be indented to the function\n level. Should be used rarely, only when fast path needed "]], 5470 5471 5472 5473 5474 ['pre', 5475 ["let get_headers = req=>{\n let cache;\n if (cache = cache_getreq)\n return cache;\n return etask(function*get_headers(){\n ...\n}); }\n"], 5476 5477 5478 5479 5480 5481 5482 5483 { className: "cm-s-default code bad has-popover", 5484 cat: "bad", 5485 'data-content': "BAD", 5486 'data-original-title': "", 5487 title: "" }], 5488 5489 ['pre', 5490 ["let get_headers = req=>{\n let cache;\n if (cache = cache_get(req))\n return cache;\nreturn etask(function*get_headers(){\n ...\n}); }\n"], 5491 5492 5493 5494 5495 5496 5497 5498 { className: "cm-s-default code good has-popover", 5499 cat: "good", 5500 'data-content': "GOOD", 5501 'data-original-title': "", 5502 title: "" }], 5503 5504 ['p', 5505 ["etask class indentation"]], 5506 5507 ['pre', 5508 ["class Read_client {\nsearch(q){\n let _this = this;\nreturn etask(function*(){\n ...\n}); }\n}\n"], 5509 5510 5511 5512 5513 5514 5515 5516 { className: "cm-s-default code bad has-popover", 5517 cat: "bad", 5518 'data-content': "BAD", 5519 'data-original-title': "", 5520 title: "" }], 5521 5522 ['pre', 5523 ["class Read_client {\n search(q){\n let _this = this;\n return etask(function*(){\n ...\n });\n }\n}\n"], 5524 5525 5526 5527 5528 5529 5530 5531 5532 { className: "cm-s-default code ok has-popover", 5533 cat: "ok", 5534 'data-content': "OK", 5535 'data-original-title': "", 5536 title: "" }], 5537 5538 ['pre', 5539 ["class Read_client {\n search(q){\n let _this = this;\n return etask(function*(){\n ...\n }); }\n}\n"], 5540 5541 5542 5543 5544 5545 5546 5547 { className: "cm-s-default code good has-popover", 5548 cat: "good", 5549 'data-content': "GOOD", 5550 'data-original-title': "", 5551 title: "" }], 5552 5553 ['pre', 5554 ["class Read_client {\n search(q){ let _this = this; return etask(function*(){\n ...\n }); }\n}\n"], 5555 5556 5557 5558 5559 5560 { className: "cm-s-default code good has-popover", 5561 cat: "good", 5562 'data-content': "GOOD", 5563 'data-original-title': "", 5564 title: "" }], 5565 5566 ['p', 5567 ["No hidden (automatic) ", 5568 ['code', 5569 ["yield"]], " in return."]], 5570 5571 5572 5573 ['pre', 5574 ["let insert_cid_to_mongo = cid=>etask(function*(){\n let client = yield mongodb.findOne(...cid...);\n return mongodb.update(...client...);\n});\n"], 5575 5576 5577 5578 5579 { className: "cm-s-default code bad has-popover", 5580 cat: "bad", 5581 'data-content': "BAD", 5582 'data-original-title': "", 5583 title: "" }], 5584 5585 ['pre', 5586 ["let insert_cid_to_mongo = cid=>etask(function*(){\n let client = yield mongodb.findOne(...cid...);\n return yield mongodb.update(...client...);\n});\n"], 5587 5588 5589 5590 5591 { className: "cm-s-default code good has-popover", 5592 cat: "good", 5593 'data-content': "GOOD", 5594 'data-original-title': "", 5595 title: "" }], 5596 5597 ['p', 5598 ["etask name for lib API"]], 5599 5600 ['pre', 5601 ["E.find_all = (zmongo, selector, opt)=>etask(function*(){\n ...\n});\n"], 5602 5603 5604
5605 { className: "cm-s-default code bad has-popover", 5606 cat: "bad", 5607 'data-content': "BAD", 5608 'data-original-title': "", 5609 title: "" }], 5610 5611 ['pre', 5612 ["E.find_all = (zmongo, selector, opt)=>etask(function*mongo_find_all(){\n ...\n});\n"], 5613 5614 5615 5616 { className: "cm-s-default code good has-popover", 5617 cat: "good", 5618 'data-content': "GOOD", 5619 'data-original-title': "", 5620 title: "" }], 5621 5622 ['p', 5623 ["No etask name for internal functions"]], 5624 5625 ['pre', 5626 ["let generate_daily = user=>etask(function*generate_daily(){\n ...\n});\n"], 5627 5628 5629 5630 { className: "cm-s-default code bad has-popover", 5631 cat: "bad", 5632 'data-content': "BAD", 5633 'data-original-title': "", 5634 title: "" }], 5635 5636 ['pre', 5637 ["let generate_daily = user=>etask(function*(){\n ...\n});\n"], 5638 5639 5640 5641 { className: "cm-s-default code good has-popover", 5642 cat: "good", 5643 'data-content': "GOOD", 5644 'data-original-title': "", 5645 title: "" }], 5646 5647 ['p', 5648 [" Avoid enclosing a large portion of a function in a try block.", 5649 ['br'], " Prefer this.on('uncaught', ...) and this.finally when\n applicable. (", 5650 5651 5652 ['a', 5653 ["why?"], 5654 { className: "why", 5655 'data-why-popup': "", 5656 popup: "why_no_try_catch" }], ") "]], 5657 5658 5659 5660 ['div', 5661 [" Code is shorter and the indentation reduce readability. "], 5662 { id: "why_no_try_catch", 5663 className: "why_popup" }], 5664 5665 ['pre', 5666 ["let get_zone_bw = config=>(req, res)=>etask(function*(){\n let zone = yield check_zone(config, req, res);\n try {\n let data = yield get_graphite_bw(req, zone.customer, [zone.name]);\n res.json(data);\n } catch(e){\n zerr(zerr.e2s(e));\n return void res.status(500).send('err');\n }\n});\n"], 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 { className: "cm-s-default code bad has-popover", 5678 cat: "bad", 5679 'data-content': "BAD", 5680 'data-original-title': "", 5681 title: "" }], 5682 5683 ['pre', 5684 ["let get_zone_bw = config=>(req, res)=>etask(function*(){\n let zone = yield check_zone(config, req, res);\n this.on('uncaught', err_handler(res));\n let data = yield get_graphite_bw(req, zone.customer, [zone.name]);\n res.json(data);\n});\n"], 5685 5686 5687 5688 5689 5690 5691 { className: "cm-s-default code good has-popover", 5692 cat: "good", 5693 'data-content': "GOOD", 5694 'data-original-title': "", 5695 title: "" }]] 5696 5697 }, 5698 { 5699 id: 'hola-react', 5700 title: "React code", 5701 tag: 'h3', 5702 "short": "React code", 5703 html: [['p', 5704 [" Read ", 5705 ['a', 5706 ["React docs"], 5707 { href: "https://reactjs.org/docs/getting-started.html" }], " and follow guidlines and recommendations unless they conflict\n with Hola React conventions. "]]] 5708 5709 5710 5711 5712 }, 5713 { 5714 id: 'hola-react-dry', 5715 title: "Use Components to stay DRY", 5716 tag: 'h4', 5717 html: [['p', 5718 [" Use the same guidlines for code repetition as regular\n functions: ", 5719 5720 ['a', 5721 ["Try not repeat yourself"], 5722 { href: "http://hola.org/dna/tree_code#lift-tdry" }], ". "]], 5723 5724 5725 5726 ['p', 5727 ["Move shared JSX to a util component to repeat markup"]], 5728 5729 ['pre', 5730 ["<div className=\"feature\">\n <h3>title1</h3>\n <p>text</p>\n</div>\n<div className=\"feature\">\n <h3>title2</h3>\n <p>text2</p>\n</div>\n"], 5731 5732 5733 5734 5735 5736 5737 5738 5739 { className: "cm-s-default code bad has-popover", 5740 cat: "bad", 5741 'data-content': "BAD", 5742 'data-original-title': "", 5743 title: "" }], 5744 5745 ['pre', 5746 ["let Feature = props=>\n <div className=\"feature\">\n <h3>{props.title}</h3>\n <p>{props.children}</p>\n </div>;\n<Feature title=\"title1\">text1</Feature>\n<Feature title=\"title2\">text2</Feature>\n"], 5747 5748 5749 5750 5751 5752 5753 5754 { className: "cm-s-default code good has-popover", 5755 cat: "good", 5756 'data-content': "GOOD", 5757 'data-original-title': "", 5758 title: "" }]] 5759 5760 }, 5761 { 5762 id: 'hola-react-jsx', 5763 title: "JSX", 5764 tag: 'h4', 5765 html: [['p', 5766 [" JSX coding convention follows ", 5767 ['a', 5768 ["HTML coding"], 5769 { href: "/dna/html_code" }], ". When switching from JS code to JSX code use 4 chars\n indentation on the first. Rest follow HTML convention of 2\n chars indentation. "]], 5770 5771 5772 5773 5774 5775 ['pre', 5776 ["return <View>\n </View>;\n"], 5777 5778
5779 { className: "cm-s-default code bad has-popover", 5780 cat: "bad", 5781 'data-content': "BAD", 5782 'data-original-title': "", 5783 title: "" }], 5784 5785 ['pre', 5786 ["return <View></View>;\n"], 5787 5788 { className: "cm-s-default code good has-popover", 5789 cat: "good", 5790 'data-content': "GOOD", 5791 'data-original-title': "", 5792 title: "" }], 5793 5794 ['pre', 5795 ["return <View>\n </View>;\n"], 5796 5797 5798 { className: "cm-s-default code good has-popover", 5799 cat: "good", 5800 'data-content': "GOOD", 5801 'data-original-title': "", 5802 title: "" }], 5803 5804 ['pre', 5805 ["return <View>\n <Button/>\n </View>;\n"], 5806 5807 5808 5809 { className: "cm-s-default code good has-popover", 5810 cat: "good", 5811 'data-content': "GOOD", 5812 'data-original-title': "", 5813 title: "" }], 5814 5815 ['pre', 5816 ["return (\n <View>\n <Button/>\n </View>);\n"], 5817 5818 5819 5820 5821 { className: "cm-s-default code bad has-popover", 5822 cat: "bad", 5823 'data-content': "BAD", 5824 'data-original-title': "", 5825 title: "" }], 5826 5827 ['pre', 5828 ["return (\n <View>\n <Button/>\n </View>\n);\n"], 5829 5830 5831 5832 5833 5834 { className: "cm-s-default code good has-popover", 5835 cat: "good", 5836 'data-content': "GOOD", 5837 'data-original-title': "", 5838 title: "" }], 5839 5840 ['pre', 5841 ["return (\n <View>\n {show_panel &&\n <Panel/>}\n </View>)\n);\n"], 5842 5843 5844 5845 5846 5847 5848 { className: "cm-s-default code bad has-popover", 5849 cat: "bad", 5850 'data-content': "BAD", 5851 'data-original-title': "", 5852 title: "" }], 5853 5854 ['pre', 5855 ["return (\n <View>\n {show_panel &&\n <Panel/>}\n </View>\n);\n"], 5856 5857 5858 5859 5860 5861 5862 { className: "cm-s-default code good has-popover", 5863 cat: "good", 5864 'data-content': "GOOD", 5865 'data-original-title': "", 5866 title: "" }]] 5867 5868 }, 5869 { 5870 id: 'hola-react-css', 5871 title: "CSS", 5872 tag: 'h4', 5873 html: [['p', 5874 ["Use ", 5875 ['a', 5876 ["CSS conventions for react"], 5877 { href: "/dna/css_code#react" }]]]] 5878 5879 5880 }, 5881 { 5882 id: 'hola-unittest', 5883 title: "Unittest", 5884 tag: 'h3', 5885 "short": "unittest", 5886 html: [['p', 5887 ["TBD"]]] 5888 5889 }]; 5890 5891 return E; 5892 });})(); 5893//# sourceMappingURL=js_code.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.