├── .gitignore ├── data.xls ├── package.json ├── README.md ├── index.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /data.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kenzouno1/DiaGioiHanhChinhVN/HEAD/data.xls -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DGHC", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "cheerio": "^1.0.0-rc.5", 8 | "fs": "^0.0.1-security", 9 | "lodash": "^4.17.20", 10 | "pg": "^8.13.3", 11 | "request": "^2.88.2", 12 | "request-promise-native": "^1.0.9", 13 | "xlsx": "^0.16.9" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## DiaGioiHanhCHinhVN 2 | Script tự động tải file excel từ website tổng cục thống kê https://danhmuchanhchinh.gso.gov.vn/ và chuyển sang dạng cây json. 3 | 4 | - Tỉnh 5 | + Id 6 | + Name 7 | + Districts 8 | + Id 9 | + Name 10 | + Wards 11 | + Id 12 | + Name 13 | + Level (Cấp hành chính phường,xã,thị trấn) 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const request = require('request-promise-native'); 2 | const cheerio = require('cheerio'); 3 | const fs = require('fs'); 4 | const _ = require("lodash"); 5 | 6 | 7 | const Init = async () => { 8 | return new Promise((resolve, reject) => { 9 | request({ url: "https://danhmuchanhchinh.gso.gov.vn/", resolveWithFullResponse: true }).then(response => { 10 | let $ = cheerio.load(response.body); 11 | var state = $('#__VIEWSTATE').first().attr("value"); 12 | 13 | resolve({ 14 | state, 15 | cookie: response.headers["set-cookie"][0].split(";")[0] 16 | }) 17 | }).catch(err => { 18 | console.log(err); 19 | reject(err); 20 | }); 21 | }) 22 | } 23 | const Download = async (x) => { 24 | console.log("start downloading"); 25 | return new Promise((resolve, reject) => { 26 | var options = { 27 | 'method': 'POST', 28 | 'url': 'https://danhmuchanhchinh.gso.gov.vn/default.aspx', 29 | 30 | 'headers': { 31 | 'Connection': 'keep-alive', 32 | 'Pragma': 'no-cache', 33 | 'Cache-Control': 'no-cache', 34 | 'Upgrade-Insecure-Requests': '1', 35 | 'Origin': 'https://danhmuchanhchinh.gso.gov.vn', 36 | 'Content-Type': 'application/x-www-form-urlencoded', 37 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66', 38 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 39 | 'Sec-Fetch-Site': 'same-origin', 40 | 'Sec-Fetch-Mode': 'navigate', 41 | 'Sec-Fetch-User': '?1', 42 | 'Sec-Fetch-Dest': 'document', 43 | 'Referer': 'https://danhmuchanhchinh.gso.gov.vn/', 44 | 'Accept-Language': 'vi,en-US;q=0.9,en;q=0.8', 45 | 'Cookie': x.cookie, 46 | 'gzip': true, 47 | }, 48 | form: { 49 | '__EVENTTARGET': 'ctl00$PlaceHolderMain$btnExcel', 50 | '__EVENTARGUMENT': 'Click', 51 | '__VIEWSTATE': x.state, 52 | 'ctl00_PlaceHolderMain_cmbCap_VI': '1', 53 | 'ctl00$PlaceHolderMain$cmbCap': 'Tỉnh', 54 | 'ctl00$PlaceHolderMain$check': 'C', 55 | } 56 | }; 57 | 58 | let file = fs.createWriteStream('data.xls'); 59 | request(options, function (error, response) { 60 | if (error) throw new Error(error); 61 | }).pipe(file) 62 | .on("finish", () => resolve()) 63 | .on("error", (err) => reject(err)); 64 | }) 65 | }; 66 | 67 | 68 | const parseJson = () => { 69 | var XLSX = require('xlsx'); 70 | var workbook = XLSX.readFile('./data.xls'); 71 | var sheet_name_list = workbook.SheetNames; 72 | sheet_name_list.forEach(function (y) { 73 | var worksheet = workbook.Sheets[y]; 74 | var headers = {}; 75 | var data = []; 76 | for (z in worksheet) { 77 | if (z[0] === '!') continue; 78 | //parse out the column, row, and value 79 | var col = z.substring(0, 1); 80 | var row = parseInt(z.substring(1)); 81 | var value = worksheet[z].v; 82 | 83 | //store header names 84 | if (row == 1) { 85 | headers[col] = value; 86 | continue; 87 | } 88 | 89 | if (!data[row]) data[row] = {}; 90 | data[row][headers[col]] = value; 91 | } 92 | //drop those first two rows which are empty 93 | data.shift(); 94 | data.shift(); 95 | 96 | const all = []; 97 | 98 | data.map(item => { 99 | const provinceId = item["Mã TP"]; 100 | const provinceName = item["Tỉnh Thành Phố"]; 101 | const districtId = item["Mã QH"]; 102 | const districtName = item["Quận Huyện"]; 103 | const wardId = item["Mã PX"]; 104 | const wardName = item["Phường Xã"]; 105 | const level = item["Cấp"]; 106 | 107 | if (all.findIndex(x => x.Id == provinceId) < 0) { 108 | all.push({ 109 | Id: provinceId, 110 | Name: provinceName, 111 | Districts: [] 112 | }) 113 | } 114 | const index = all.findIndex(x => x.Id == provinceId); 115 | 116 | if (all[index].Districts.findIndex(x => x.Id == districtId) < 0) { 117 | all[index].Districts.push({ 118 | Id: districtId, 119 | Name: districtName, 120 | Wards: [] 121 | }) 122 | } 123 | dIndex = all[index].Districts.findIndex(x => x.Id == districtId); 124 | all[index].Districts[dIndex].Wards.push({ 125 | Id: wardId, 126 | Name: wardName, 127 | Level: level, 128 | }) 129 | }) 130 | 131 | fs.writeFile("data.json", JSON.stringify(all), null, () => { 132 | console.log("parse json success") 133 | }) 134 | }); 135 | } 136 | 137 | 138 | (async () => { 139 | var x = await Init(); 140 | await Download(x); 141 | parseJson(); 142 | })(); -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | adler-32@~1.2.0: 6 | version "1.2.0" 7 | resolved "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz" 8 | integrity sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU= 9 | dependencies: 10 | exit-on-epipe "~1.0.1" 11 | printj "~1.1.0" 12 | 13 | ajv@^6.12.3: 14 | version "6.12.6" 15 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 16 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 17 | dependencies: 18 | fast-deep-equal "^3.1.1" 19 | fast-json-stable-stringify "^2.0.0" 20 | json-schema-traverse "^0.4.1" 21 | uri-js "^4.2.2" 22 | 23 | asn1@~0.2.3: 24 | version "0.2.4" 25 | resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" 26 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 27 | dependencies: 28 | safer-buffer "~2.1.0" 29 | 30 | assert-plus@^1.0.0, assert-plus@1.0.0: 31 | version "1.0.0" 32 | resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 33 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 34 | 35 | asynckit@^0.4.0: 36 | version "0.4.0" 37 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 38 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 39 | 40 | aws-sign2@~0.7.0: 41 | version "0.7.0" 42 | resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" 43 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 44 | 45 | aws4@^1.8.0: 46 | version "1.11.0" 47 | resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" 48 | integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== 49 | 50 | bcrypt-pbkdf@^1.0.0: 51 | version "1.0.2" 52 | resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" 53 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 54 | dependencies: 55 | tweetnacl "^0.14.3" 56 | 57 | boolbase@^1.0.0: 58 | version "1.0.0" 59 | resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" 60 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 61 | 62 | caseless@~0.12.0: 63 | version "0.12.0" 64 | resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 65 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 66 | 67 | cfb@^1.1.4: 68 | version "1.2.0" 69 | resolved "https://registry.npmjs.org/cfb/-/cfb-1.2.0.tgz" 70 | integrity sha512-sXMvHsKCICVR3Naq+J556K+ExBo9n50iKl6LGarlnvuA2035uMlGA/qVrc0wQtow5P1vJEw9UyrKLCbtIKz+TQ== 71 | dependencies: 72 | adler-32 "~1.2.0" 73 | crc-32 "~1.2.0" 74 | printj "~1.1.2" 75 | 76 | cheerio-select-tmp@^0.1.0: 77 | version "0.1.1" 78 | resolved "https://registry.npmjs.org/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz" 79 | integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ== 80 | dependencies: 81 | css-select "^3.1.2" 82 | css-what "^4.0.0" 83 | domelementtype "^2.1.0" 84 | domhandler "^4.0.0" 85 | domutils "^2.4.4" 86 | 87 | cheerio@^1.0.0-rc.5: 88 | version "1.0.0-rc.5" 89 | resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.5.tgz" 90 | integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw== 91 | dependencies: 92 | cheerio-select-tmp "^0.1.0" 93 | dom-serializer "~1.2.0" 94 | domhandler "^4.0.0" 95 | entities "~2.1.0" 96 | htmlparser2 "^6.0.0" 97 | parse5 "^6.0.0" 98 | parse5-htmlparser2-tree-adapter "^6.0.0" 99 | 100 | codepage@~1.14.0: 101 | version "1.14.0" 102 | resolved "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz" 103 | integrity sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k= 104 | dependencies: 105 | commander "~2.14.1" 106 | exit-on-epipe "~1.0.1" 107 | 108 | combined-stream@^1.0.6, combined-stream@~1.0.6: 109 | version "1.0.8" 110 | resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 111 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 112 | dependencies: 113 | delayed-stream "~1.0.0" 114 | 115 | commander@~2.14.1: 116 | version "2.14.1" 117 | resolved "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz" 118 | integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw== 119 | 120 | commander@~2.17.1: 121 | version "2.17.1" 122 | resolved "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz" 123 | integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== 124 | 125 | core-util-is@1.0.2: 126 | version "1.0.2" 127 | resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 128 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 129 | 130 | crc-32@~1.2.0: 131 | version "1.2.0" 132 | resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz" 133 | integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== 134 | dependencies: 135 | exit-on-epipe "~1.0.1" 136 | printj "~1.1.0" 137 | 138 | css-select@^3.1.2: 139 | version "3.1.2" 140 | resolved "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz" 141 | integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA== 142 | dependencies: 143 | boolbase "^1.0.0" 144 | css-what "^4.0.0" 145 | domhandler "^4.0.0" 146 | domutils "^2.4.3" 147 | nth-check "^2.0.0" 148 | 149 | css-what@^4.0.0: 150 | version "4.0.0" 151 | resolved "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz" 152 | integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A== 153 | 154 | dashdash@^1.12.0: 155 | version "1.14.1" 156 | resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" 157 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 158 | dependencies: 159 | assert-plus "^1.0.0" 160 | 161 | delayed-stream@~1.0.0: 162 | version "1.0.0" 163 | resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 164 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 165 | 166 | dom-serializer@^1.0.1, dom-serializer@~1.2.0: 167 | version "1.2.0" 168 | resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz" 169 | integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA== 170 | dependencies: 171 | domelementtype "^2.0.1" 172 | domhandler "^4.0.0" 173 | entities "^2.0.0" 174 | 175 | domelementtype@^2.0.1, domelementtype@^2.1.0: 176 | version "2.1.0" 177 | resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz" 178 | integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== 179 | 180 | domhandler@^4.0.0: 181 | version "4.0.0" 182 | resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz" 183 | integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== 184 | dependencies: 185 | domelementtype "^2.1.0" 186 | 187 | domutils@^2.4.3, domutils@^2.4.4: 188 | version "2.4.4" 189 | resolved "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz" 190 | integrity sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA== 191 | dependencies: 192 | dom-serializer "^1.0.1" 193 | domelementtype "^2.0.1" 194 | domhandler "^4.0.0" 195 | 196 | ecc-jsbn@~0.1.1: 197 | version "0.1.2" 198 | resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" 199 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 200 | dependencies: 201 | jsbn "~0.1.0" 202 | safer-buffer "^2.1.0" 203 | 204 | entities@^2.0.0, entities@~2.1.0: 205 | version "2.1.0" 206 | resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" 207 | integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== 208 | 209 | exit-on-epipe@~1.0.1: 210 | version "1.0.1" 211 | resolved "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz" 212 | integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== 213 | 214 | extend@~3.0.2: 215 | version "3.0.2" 216 | resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" 217 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 218 | 219 | extsprintf@^1.2.0, extsprintf@1.3.0: 220 | version "1.3.0" 221 | resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" 222 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 223 | 224 | fast-deep-equal@^3.1.1: 225 | version "3.1.3" 226 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 227 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 228 | 229 | fast-json-stable-stringify@^2.0.0: 230 | version "2.1.0" 231 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 232 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 233 | 234 | fflate@^0.3.8: 235 | version "0.3.11" 236 | resolved "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz" 237 | integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A== 238 | 239 | forever-agent@~0.6.1: 240 | version "0.6.1" 241 | resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 242 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 243 | 244 | form-data@~2.3.2: 245 | version "2.3.3" 246 | resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" 247 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 248 | dependencies: 249 | asynckit "^0.4.0" 250 | combined-stream "^1.0.6" 251 | mime-types "^2.1.12" 252 | 253 | frac@~1.1.2: 254 | version "1.1.2" 255 | resolved "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz" 256 | integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== 257 | 258 | fs@^0.0.1-security: 259 | version "0.0.1-security" 260 | resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" 261 | integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= 262 | 263 | getpass@^0.1.1: 264 | version "0.1.7" 265 | resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" 266 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 267 | dependencies: 268 | assert-plus "^1.0.0" 269 | 270 | har-schema@^2.0.0: 271 | version "2.0.0" 272 | resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" 273 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 274 | 275 | har-validator@~5.1.3: 276 | version "5.1.5" 277 | resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" 278 | integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== 279 | dependencies: 280 | ajv "^6.12.3" 281 | har-schema "^2.0.0" 282 | 283 | htmlparser2@^6.0.0: 284 | version "6.0.0" 285 | resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.0.0.tgz" 286 | integrity sha512-numTQtDZMoh78zJpaNdJ9MXb2cv5G3jwUoe3dMQODubZvLoGvTE/Ofp6sHvH8OGKcN/8A47pGLi/k58xHP/Tfw== 287 | dependencies: 288 | domelementtype "^2.0.1" 289 | domhandler "^4.0.0" 290 | domutils "^2.4.4" 291 | entities "^2.0.0" 292 | 293 | http-signature@~1.2.0: 294 | version "1.2.0" 295 | resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" 296 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 297 | dependencies: 298 | assert-plus "^1.0.0" 299 | jsprim "^1.2.2" 300 | sshpk "^1.7.0" 301 | 302 | is-typedarray@~1.0.0: 303 | version "1.0.0" 304 | resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 305 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 306 | 307 | isstream@~0.1.2: 308 | version "0.1.2" 309 | resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 310 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 311 | 312 | jsbn@~0.1.0: 313 | version "0.1.1" 314 | resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" 315 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 316 | 317 | json-schema-traverse@^0.4.1: 318 | version "0.4.1" 319 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 320 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 321 | 322 | json-schema@0.2.3: 323 | version "0.2.3" 324 | resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 325 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 326 | 327 | json-stringify-safe@~5.0.1: 328 | version "5.0.1" 329 | resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 330 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 331 | 332 | jsprim@^1.2.2: 333 | version "1.4.1" 334 | resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" 335 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 336 | dependencies: 337 | assert-plus "1.0.0" 338 | extsprintf "1.3.0" 339 | json-schema "0.2.3" 340 | verror "1.10.0" 341 | 342 | lodash@^4.17.19, lodash@^4.17.20: 343 | version "4.17.20" 344 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz" 345 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 346 | 347 | mime-db@1.45.0: 348 | version "1.45.0" 349 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz" 350 | integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== 351 | 352 | mime-types@^2.1.12, mime-types@~2.1.19: 353 | version "2.1.28" 354 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz" 355 | integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== 356 | dependencies: 357 | mime-db "1.45.0" 358 | 359 | nth-check@^2.0.0: 360 | version "2.0.0" 361 | resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz" 362 | integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q== 363 | dependencies: 364 | boolbase "^1.0.0" 365 | 366 | oauth-sign@~0.9.0: 367 | version "0.9.0" 368 | resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" 369 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 370 | 371 | parse5-htmlparser2-tree-adapter@^6.0.0: 372 | version "6.0.1" 373 | resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" 374 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 375 | dependencies: 376 | parse5 "^6.0.1" 377 | 378 | parse5@^6.0.0, parse5@^6.0.1: 379 | version "6.0.1" 380 | resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" 381 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 382 | 383 | performance-now@^2.1.0: 384 | version "2.1.0" 385 | resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" 386 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 387 | 388 | pg-cloudflare@^1.1.1: 389 | version "1.1.1" 390 | resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz" 391 | integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== 392 | 393 | pg-connection-string@^2.7.0: 394 | version "2.7.0" 395 | resolved "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz" 396 | integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== 397 | 398 | pg-int8@1.0.1: 399 | version "1.0.1" 400 | resolved "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz" 401 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 402 | 403 | pg-pool@^3.7.1: 404 | version "3.7.1" 405 | resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.1.tgz" 406 | integrity sha512-xIOsFoh7Vdhojas6q3596mXFsR8nwBQBXX5JiV7p9buEVAGqYL4yFzclON5P9vFrpu1u7Zwl2oriyDa89n0wbw== 407 | 408 | pg-protocol@^1.7.1: 409 | version "1.7.1" 410 | resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.1.tgz" 411 | integrity sha512-gjTHWGYWsEgy9MsY0Gp6ZJxV24IjDqdpTW7Eh0x+WfJLFsm/TJx1MzL6T0D88mBvkpxotCQ6TwW6N+Kko7lhgQ== 412 | 413 | pg-types@^2.1.0: 414 | version "2.2.0" 415 | resolved "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz" 416 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 417 | dependencies: 418 | pg-int8 "1.0.1" 419 | postgres-array "~2.0.0" 420 | postgres-bytea "~1.0.0" 421 | postgres-date "~1.0.4" 422 | postgres-interval "^1.1.0" 423 | 424 | pg@^8.13.3, pg@>=8.0: 425 | version "8.13.3" 426 | resolved "https://registry.npmjs.org/pg/-/pg-8.13.3.tgz" 427 | integrity sha512-P6tPt9jXbL9HVu/SSRERNYaYG++MjnscnegFh9pPHihfoBSujsrka0hyuymMzeJKFWrcG8wvCKy8rCe8e5nDUQ== 428 | dependencies: 429 | pg-connection-string "^2.7.0" 430 | pg-pool "^3.7.1" 431 | pg-protocol "^1.7.1" 432 | pg-types "^2.1.0" 433 | pgpass "1.x" 434 | optionalDependencies: 435 | pg-cloudflare "^1.1.1" 436 | 437 | pgpass@1.x: 438 | version "1.0.5" 439 | resolved "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz" 440 | integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== 441 | dependencies: 442 | split2 "^4.1.0" 443 | 444 | postgres-array@~2.0.0: 445 | version "2.0.0" 446 | resolved "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz" 447 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 448 | 449 | postgres-bytea@~1.0.0: 450 | version "1.0.0" 451 | resolved "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz" 452 | integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== 453 | 454 | postgres-date@~1.0.4: 455 | version "1.0.7" 456 | resolved "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz" 457 | integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== 458 | 459 | postgres-interval@^1.1.0: 460 | version "1.2.0" 461 | resolved "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz" 462 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 463 | dependencies: 464 | xtend "^4.0.0" 465 | 466 | printj@~1.1.0, printj@~1.1.2: 467 | version "1.1.2" 468 | resolved "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz" 469 | integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== 470 | 471 | psl@^1.1.28: 472 | version "1.8.0" 473 | resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz" 474 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 475 | 476 | punycode@^2.1.0, punycode@^2.1.1: 477 | version "2.1.1" 478 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 479 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 480 | 481 | qs@~6.5.2: 482 | version "6.5.2" 483 | resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" 484 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 485 | 486 | request-promise-core@1.1.4: 487 | version "1.1.4" 488 | resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" 489 | integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== 490 | dependencies: 491 | lodash "^4.17.19" 492 | 493 | request-promise-native@^1.0.9: 494 | version "1.0.9" 495 | resolved "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" 496 | integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== 497 | dependencies: 498 | request-promise-core "1.1.4" 499 | stealthy-require "^1.1.1" 500 | tough-cookie "^2.3.3" 501 | 502 | request@^2.34, request@^2.88.2: 503 | version "2.88.2" 504 | resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" 505 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 506 | dependencies: 507 | aws-sign2 "~0.7.0" 508 | aws4 "^1.8.0" 509 | caseless "~0.12.0" 510 | combined-stream "~1.0.6" 511 | extend "~3.0.2" 512 | forever-agent "~0.6.1" 513 | form-data "~2.3.2" 514 | har-validator "~5.1.3" 515 | http-signature "~1.2.0" 516 | is-typedarray "~1.0.0" 517 | isstream "~0.1.2" 518 | json-stringify-safe "~5.0.1" 519 | mime-types "~2.1.19" 520 | oauth-sign "~0.9.0" 521 | performance-now "^2.1.0" 522 | qs "~6.5.2" 523 | safe-buffer "^5.1.2" 524 | tough-cookie "~2.5.0" 525 | tunnel-agent "^0.6.0" 526 | uuid "^3.3.2" 527 | 528 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 529 | version "5.2.1" 530 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 531 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 532 | 533 | safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 534 | version "2.1.2" 535 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 536 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 537 | 538 | split2@^4.1.0: 539 | version "4.2.0" 540 | resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" 541 | integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== 542 | 543 | ssf@~0.11.2: 544 | version "0.11.2" 545 | resolved "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz" 546 | integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== 547 | dependencies: 548 | frac "~1.1.2" 549 | 550 | sshpk@^1.7.0: 551 | version "1.16.1" 552 | resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" 553 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 554 | dependencies: 555 | asn1 "~0.2.3" 556 | assert-plus "^1.0.0" 557 | bcrypt-pbkdf "^1.0.0" 558 | dashdash "^1.12.0" 559 | ecc-jsbn "~0.1.1" 560 | getpass "^0.1.1" 561 | jsbn "~0.1.0" 562 | safer-buffer "^2.0.2" 563 | tweetnacl "~0.14.0" 564 | 565 | stealthy-require@^1.1.1: 566 | version "1.1.1" 567 | resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" 568 | integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= 569 | 570 | tough-cookie@^2.3.3, tough-cookie@~2.5.0: 571 | version "2.5.0" 572 | resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" 573 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 574 | dependencies: 575 | psl "^1.1.28" 576 | punycode "^2.1.1" 577 | 578 | tunnel-agent@^0.6.0: 579 | version "0.6.0" 580 | resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 581 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 582 | dependencies: 583 | safe-buffer "^5.0.1" 584 | 585 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 586 | version "0.14.5" 587 | resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" 588 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 589 | 590 | uri-js@^4.2.2: 591 | version "4.4.1" 592 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 593 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 594 | dependencies: 595 | punycode "^2.1.0" 596 | 597 | uuid@^3.3.2: 598 | version "3.4.0" 599 | resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" 600 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 601 | 602 | verror@1.10.0: 603 | version "1.10.0" 604 | resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" 605 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 606 | dependencies: 607 | assert-plus "^1.0.0" 608 | core-util-is "1.0.2" 609 | extsprintf "^1.2.0" 610 | 611 | wmf@~1.0.1: 612 | version "1.0.2" 613 | resolved "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz" 614 | integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== 615 | 616 | word@~0.3.0: 617 | version "0.3.0" 618 | resolved "https://registry.npmjs.org/word/-/word-0.3.0.tgz" 619 | integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== 620 | 621 | xlsx@^0.16.9: 622 | version "0.16.9" 623 | resolved "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz" 624 | integrity sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw== 625 | dependencies: 626 | adler-32 "~1.2.0" 627 | cfb "^1.1.4" 628 | codepage "~1.14.0" 629 | commander "~2.17.1" 630 | crc-32 "~1.2.0" 631 | exit-on-epipe "~1.0.1" 632 | fflate "^0.3.8" 633 | ssf "~0.11.2" 634 | wmf "~1.0.1" 635 | word "~0.3.0" 636 | 637 | xtend@^4.0.0: 638 | version "4.0.2" 639 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 640 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 641 | --------------------------------------------------------------------------------