{"id":20675089,"url":"https://github.com/kaizhu256/node-swagger-validate-lite","last_synced_at":"2026-04-20T17:03:27.824Z","repository":{"id":57315247,"uuid":"118301693","full_name":"kaizhu256/node-swagger-validate-lite","owner":"kaizhu256","description":"this zero-dependency package will provide a simple cli-tool to validate swagger.json","archived":false,"fork":false,"pushed_at":"2019-02-18T06:50:31.000Z","size":20588,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"beta","last_synced_at":"2025-02-28T10:50:14.240Z","etag":null,"topics":["openapi-validate","swagger-validate"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaizhu256.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-21T03:39:04.000Z","updated_at":"2019-02-18T06:50:36.000Z","dependencies_parsed_at":"2022-09-12T15:01:59.916Z","dependency_job_id":null,"html_url":"https://github.com/kaizhu256/node-swagger-validate-lite","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaizhu256%2Fnode-swagger-validate-lite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaizhu256%2Fnode-swagger-validate-lite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaizhu256%2Fnode-swagger-validate-lite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaizhu256%2Fnode-swagger-validate-lite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaizhu256","download_url":"https://codeload.github.com/kaizhu256/node-swagger-validate-lite/tar.gz/refs/heads/beta","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242901815,"owners_count":20204021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["openapi-validate","swagger-validate"],"created_at":"2024-11-16T21:08:29.352Z","updated_at":"2026-04-20T17:03:27.793Z","avatar_url":"https://github.com/kaizhu256.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# swagger-validate-lite\nthis zero-dependency package will provide a simple cli-tool to validate swagger.json\n\n# live web demo\n- [https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/app](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/app)\n\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/app)\n\n\n\n[![travis-ci.org build-status](https://api.travis-ci.org/kaizhu256/node-swagger-validate-lite.svg)](https://travis-ci.org/kaizhu256/node-swagger-validate-lite) [![coverage](https://kaizhu256.github.io/node-swagger-validate-lite/build/coverage.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build/coverage.html/index.html)\n\n[![NPM](https://nodei.co/npm/swagger-validate-lite.png?downloads=true)](https://www.npmjs.com/package/swagger-validate-lite)\n\n[![build commit status](https://kaizhu256.github.io/node-swagger-validate-lite/build/build.badge.svg)](https://travis-ci.org/kaizhu256/node-swagger-validate-lite)\n\n| git-branch : | [master](https://github.com/kaizhu256/node-swagger-validate-lite/tree/master) | [beta](https://github.com/kaizhu256/node-swagger-validate-lite/tree/beta) | [alpha](https://github.com/kaizhu256/node-swagger-validate-lite/tree/alpha)|\n|--:|:--|:--|:--|\n| test-server-github : | [![github.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build..master..travis-ci.org/app) | [![github.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/app) | [![github.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/GitHub-Mark-32px.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build..alpha..travis-ci.org/app)|\n| test-server-heroku : | [![heroku.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/heroku-logo.75x25.png)](https://h1-swagger-validate-master.herokuapp.com) | [![heroku.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/heroku-logo.75x25.png)](https://h1-swagger-validate-beta.herokuapp.com) | [![heroku.com test-server](https://kaizhu256.github.io/node-swagger-validate-lite/heroku-logo.75x25.png)](https://h1-swagger-validate-alpha.herokuapp.com)|\n| test-report : | [![test-report](https://kaizhu256.github.io/node-swagger-validate-lite/build..master..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..master..travis-ci.org/test-report.html) | [![test-report](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/test-report.html) | [![test-report](https://kaizhu256.github.io/node-swagger-validate-lite/build..alpha..travis-ci.org/test-report.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..alpha..travis-ci.org/test-report.html)|\n| coverage : | [![coverage](https://kaizhu256.github.io/node-swagger-validate-lite/build..master..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..master..travis-ci.org/coverage.html/index.html) | [![coverage](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/coverage.html/index.html) | [![coverage](https://kaizhu256.github.io/node-swagger-validate-lite/build..alpha..travis-ci.org/coverage.badge.svg)](https://kaizhu256.github.io/node-swagger-validate-lite/build..alpha..travis-ci.org/coverage.html/index.html)|\n| build-artifacts : | [![build-artifacts](https://kaizhu256.github.io/node-swagger-validate-lite/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-swagger-validate-lite/tree/gh-pages/build..master..travis-ci.org) | [![build-artifacts](https://kaizhu256.github.io/node-swagger-validate-lite/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-swagger-validate-lite/tree/gh-pages/build..beta..travis-ci.org) | [![build-artifacts](https://kaizhu256.github.io/node-swagger-validate-lite/glyphicons_144_folder_open.png)](https://github.com/kaizhu256/node-swagger-validate-lite/tree/gh-pages/build..alpha..travis-ci.org)|\n\n[![npmPackageListing](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.npmPackageListing.svg)](https://github.com/kaizhu256/node-swagger-validate-lite)\n\n![npmPackageDependencyTree](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.npmPackageDependencyTree.svg)\n\n\n\n# table of contents\n1. [cdn download](#cdn-download)\n1. [documentation](#documentation)\n1. [quickstart shell example](#quickstart-shell-example)\n1. [quickstart example.js](#quickstart-examplejs)\n1. [extra screenshots](#extra-screenshots)\n1. [package.json](#packagejson)\n1. [changelog of last 50 commits](#changelog-of-last-50-commits)\n1. [internal build script](#internal-build-script)\n1. [misc](#misc)\n\n\n\n# cdn download\n- none\n\n\n\n# documentation\n#### cli help\n![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.npmPackageCliHelp.svg)\n\n#### api doc\n- [https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/apidoc.html](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/apidoc.html)\n\n[![apidoc](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/apidoc.html)\n\n#### todo\n- none\n\n#### changelog 2019.2.12\n- npm publish 2019.2.12\n- merge env var modeTest and utility2_modeTestRun -\u003e local.global.utility2_modeTest\n- merge function onResetXxx -\u003e utility2_onReadyXxx\n- revamp bootstrap-mechanism before running tests\n- none\n\n#### this package requires\n- darwin or linux os\n\n\n\n# quickstart shell example\n#### to run this example, follow instruction in script below\n- [example.sh](https://kaizhu256.github.io/node-elasticsearch-lite/build..beta..travis-ci.org/example.sh)\n```shell\n# example.sh\n\n# this shell script will swagger-validate http://petstore.swagger.io/v2/swagger.json\n\n# 1. npm install swagger-validate-lite\ncd /tmp \u0026\u0026 npm install swagger-validate-lite\n\n# 2. swagger-validate file /tmp/swagger.json\nshPrintAndEval () {\n    printf \"\\n\\n\\n\"\n    printf \"\\$ $*\\n\\n\"\n    eval \"$@\"\n    return 0\n}\nshPrintAndEval \\\ncurl -o /tmp/swagger.json http://petstore.swagger.io/v2/swagger.json\nshPrintAndEval \\\n/tmp/node_modules/.bin/swagger-validate-lite /tmp/swagger.json\n\n# 3. swagger-validate file /tmp/swagger.json with error\nshPrintAndEval \\\nsed -in 's|\"integer\"|\"undefined\"|' /tmp/swagger.json\nshPrintAndEval \\\n/tmp/node_modules/.bin/swagger-validate-lite /tmp/swagger.json\n\n# 4. swagger-validate url http://petstore.swagger.io/v2/swagger.json\nshPrintAndEval \\\n/tmp/node_modules/.bin/swagger-validate-lite http://petstore.swagger.io/v2/swagger.json\n```\n\n#### output from shell\n![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.testExampleSh.svg)\n\n\n\n# quickstart example.js\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.testExampleJs.browser.%252F.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/app/assets.example.html)\n\n#### to run this example, follow instruction in script below\n- [example.js](https://kaizhu256.github.io/node-swagger-validate-lite/build..beta..travis-ci.org/example.js)\n```javascript\n/*\nexample.js\n\nthis script will run a web-demo of swagger-validate-lite\n\ninstruction\n    1. save this script as example.js\n    2. run shell-command:\n        $ npm install swagger-validate-lite \u0026\u0026 PORT=8081 node example.js\n    3. open a browser to http://127.0.0.1:8081 and play with web-demo\n    4. edit this script to suit your needs\n*/\n\n\n\n/* istanbul instrument in package swagger_validate */\n/* istanbul ignore next */\n/* jslint utility2:true */\n(function (globalThis) {\n    \"use strict\";\n    var consoleError;\n    var local;\n    // init globalThis\n    (function () {\n        try {\n            globalThis = Function(\"return this\")(); // jslint ignore:line\n        } catch (ignore) {}\n    }());\n    globalThis.globalThis = globalThis;\n    // init debug_inline\n    if (!globalThis[\"debug\\u0049nline\"]) {\n        consoleError = console.error;\n        globalThis[\"debug\\u0049nline\"] = function () {\n        /*\n         * this function will both print \u003carguments\u003e to stderr\n         * and return \u003carguments\u003e[0]\n         */\n            var argList;\n            argList = Array.from(arguments); // jslint ignore:line\n            // debug arguments\n            globalThis[\"debug\\u0049nlineArguments\"] = argList;\n            consoleError(\"\\n\\ndebug\\u0049nline\");\n            consoleError.apply(console, argList);\n            consoleError(\"\\n\");\n            // return arg0 for inspection\n            return argList[0];\n        };\n    }\n    // init local\n    local = {};\n    local.local = local;\n    globalThis.globalLocal = local;\n    // init isBrowser\n    local.isBrowser = (\n        typeof window === \"object\"\n        \u0026\u0026 window === globalThis\n        \u0026\u0026 typeof window.XMLHttpRequest === \"function\"\n        \u0026\u0026 window.document\n        \u0026\u0026 typeof window.document.querySelector === \"function\"\n    );\n    // init function\n    local.assertThrow = function (passed, message) {\n    /*\n     * this function will throw error \u003cmessage\u003e if \u003cpassed\u003e is falsy\n     */\n        var error;\n        if (passed) {\n            return;\n        }\n        error = (\n            // ternary-condition\n            (\n                message\n                \u0026\u0026 typeof message.message === \"string\"\n                \u0026\u0026 typeof message.stack === \"string\"\n            )\n            // if message is an error-object, then leave it as is\n            ? message\n            : new Error(\n                typeof message === \"string\"\n                // if message is a string, then leave it as is\n                ? message\n                // else JSON.stringify message\n                : JSON.stringify(message, null, 4)\n            )\n        );\n        throw error;\n    };\n    local.functionOrNop = function (fnc) {\n    /*\n     * this function will if \u003cfnc\u003e exists,\n     * them return \u003cfnc\u003e,\n     * else return \u003cnop\u003e\n     */\n        return fnc || local.nop;\n    };\n    local.identity = function (value) {\n    /*\n     * this function will return \u003cvalue\u003e\n     */\n        return value;\n    };\n    local.nop = function () {\n    /*\n     * this function will do nothing\n     */\n        return;\n    };\n    local.objectAssignDefault = function (target, source) {\n    /*\n     * this function will if items from \u003ctarget\u003e are\n     * null, undefined, or empty-string,\n     * then overwrite them with items from \u003csource\u003e\n     */\n        Object.keys(source).forEach(function (key) {\n            if (\n                target[key] === null\n                || target[key] === undefined\n                || target[key] === \"\"\n            ) {\n                target[key] = target[key] || source[key];\n            }\n        });\n        return target;\n    };\n    // require builtin\n    if (!local.isBrowser) {\n        local.assert = require(\"assert\");\n        local.buffer = require(\"buffer\");\n        local.child_process = require(\"child_process\");\n        local.cluster = require(\"cluster\");\n        local.crypto = require(\"crypto\");\n        local.dgram = require(\"dgram\");\n        local.dns = require(\"dns\");\n        local.domain = require(\"domain\");\n        local.events = require(\"events\");\n        local.fs = require(\"fs\");\n        local.http = require(\"http\");\n        local.https = require(\"https\");\n        local.net = require(\"net\");\n        local.os = require(\"os\");\n        local.path = require(\"path\");\n        local.querystring = require(\"querystring\");\n        local.readline = require(\"readline\");\n        local.repl = require(\"repl\");\n        local.stream = require(\"stream\");\n        local.string_decoder = require(\"string_decoder\");\n        local.timers = require(\"timers\");\n        local.tls = require(\"tls\");\n        local.tty = require(\"tty\");\n        local.url = require(\"url\");\n        local.util = require(\"util\");\n        local.vm = require(\"vm\");\n        local.zlib = require(\"zlib\");\n    }\n}(this));\n\n\n\n(function (local) {\n\"use strict\";\n\n\n\n// run shared js-env code - init-before\n(function () {\n// init local\nlocal = (\n    globalThis.utility2_rollup\n    || globalThis.utility2_swagger_validate\n    || require(\"swagger-validate-lite\")\n);\n// init exports\nglobalThis.local = local;\n}());\n\n\n\n/* istanbul ignore next */\n// run browser js-env code - init-test\n(function () {\nif (!local.isBrowser) {\n    return;\n}\n// log stderr and stdout to #outputStdout1\n[\"error\", \"log\"].forEach(function (key) {\n    var argList;\n    var element;\n    var fnc;\n    element = document.querySelector(\n        \"#outputStdout1\"\n    );\n    if (!element) {\n        return;\n    }\n    fnc = console[key];\n    console[key] = function () {\n        argList = Array.from(arguments); // jslint ignore:line\n        fnc.apply(console, argList);\n        // append text to #outputStdout1\n        element.textContent += argList.map(function (arg) {\n            return (\n                typeof arg === \"string\"\n                ? arg\n                : JSON.stringify(arg, null, 4)\n            );\n        }).join(\" \").replace((\n            /\\u001b\\[\\d*m/g\n        ), \"\") + \"\\n\";\n        // scroll textarea to bottom\n        element.scrollTop = element.scrollHeight;\n    };\n});\nObject.assign(local, globalThis.domOnEventDelegateDict);\nglobalThis.domOnEventDelegateDict = local;\nlocal.onEventDomDb = (\n    local.db \u0026\u0026 local.db.onEventDomDb\n);\nlocal.testRunBrowser = function (event) {\n/*\n * this function will run browser-tests\n */\n    switch (\n        !event.ctrlKey\n        \u0026\u0026 !event.metaKey\n        \u0026\u0026 (\n            event.modeInit\n            || (event.type + \".\" + (event.target \u0026\u0026 event.target.id))\n        )\n    ) {\n    // custom-case\n    case \"click.inputTextarea1\":\n    case \"keydown.inputTextarea1\":\n    case true:\n        // validate #inputTextarea1\n        document.querySelector(\n            \"#outputStdout1\"\n        ).value = \"\";\n        local.swagger_validate.swaggerValidateFile({\n            data: document.querySelector(\n                \"#inputTextarea1\"\n            ).value,\n            file: \"inputTextarea1.json\"\n        }, function (err) {\n            document.querySelector(\n                \"#outputStdout1\"\n            ).style.color = (\n                err\n                ? \"#d00\"\n                : \"#070\"\n            );\n        });\n        break;\n    // run browser-tests\n    default:\n        if (\n            (event.target \u0026\u0026 event.target.id) !== \"testRunButton1\"\n            \u0026\u0026 !(event.modeInit \u0026\u0026 (\n                /\\bmodeTest=1\\b/\n            ).test(location.search))\n        ) {\n            return;\n        }\n        // show browser-tests\n        if (document.querySelector(\n            \"#testReportDiv1\"\n        ).style.maxHeight === \"0px\") {\n            local.uiAnimateSlideDown(document.querySelector(\n                \"#testReportDiv1\"\n            ));\n            document.querySelector(\n                \"#testRunButton1\"\n            ).textContent = \"hide internal test\";\n            local.modeTest = 1;\n            local.testRunDefault(local);\n            return;\n        }\n        // hide browser-tests\n        local.uiAnimateSlideUp(document.querySelector(\n            \"#testReportDiv1\"\n        ));\n        document.querySelector(\n            \"#testRunButton1\"\n        ).textContent = \"run internal test\";\n    }\n};\n\nlocal.testRunBrowser({\n    modeInit: true\n});\n}());\n\n\n\n/* istanbul ignore next */\n// run node js-env code - init-test\n(function () {\nif (local.isBrowser) {\n    return;\n}\n// init exports\nmodule.exports = local;\n/* validateLineSortedReset */\n// init assets\nlocal.assetsDict = local.assetsDict || {};\n[\n    \"assets.index.template.html\",\n    \"assets.swgg.swagger.json\",\n    \"assets.swgg.swagger.server.json\"\n].forEach(function (file) {\n    file = \"/\" + file;\n    local.assetsDict[file] = local.assetsDict[file] || \"\";\n    if (local.fs.existsSync(local.__dirname + file)) {\n        local.assetsDict[file] = local.fs.readFileSync(\n            local.__dirname + file,\n            \"utf8\"\n        );\n    }\n});\n/* jslint ignore:start */\nlocal.assetsDict[\"/assets.index.template.html\"] = '\\\n\u003c!doctype html\u003e\\n\\\n\u003chtml lang=\"en\"\u003e\\n\\\n\u003chead\u003e\\n\\\n\u003cmeta charset=\"utf-8\"\u003e\\n\\\n\u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\\n\\\n\u003c!-- \"assets.utility2.template.html\" --\u003e\\n\\\n\u003ctitle\u003e{{env.npm_package_name}} ({{env.npm_package_version}})\u003c/title\u003e\\n\\\n\u003cstyle\u003e\\n\\\n/* jslint utility2:true */\\n\\\n/*csslint\\n\\\n*/\\n\\\n/* csslint ignore:start */\\n\\\n*,\\n\\\n*:after,\\n\\\n*:before {\\n\\\n    box-sizing: border-box;\\n\\\n}\\n\\\n/* csslint ignore:end */\\n\\\n@keyframes uiAnimateShake {\\n\\\n    0%, 50% {\\n\\\n        transform: translateX(10px);\\n\\\n    }\\n\\\n    25%, 75% {\\n\\\n        transform: translateX(-10px);\\n\\\n    }\\n\\\n    100% {\\n\\\n        transform: translateX(0);\\n\\\n    }\\n\\\n}\\n\\\n@keyframes uiAnimateSpin {\\n\\\n    0% {\\n\\\n        transform: rotate(0deg);\\n\\\n    }\\n\\\n    100% {\\n\\\n        transform: rotate(360deg);\\n\\\n    }\\n\\\n}\\n\\\na {\\n\\\n    overflow-wrap: break-word;\\n\\\n}\\n\\\nbody {\\n\\\n    background: #eef;\\n\\\n    font-family: Arial, Helvetica, sans-serif;\\n\\\n    font-size: small;\\n\\\n    margin: 0 40px;\\n\\\n}\\n\\\nbody \u003e div,\\n\\\nbody \u003e form \u003e div,\\n\\\nbody \u003e form \u003e input,\\n\\\nbody \u003e form \u003e pre,\\n\\\nbody \u003e form \u003e .button,\\n\\\nbody \u003e form \u003e .textarea,\\n\\\nbody \u003e input,\\n\\\nbody \u003e pre,\\n\\\nbody \u003e .button,\\n\\\nbody \u003e .textarea {\\n\\\n    margin-bottom: 20px;\\n\\\n    margin-top: 0;\\n\\\n}\\n\\\nbody \u003e form \u003e input,\\n\\\nbody \u003e form \u003e .button,\\n\\\nbody \u003e input,\\n\\\nbody \u003e .button {\\n\\\n    width: 20rem;\\n\\\n}\\n\\\nbody \u003e form \u003e .textarea,\\n\\\nbody \u003e .textarea {\\n\\\n    height: 10rem;\\n\\\n    width: 100%;\\n\\\n}\\n\\\nbody \u003e .readonly {\\n\\\n    background: #ddd;\\n\\\n}\\n\\\ncode,\\n\\\npre,\\n\\\n.textarea {\\n\\\n    font-family: Consolas, Menlo, monospace;\\n\\\n    font-size: smaller;\\n\\\n}\\n\\\npre {\\n\\\n    overflow-wrap: break-word;\\n\\\n    white-space: pre-wrap;\\n\\\n}\\n\\\n.button {\\n\\\n    background-color: #fff;\\n\\\n    border: 1px solid;\\n\\\n    border-bottom-color: rgb(186, 186, 186);\\n\\\n    border-left-color: rgb(209, 209, 209);\\n\\\n    border-radius: 4px;\\n\\\n    border-right-color: rgb(209, 209, 209);\\n\\\n    border-top-color: rgb(216, 216, 216);\\n\\\n    color: #00d;\\n\\\n    cursor: pointer;\\n\\\n    display: inline-block;\\n\\\n    font-family: Arial, Helvetica, sans-serif;\\n\\\n    font-size: 12px;\\n\\\n    font-style: normal;\\n\\\n    font-weight: normal;\\n\\\n    margin: 0;\\n\\\n    padding: 2px 7px 3px 7px;\\n\\\n    text-align: center;\\n\\\n    text-decoration: underline;\\n\\\n}\\n\\\n.colorError {\\n\\\n    color: #d00;\\n\\\n}\\n\\\n.textarea {\\n\\\n    background: #fff;\\n\\\n    border: 1px solid #999;\\n\\\n    border-radius: 0;\\n\\\n    cursor: auto;\\n\\\n    overflow: auto;\\n\\\n    padding: 2px;\\n\\\n}\\n\\\n.uiAnimateShake {\\n\\\n    animation-duration: 500ms;\\n\\\n    animation-name: uiAnimateShake;\\n\\\n}\\n\\\n.uiAnimateSlide {\\n\\\n    overflow-y: hidden;\\n\\\n    transition: max-height ease-in 250ms, min-height ease-in 250ms, padding-bottom ease-in 250ms, padding-top ease-in 250ms;\\n\\\n}\\n\\\n.utility2FooterDiv {\\n\\\n    text-align: center;\\n\\\n}\\n\\\n.zeroPixel {\\n\\\n    border: 0;\\n\\\n    height: 0;\\n\\\n    margin: 0;\\n\\\n    padding: 0;\\n\\\n    width: 0;\\n\\\n}\\n\\\n\u003c/style\u003e\\n\\\n\u003c/head\u003e\\n\\\n\u003cbody\u003e\\n\\\n\u003cdiv id=\"ajaxProgressDiv1\" style=\"background: #d00; height: 2px; left: 0; margin: 0; padding: 0; position: fixed; top: 0; transition: background 500ms, width 1500ms; width: 0%; z-index: 1;\"\u003e\u003c/div\u003e\\n\\\n\u003cdiv class=\"uiAnimateSpin\" style=\"animation: uiAnimateSpin 2s linear infinite; border: 5px solid #999; border-radius: 50%; border-top: 5px solid #7d7; display: none; height: 25px; vertical-align: middle; width: 25px;\"\u003e\u003c/div\u003e\\n\\\n\u003ca class=\"zeroPixel\" download=\"db.persistence.json\" href=\"\" id=\"dbExportA1\"\u003e\u003c/a\u003e\\n\\\n\u003cinput class=\"zeroPixel\" data-onevent=\"onEventDomDb\" data-onevent-db=\"dbImportInput\" type=\"file\"\u003e\\n\\\n\u003cscript\u003e\\n\\\n/* jslint utility2:true */\\n\\\n// init domOnEventWindowOnloadTimeElapsed\\n\\\n(function () {\\n\\\n/*\\n\\\n * this function will measure and print time-elapsed for window.onload\\n\\\n */\\n\\\n    \"use strict\";\\n\\\n    if (window.domOnEventWindowOnloadTimeElapsed) {\\n\\\n        return;\\n\\\n    }\\n\\\n    window.domOnEventWindowOnloadTimeElapsed = Date.now() + 100;\\n\\\n    window.addEventListener(\"load\", function () {\\n\\\n        setTimeout(function () {\\n\\\n            window.domOnEventWindowOnloadTimeElapsed = (\\n\\\n                Date.now()\\n\\\n                - window.domOnEventWindowOnloadTimeElapsed\\n\\\n            );\\n\\\n            console.error(\\n\\\n                \"domOnEventWindowOnloadTimeElapsed = \"\\n\\\n                + window.domOnEventWindowOnloadTimeElapsed\\n\\\n            );\\n\\\n        }, 100);\\n\\\n    });\\n\\\n}());\\n\\\n\\n\\\n\\n\\\n\\n\\\n// init domOnEventDelegateDict\\n\\\n(function () {\\n\\\n/*\\n\\\n * this function will handle delegated dom-event\\n\\\n * example usage:\\n\\\n */\\n\\\n    \"use strict\";\\n\\\n    var timerTimeoutDict;\\n\\\n    if (window.domOnEventDelegateDict) {\\n\\\n        return;\\n\\\n    }\\n\\\n    window.domOnEventDelegateDict = {};\\n\\\n    timerTimeoutDict = {};\\n\\\n    window.domOnEventDelegateDict.domOnEventDelegate = function (event) {\\n\\\n        event.targetOnEvent = event.target.closest(\\n\\\n            \"[data-onevent]\"\\n\\\n        );\\n\\\n        if (\\n\\\n            !event.targetOnEvent\\n\\\n            || event.targetOnEvent.dataset.onevent === \"domOnEventNop\"\\n\\\n            || event.target.closest(\\n\\\n                \".disabled, .readonly\"\\n\\\n            )\\n\\\n        ) {\\n\\\n            return;\\n\\\n        }\\n\\\n        // rate-limit high-frequency-event\\n\\\n        switch (event.type) {\\n\\\n        case \"keydown\":\\n\\\n        case \"keyup\":\\n\\\n            // filter non-input keyboard-event\\n\\\n            if (!event.target.closest(\\n\\\n                \"input, option, select, textarea\"\\n\\\n            )) {\\n\\\n                return;\\n\\\n            }\\n\\\n            if (timerTimeoutDict[event.type] !== true) {\\n\\\n                timerTimeoutDict[event.type] = (\\n\\\n                    timerTimeoutDict[event.type]\\n\\\n                    || setTimeout(function () {\\n\\\n                        timerTimeoutDict[event.type] = true;\\n\\\n                        window.domOnEventDelegateDict.domOnEventDelegate(\\n\\\n                            event\\n\\\n                        );\\n\\\n                    }, 50)\\n\\\n                );\\n\\\n                return;\\n\\\n            }\\n\\\n            timerTimeoutDict[event.type] = null;\\n\\\n            break;\\n\\\n        }\\n\\\n        switch (event.targetOnEvent.tagName) {\\n\\\n        case \"BUTTON\":\\n\\\n        case \"FORM\":\\n\\\n            event.preventDefault();\\n\\\n            break;\\n\\\n        }\\n\\\n        // reset output\\n\\\n        if (\\n\\\n            !event.ctrlKey\\n\\\n            \u0026\u0026 !event.metaKey\\n\\\n            \u0026\u0026 event.targetOnEvent.dataset.oneventResetOutput\\n\\\n        ) {\\n\\\n            Array.from(document.querySelectorAll(\\n\\\n                \".onevent-reset-output\"\\n\\\n            )).forEach(function (element) {\\n\\\n                switch (element.tagName) {\\n\\\n                case \"INPUT\":\\n\\\n                case \"TEXTAREA\":\\n\\\n                    element.value = \"\";\\n\\\n                    break;\\n\\\n                case \"PRE\":\\n\\\n                    element.textContent = \"\";\\n\\\n                    break;\\n\\\n                default:\\n\\\n                    element.innerHTML = \"\";\\n\\\n                }\\n\\\n            });\\n\\\n        }\\n\\\n        event.stopPropagation();\\n\\\n        window.domOnEventDelegateDict[event.targetOnEvent.dataset.onevent](\\n\\\n            event\\n\\\n        );\\n\\\n    };\\n\\\n    // init event-handling\\n\\\n    [\\n\\\n        \"change\",\\n\\\n        \"click\",\\n\\\n        \"keydown\",\\n\\\n        \"submit\"\\n\\\n    ].forEach(function (eventType) {\\n\\\n        document.addEventListener(\\n\\\n            eventType,\\n\\\n            window.domOnEventDelegateDict.domOnEventDelegate\\n\\\n        );\\n\\\n    });\\n\\\n}());\\n\\\n\\n\\\n\\n\\\n\\n\\\n// init timerIntervalAjaxProgressUpdate\\n\\\n(function () {\\n\\\n/*\\n\\\n * this function will increment ajax-progress-bar\\n\\\n * until webpage has loaded\\n\\\n */\\n\\\n    \"use strict\";\\n\\\n    var ajaxProgressDiv1;\\n\\\n    var ajaxProgressState;\\n\\\n    var ajaxProgressUpdate;\\n\\\n    if (\\n\\\n        window.timerIntervalAjaxProgressUpdate\\n\\\n        || !document.querySelector(\\n\\\n            \"#ajaxProgressDiv1\"\\n\\\n        )\\n\\\n    ) {\\n\\\n        return;\\n\\\n    }\\n\\\n    ajaxProgressDiv1 = document.querySelector(\\n\\\n        \"#ajaxProgressDiv1\"\\n\\\n    );\\n\\\n    setTimeout(function () {\\n\\\n        ajaxProgressDiv1.style.width = \"25%\";\\n\\\n    });\\n\\\n    ajaxProgressState = 0;\\n\\\n    ajaxProgressUpdate = (\\n\\\n        window.local\\n\\\n        \u0026\u0026 window.local.ajaxProgressUpdate\\n\\\n    ) || function () {\\n\\\n        ajaxProgressDiv1.style.width = \"100%\";\\n\\\n        setTimeout(function () {\\n\\\n            ajaxProgressDiv1.style.background = \"transparent\";\\n\\\n            setTimeout(function () {\\n\\\n                ajaxProgressDiv1.style.width = \"0%\";\\n\\\n            }, 500);\\n\\\n        }, 1000);\\n\\\n    };\\n\\\n    window.timerIntervalAjaxProgressUpdate = setInterval(function () {\\n\\\n        ajaxProgressState += 1;\\n\\\n        ajaxProgressDiv1.style.width = Math.max(\\n\\\n            100 - 75 * Math.exp(-0.125 * ajaxProgressState),\\n\\\n            ajaxProgressDiv1.style.width.slice(0, -1) | 0\\n\\\n        ) + \"%\";\\n\\\n    }, 1000);\\n\\\n    window.addEventListener(\"load\", function () {\\n\\\n        clearInterval(window.timerIntervalAjaxProgressUpdate);\\n\\\n        ajaxProgressUpdate();\\n\\\n    });\\n\\\n}());\\n\\\n\\n\\\n\\n\\\n\\n\\\n// init domOnEventSelectAllWithinPre\\n\\\n(function () {\\n\\\n/*\\n\\\n * this function will limit select-all within \u003cpre tabIndex=\"0\"\u003e elements\\n\\\n * https://stackoverflow.com/questions/985272/selecting-text-in-an-element-akin-to-highlighting-with-your-mouse\\n\\\n */\\n\\\n    \"use strict\";\\n\\\n    if (window.domOnEventSelectAllWithinPre) {\\n\\\n        return;\\n\\\n    }\\n\\\n    window.domOnEventSelectAllWithinPre = function (event) {\\n\\\n        var range;\\n\\\n        var selection;\\n\\\n        if (\\n\\\n            event\\n\\\n            \u0026\u0026 event.key === \"a\"\\n\\\n            \u0026\u0026 (event.ctrlKey || event.metaKey)\\n\\\n            \u0026\u0026 event.target.closest(\\n\\\n                \"pre\"\\n\\\n            )\\n\\\n        ) {\\n\\\n            range = document.createRange();\\n\\\n            range.selectNodeContents(event.target.closest(\\n\\\n                \"pre\"\\n\\\n            ));\\n\\\n            selection = window.getSelection();\\n\\\n            selection.removeAllRanges();\\n\\\n            selection.addRange(range);\\n\\\n            event.preventDefault();\\n\\\n        }\\n\\\n    };\\n\\\n    // init event-handling\\n\\\n    document.addEventListener(\\n\\\n        \"keydown\",\\n\\\n        window.domOnEventSelectAllWithinPre\\n\\\n    );\\n\\\n}());\\n\\\n\u003c/script\u003e\\n\\\n\u003ch1\u003e\\n\\\n\u003c!-- utility2-comment\\n\\\n    \u003ca\\n\\\n        {{#if env.npm_package_homepage}}\\n\\\n        href=\"{{env.npm_package_homepage}}\"\\n\\\n        {{/if env.npm_package_homepage}}\\n\\\n        target=\"_blank\"\\n\\\n    \u003e\\n\\\nutility2-comment --\u003e\\n\\\n        {{env.npm_package_name}} ({{env.npm_package_version}})\\n\\\n\u003c!-- utility2-comment\\n\\\n    \u003c/a\u003e\\n\\\nutility2-comment --\u003e\\n\\\n\u003c/h1\u003e\\n\\\n\u003ch3\u003e{{env.npm_package_description}}\u003c/h3\u003e\\n\\\n\u003c!-- utility2-comment\\n\\\n\u003ca class=\"button\" download href=\"assets.app.js\"\u003edownload standalone app\u003c/a\u003e\u003cbr\u003e\\n\\\n\u003cbutton class=\"button\" data-onevent=\"testRunBrowser\" data-onevent-reset-output=\"1\" id=\"testRunButton1\"\u003erun internal test\u003c/button\u003e\u003cbr\u003e\\n\\\n\u003cdiv class=\"uiAnimateSlide\" id=\"testReportDiv1\" style=\"border-bottom: 0; border-top: 0; margin-bottom: 0; margin-top: 0; max-height: 0; padding-bottom: 0; padding-top: 0;\"\u003e\u003c/div\u003e\\n\\\nutility2-comment --\u003e\\n\\\n\\n\\\n\\n\\\n\\n\\\n\u003clabel\u003eedit or paste swagger.json data below to validate\u003c/label\u003e\\n\\\n\u003ctextarea class=\"textarea\" data-onevent=\"testRunBrowser\" data-onevent-reset-output=\"1\" id=\"inputTextarea1\"\u003e{\\n\\\n    \"swagger\": \"this is an example error\",\\n\\\n    \"info\": {\\n\\\n        \"title\": \"Swagger Petstore\",\\n\\\n        \"version\": \"0.0.1\"\\n\\\n    },\\n\\\n    \"paths\": {\\n\\\n        \"/pet/{petId}\": {\\n\\\n            \"get\": {\\n\\\n                \"operationId\": \"getPetById\",\\n\\\n                \"parameters\": [\\n\\\n                    {\\n\\\n                        \"name\": \"petId\",\\n\\\n                        \"in\": \"path\",\\n\\\n                        \"description\": \"ID of pet to return\",\\n\\\n                        \"required\": true,\\n\\\n                        \"type\": \"integer\",\\n\\\n                        \"format\": \"int64\"\\n\\\n                    }\\n\\\n                ],\\n\\\n                \"responses\": {\\n\\\n                    \"200\": {\\n\\\n                        \"description\": \"successful operation\"\\n\\\n                    }\\n\\\n                },\\n\\\n                \"tags\": [\\n\\\n                    \"pet\"\\n\\\n                ]\\n\\\n            }\\n\\\n        }\\n\\\n    },\\n\\\n    \"tags\": [\\n\\\n        {\\n\\\n            \"name\": \"pet\"\\n\\\n        }\\n\\\n    ]\\n\\\n}\u003c/textarea\u003e\\n\\\n\u003clabel\u003estderr and stdout\u003c/label\u003e\\n\\\n\u003cpre class=\"onevent-reset-output readonly textarea\" id=\"outputStdout1\" tabIndex=\"0\"\u003e\u003c/pre\u003e\\n\\\n\u003c!-- utility2-comment\\n\\\n{{#if isRollup}}\\n\\\n\u003cscript src=\"assets.app.js\"\u003e\u003c/script\u003e\\n\\\n{{#unless isRollup}}\\n\\\nutility2-comment --\u003e\\n\\\n\u003cscript src=\"assets.utility2.rollup.js\"\u003e\u003c/script\u003e\\n\\\n\u003cscript\u003ewindow.utility2_onReadyBefore.counter += 1;\u003c/script\u003e\\n\\\n\u003cscript src=\"jsonp.utility2.stateInit?callback=window.utility2.stateInit\"\u003e\u003c/script\u003e\\n\\\n\u003cscript src=\"assets.swagger_validate.js\"\u003e\u003c/script\u003e\\n\\\n\u003cscript src=\"assets.example.js\"\u003e\u003c/script\u003e\\n\\\n\u003cscript src=\"assets.test.js\"\u003e\u003c/script\u003e\\n\\\n\u003cscript\u003ewindow.utility2_onReadyBefore();\u003c/script\u003e\\n\\\n\u003c!-- utility2-comment\\n\\\n{{/if isRollup}}\\n\\\nutility2-comment --\u003e\\n\\\n\u003cdiv class=\"utility2FooterDiv\"\u003e\\n\\\n    [ this app was created with\\n\\\n    \u003ca href=\"https://github.com/kaizhu256/node-utility2\" target=\"_blank\"\u003eutility2\u003c/a\u003e\\n\\\n    ]\\n\\\n\u003c/div\u003e\\n\\\n\u003c/body\u003e\\n\\\n\u003c/html\u003e\\n\\\n';\n/* jslint ignore:end */\n/* validateLineSortedReset */\n/* jslint ignore:start */\nlocal.assetsDict[\"/assets.swagger_validate.js\"] =\n    local.assetsDict[\"/assets.swagger_validate.js\"] ||\n    local.fs.readFileSync(local.__dirname + \"/lib.swagger_validate.js\", \"utf8\"\n).replace((/^#!\\//), \"// \");\n/* jslint ignore:end */\n/* validateLineSortedReset */\nlocal.assetsDict[\"/\"] = local.assetsDict[\"/assets.index.template.html\"]\n.replace((\n    /\\{\\{env\\.(\\w+?)\\}\\}/g\n), function (match0, match1) {\n    switch (match1) {\n    case \"npm_package_description\":\n        return \"the greatest app in the world!\";\n    case \"npm_package_name\":\n        return \"swagger-validate-lite\";\n    case \"npm_package_nameLib\":\n        return \"swagger_validate\";\n    case \"npm_package_version\":\n        return \"0.0.1\";\n    default:\n        return match0;\n    }\n});\nlocal.assetsDict[\"/assets.example.html\"] = local.assetsDict[\"/\"];\nlocal.assetsDict[\"/index.html\"] = local.assetsDict[\"/\"];\n// init cli\nif (module !== require.main || globalThis.utility2_rollup) {\n    return;\n}\n/* validateLineSortedReset */\nlocal.assetsDict[\"/assets.example.js\"] = (\n    local.assetsDict[\"/assets.example.js\"]\n    || local.fs.readFileSync(__filename, \"utf8\")\n);\nlocal.assetsDict[\"/favicon.ico\"] = local.assetsDict[\"/favicon.ico\"] || \"\";\n// if $npm_config_timeout_exit exists,\n// then exit this process after $npm_config_timeout_exit ms\nif (Number(process.env.npm_config_timeout_exit)) {\n    setTimeout(process.exit, Number(process.env.npm_config_timeout_exit));\n}\n// start server\nif (globalThis.utility2_serverHttp1) {\n    return;\n}\nprocess.env.PORT = process.env.PORT || \"8081\";\nconsole.error(\"http-server listening on port \" + process.env.PORT);\nlocal.http.createServer(function (request, response) {\n    request.urlParsed = local.url.parse(request.url);\n    if (local.assetsDict[request.urlParsed.pathname] !== undefined) {\n        response.end(local.assetsDict[request.urlParsed.pathname]);\n        return;\n    }\n    response.statusCode = 404;\n    response.end();\n}).listen(process.env.PORT);\n}());\n\n\n\n}());\n```\n\n#### output from browser\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.testExampleJs.browser.%252F.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/app/assets.example.html)\n\n#### output from shell\n![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.testExampleJs.svg)\n\n\n\n# extra screenshots\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fapidoc.html.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fcoverage.lib.html.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fcoverage.lib.html.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fcoverage.lib.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Fcoverage.lib.html.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Ftest-report.html.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Ftest-report.html.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Ftest-report.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.buildCi.browser.%252Ftmp%252Fbuild%252Ftest-report.html.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp%252Fassets.swgg.html.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp%252Fassets.swgg.html.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp%252Fassets.swgg.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp%252Fassets.swgg.html.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithub.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithubTest.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithubTest.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithubTest.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployGithubTest.browser.%252Fnode-swagger-validate-lite%252Fbuild%252Fapp.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252Fassets.swgg.html.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252Fassets.swgg.html.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252Fassets.swgg.html.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252Fassets.swgg.html.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252F.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252F.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252F.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHeroku.browser.%252F.png)\n\n1. [https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHerokuTest.browser.%252F.png](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHerokuTest.browser.%252F.png)\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHerokuTest.browser.%252F.png)](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.deployHerokuTest.browser.%252F.png)\n\n\n\n# package.json\n```json\n{\n    \"author\": \"kai zhu \u003ckaizhu256@gmail.com\u003e\",\n    \"bin\": {\n        \"swagger-validate-lite\": \"lib.swagger_validate.js\"\n    },\n    \"description\": \"this zero-dependency package will provide a simple cli-tool to validate swagger.json\",\n    \"devDependencies\": {\n        \"electron-lite\": \"kaizhu256/node-electron-lite#alpha\",\n        \"utility2\": \"kaizhu256/node-utility2#alpha\"\n    },\n    \"engines\": {\n        \"node\": \"\u003e=10.0\"\n    },\n    \"homepage\": \"https://github.com/kaizhu256/node-swagger-validate-lite\",\n    \"keywords\": [\n        \"openapi-validate\",\n        \"swagger-validate\"\n    ],\n    \"license\": \"MIT\",\n    \"main\": \"lib.swagger_validate.js\",\n    \"name\": \"swagger-validate-lite\",\n    \"nameAliasPublish\": \"openapi-validate swagger-validator-lite\",\n    \"nameLib\": \"swagger_validate\",\n    \"nameOriginal\": \"swagger-validate-lite\",\n    \"os\": [\n        \"darwin\",\n        \"linux\"\n    ],\n    \"repository\": {\n        \"type\": \"git\",\n        \"url\": \"https://github.com/kaizhu256/node-swagger-validate-lite.git\"\n    },\n    \"scripts\": {\n        \"build-ci\": \"./npm_scripts.sh\",\n        \"env\": \"env\",\n        \"eval\": \"./npm_scripts.sh\",\n        \"heroku-postbuild\": \"./npm_scripts.sh\",\n        \"postinstall\": \"./npm_scripts.sh\",\n        \"start\": \"./npm_scripts.sh\",\n        \"test\": \"./npm_scripts.sh\",\n        \"utility2\": \"./npm_scripts.sh\"\n    },\n    \"version\": \"2019.2.12\"\n}\n```\n\n\n\n# changelog of last 50 commits\n[![screenshot](https://kaizhu256.github.io/node-swagger-validate-lite/build/screenshot.gitLog.svg)](https://github.com/kaizhu256/node-swagger-validate-lite/commits)\n\n\n\n# internal build script\n- build_ci.sh\n```shell\n# build_ci.sh\n\n# this shell script will run the build for this package\n\nshBuildCiAfter () {(set -e\n    shDeployCustom\n    shDeployGithub\n    shDeployHeroku\n    shReadmeTest example.sh\n)}\n\nshBuildCiBefore () {(set -e\n    shNpmTestPublished\n    shReadmeTest example.js\n)}\n\n# run shBuildCi\neval \"$(utility2 source)\"\nshBuildCi\n```\n\n\n\n# misc\n- this package was created with [utility2](https://github.com/kaizhu256/node-utility2)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaizhu256%2Fnode-swagger-validate-lite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaizhu256%2Fnode-swagger-validate-lite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaizhu256%2Fnode-swagger-validate-lite/lists"}