{ 25 | if (x64) return cscript64; 26 | 27 | return cscript32; 28 | }; 29 | -------------------------------------------------------------------------------- /lib/proxy.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module proxy 3 | * @license MIT 4 | * @version 2017/11/09 5 | */ 6 | 7 | 'use strict'; 8 | 9 | // Import lib 10 | const spawn = require('./spawn'); 11 | 12 | /** 13 | * @class Proxy 14 | */ 15 | class Proxy { 16 | /** 17 | * @constructor 18 | * @param {string} engine 19 | */ 20 | constructor(engine) { 21 | this.engine = engine; 22 | } 23 | 24 | /** 25 | * @method exec 26 | * @param {string} command 27 | * @param {Object} params 28 | * @returns {Promise} 29 | */ 30 | exec(command, params) { 31 | const engine = this.engine; 32 | 33 | // Params to string 34 | params = JSON.stringify(params); 35 | 36 | // Spawn args 37 | const args = [Proxy.adodb, '//E:JScript', '//Nologo', '//U', '//B', command]; 38 | 39 | // Spawn 40 | return spawn(engine, args, params, { encoding: 'utf16le' }) 41 | .then(data => JSON.parse(data)) 42 | .catch(error => { 43 | if (error.process) { 44 | error.process = JSON.parse(error.process); 45 | } 46 | 47 | throw error; 48 | }); 49 | } 50 | } 51 | 52 | // ADODB actuator 53 | Proxy.adodb = require.resolve('./adodb'); 54 | 55 | // Exports 56 | module.exports = Proxy; 57 | -------------------------------------------------------------------------------- /lib/spawn.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module spawn 3 | * @license MIT 4 | * @version 2018/04/28 5 | * @see https://github.com/panosoft/spawn-promise 6 | */ 7 | 8 | 'use strict'; 9 | 10 | let transcode = require('buffer').transcode; 11 | const childProcess = require('child_process'); 12 | 13 | // Hack transcode 14 | if (!transcode) { 15 | /** 16 | * @function toBuffer 17 | * @param {string} string 18 | * @param {string} encoding 19 | * @returns {Buffer} 20 | */ 21 | const toBuffer = 22 | Buffer.from || 23 | function(string, encoding) { 24 | return new Buffer(string, encoding); 25 | }; 26 | 27 | /** 28 | * @function transcode 29 | * @param {Buffer} source 30 | * @param {string} fromEncoding 31 | * @param {string} toEncoding 32 | * @returns {Buffer} 33 | */ 34 | transcode = function(source, fromEncoding, toEncoding) { 35 | // Same encoding 36 | if (fromEncoding === toEncoding) return source; 37 | 38 | // Transcode 39 | return toBuffer(source.toString(fromEncoding), toEncoding); 40 | }; 41 | } 42 | 43 | // Exit messages 44 | const exitMessages = { 45 | 1: 'Uncaught Fatal Exception', 46 | 3: 'Internal JavaScript Parse Error', 47 | 4: 'Internal JavaScript Evaluation Failure', 48 | 5: 'Fatal Error', 49 | 6: 'Non-function Internal Exception Handler', 50 | 7: 'Internal Exception Handler Run-Time Failure', 51 | 9: 'Invalid Argument', 52 | 10: 'Internal JavaScript Run-Time Failure', 53 | 12: 'Invalid Debug Argument' 54 | }; 55 | 56 | /** 57 | * @function isEmpty 58 | * @description Is object empty 59 | * @param {Object} object 60 | * @returns {boolean} 61 | */ 62 | const isEmpty = object => Object.keys(object).length === 0; 63 | 64 | /** 65 | * @function spawn 66 | * @description Spawn a child process and receive output via a Promise interface. 67 | * @param {string} command Command to spawn. 68 | * @param {string[]} args Array of arguments to run command with. 69 | * @param {string|Buffer} input Input to pass command via stdin. 70 | * @param {Object} options Spawn configure 71 | * @returns {Promise} Resolved with buffer of stdout or rejected with error 72 | */ 73 | const spawn = function(command, args, input, options) { 74 | return new Promise((resolve, reject) => { 75 | // Options normalize 76 | options = Object.assign({ encoding: 'utf8', windowsHide: true }, options); 77 | 78 | // Vars 79 | const stderrOutput = []; 80 | const encoding = options.encoding; 81 | const errors = Object.create(null); 82 | 83 | // Delete options encoding 84 | delete options.encoding; 85 | 86 | // Spawn command 87 | const child = childProcess.spawn(command, args, options); 88 | 89 | // Capture errors 90 | child.on('error', error => (errors.spawn = error)); 91 | child.stdin.on('error', error => (errors.stdin = error)); 92 | child.stdout.on('error', error => (errors.stdout = error)); 93 | child.stderr.on('error', error => (errors.stderr = error)); 94 | child.stderr.on('data', data => stderrOutput.push(data)); 95 | 96 | // Capture output 97 | const buffers = []; 98 | 99 | // Capture data 100 | child.stdout.on('data', data => buffers.push(data)); 101 | 102 | // Spawn close 103 | child.on('close', exitCode => { 104 | // Exit code not 0 105 | if (exitCode !== 0) { 106 | errors.exitMessage = exitMessages[exitCode]; 107 | } 108 | 109 | // Stderr output 110 | if (stderrOutput.length) { 111 | errors.process = Buffer.concat(stderrOutput).toString(encoding); 112 | } 113 | 114 | // Errors not empty 115 | if (!isEmpty(errors)) { 116 | // Set exit code 117 | errors.exitCode = exitCode; 118 | 119 | // Reject error 120 | return reject(Object.assign(new Error(`Spawn ${command} error`), errors)); 121 | } 122 | 123 | // Resolve data 124 | return resolve(transcode(Buffer.concat(buffers), encoding, 'utf8')); 125 | }); 126 | 127 | // Send input data 128 | child.stdin.end(input, encoding); 129 | }); 130 | }; 131 | 132 | // Exports 133 | module.exports = spawn; 134 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-adodb", 3 | "version": "5.0.3", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "keywords": [ 7 | "sql", 8 | "adodb", 9 | "access", 10 | "database", 11 | "node-adodb", 12 | "microsoft adodb" 13 | ], 14 | "homepage": "https://github.com/nuintun/node-adodb#readme", 15 | "description": "A Node.js JavaScript Client implementing the ADODB protocol.", 16 | "author": { 17 | "name": "nuintun", 18 | "email": "nuintun@qq.com" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/nuintun/node-adodb/issues" 22 | }, 23 | "os": [ 24 | "win32" 25 | ], 26 | "engines": { 27 | "node": ">=6.0.0" 28 | }, 29 | "repository": { 30 | "type": "git", 31 | "url": "git+https://github.com/nuintun/node-adodb.git" 32 | }, 33 | "dependencies": { 34 | "arch": "^2.1.1", 35 | "debug": "^4.1.1" 36 | }, 37 | "devDependencies": { 38 | "chai": "^4.2.0", 39 | "rollup": "^1.32.0", 40 | "terser": "^4.6.4", 41 | "holding": "^3.1.1", 42 | "fs-extra": "^8.1.0" 43 | }, 44 | "scripts": { 45 | "prepublishOnly": "node rollup.js", 46 | "test": "mocha --timeout 6000 --check-leaks --reporter spec --bail --exit", 47 | "test-ci": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- --timeout 6000 --check-leaks --reporter spec --exit", 48 | "test-cov": "istanbul cover ./node_modules/mocha/bin/_mocha -- --timeout 6000 --check-leaks --reporter dot --exit" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /rollup.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module rollup 3 | * @license MIT 4 | * @version 2017/11/09 5 | */ 6 | 7 | 'use strict'; 8 | 9 | const fs = require('fs-extra'); 10 | const terser = require('terser'); 11 | const rollup = require('rollup'); 12 | const pkg = require('./package.json'); 13 | 14 | /** 15 | * @function build 16 | * @param {Object} inputOptions 17 | * @param {Object} outputOptions 18 | */ 19 | async function build(inputOptions, outputOptions) { 20 | await fs.remove(outputOptions.file); 21 | 22 | const bundle = await rollup.rollup(inputOptions); 23 | const { output } = await bundle.generate(outputOptions); 24 | const [result] = output; 25 | 26 | const file = outputOptions.file; 27 | const minify = terser.minify(result.code, { ie8: true, output: { comments: false } }); 28 | 29 | await fs.outputFile(file, banner + minify.code); 30 | 31 | console.log(`Build ${file} success!`); 32 | } 33 | 34 | const banner = `/** 35 | * @module ${pkg.name} 36 | * @author ${pkg.author.name} 37 | * @license ${pkg.license} 38 | * @version ${pkg.version} 39 | * @description ${pkg.description} 40 | * @see ${pkg.homepage} 41 | */ 42 | `; 43 | 44 | const inputOptions = { 45 | input: 'lib/adodb/main.js' 46 | }; 47 | 48 | const outputOptions = { 49 | indent: true, 50 | strict: true, 51 | format: 'iife', 52 | file: 'lib/adodb.js' 53 | }; 54 | 55 | build(inputOptions, outputOptions); 56 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module test 3 | * @license MIT 4 | * @version 2017/11/09 5 | */ 6 | 7 | 'use strict'; 8 | 9 | const fs = require('fs'); 10 | const path = require('path'); 11 | const arch = require('arch'); 12 | const ADODB = require('../index'); 13 | const expect = require('chai').expect; 14 | const holding = require('holding').assert; 15 | 16 | const source = path.resolve('test/node-adodb.mdb'); 17 | const mdb = fs.readFileSync(require.resolve('../examples/node-adodb.mdb')); 18 | 19 | fs.writeFileSync(source, mdb); 20 | 21 | // Variable declaration 22 | const x64 = arch() === 'x64'; 23 | const sysroot = process.env['systemroot'] || process.env['windir']; 24 | const cscript = path.join(sysroot, x64 ? 'SysWOW64' : 'System32', 'cscript.exe'); 25 | 26 | if (fs.existsSync(cscript) && fs.existsSync(source)) { 27 | console.log('Use:', cscript); 28 | console.log('Database:', source); 29 | 30 | // Variable declaration 31 | const connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + source + ';'); 32 | 33 | describe('ADODB', () => { 34 | it('query', next => { 35 | connection 36 | .query('SELECT * FROM Users') 37 | .then(data => { 38 | expect(data.length).to.equal(3); 39 | expect(data[0].UserName).to.equal('Nuintun'); 40 | expect(data[0]).to.have.ownProperty('UserBirthday'); 41 | expect(data[2].UserName).to.equal('张三'); 42 | next(); 43 | }) 44 | .catch(next); 45 | }); 46 | 47 | it('transaction', next => { 48 | connection 49 | .transaction([`INSERT INTO Users(UserId, UserName, UserSex, UserBirthday, UserMarried) VALUES (10, "Tom", "Male", "1981/5/10", 0);`, 50 | `INSERT INTO Users(UserId, UserName, UserSex, UserBirthday, UserMarried) VALUES (11, "Brenda", "Female", "2001/1/11", 0);`, 51 | `INSERT INTO Users(UserId, UserName, UserSex, UserBirthday, UserMarried) VALUES (10, "Bill", "Male", "1991/3/9", 0);`]) 52 | .then(data => { 53 | expect.fail(); 54 | // next(); 55 | }) 56 | .catch(ex => { 57 | connection 58 | .query('SELECT * FROM Users') 59 | .then(data => { 60 | expect(data.length).to.equal(3); 61 | next(); 62 | }) 63 | .catch(next); 64 | }); 65 | }); 66 | 67 | it('schema', next => { 68 | const cb = holding(2, next); 69 | 70 | connection 71 | .schema(20) 72 | .then(data => { 73 | expect(data).to.be.an('array'); 74 | 75 | if (data.length) { 76 | expect(data[0]).to.include.all.keys(['TABLE_NAME', 'TABLE_TYPE']); 77 | } 78 | 79 | cb(); 80 | }) 81 | .catch(cb); 82 | 83 | connection 84 | .schema(4, [null, null, 'Users']) 85 | .then(data => { 86 | expect(data).to.be.an('array'); 87 | 88 | if (data.length) { 89 | expect(data[0]).to.include.all.keys(['COLUMN_NAME', 'DATA_TYPE']); 90 | } 91 | 92 | cb(); 93 | }) 94 | .catch(cb); 95 | 96 | connection 97 | .schema(-1, [null, null, 'Users'], 'TABLE') 98 | .then(data => { 99 | expect(data).to.be.an('array'); 100 | cb(); 101 | }) 102 | .catch(() => cb()); 103 | }); 104 | 105 | it('Invaid sql syntax', next => { 106 | connection.query('SELECT * FROM Users-non-exist').catch(error => { 107 | expect(error).to.be.exist; 108 | next(); 109 | }); 110 | }); 111 | 112 | describe('execute', () => { 113 | it('no scalar', next => { 114 | connection 115 | .execute('INSERT INTO Users(UserName, UserSex, UserBirthday, UserMarried) VALUES ("Bill", "Male", "1991/3/9", 0)') 116 | .then(data => { 117 | expect(data.length).to.equal(0); 118 | next(); 119 | }) 120 | .catch(next); 121 | }); 122 | 123 | it('with scalar', next => { 124 | connection 125 | .execute( 126 | 'INSERT INTO Users(UserName, UserSex, UserBirthday, UserMarried) VALUES ("Alice", "Female", "1986/3/9", 0)', 127 | 'SELECT @@Identity AS id' 128 | ) 129 | .then(function(data) { 130 | expect(data.length).to.equal(1); 131 | expect(data[0].id).to.equal(13); 132 | next(); 133 | }) 134 | .catch(next); 135 | }); 136 | }); 137 | }); 138 | } else { 139 | console.log('This OS not support node-adodb.'); 140 | } 141 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/estree@*": 6 | version "0.0.42" 7 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.42.tgz#8d0c1f480339efedb3e46070e22dd63e0430dd11" 8 | integrity sha512-K1DPVvnBCPxzD+G51/cxVIoc2X8uUVl1zpJeE6iKcgHMj4+tbat5Xu4TjV7v2QSDbIeAfLi2hIk+u2+s0MlpUQ== 9 | 10 | "@types/node@*": 11 | version "13.7.7" 12 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.7.tgz#1628e6461ba8cc9b53196dfeaeec7b07fa6eea99" 13 | integrity sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg== 14 | 15 | acorn@^7.1.0: 16 | version "7.1.1" 17 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 18 | integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== 19 | 20 | arch@^2.1.1: 21 | version "2.1.1" 22 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" 23 | integrity sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg== 24 | 25 | assertion-error@^1.1.0: 26 | version "1.1.0" 27 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 28 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 29 | 30 | buffer-from@^1.0.0: 31 | version "1.1.1" 32 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 33 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 34 | 35 | chai@^4.2.0: 36 | version "4.2.0" 37 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 38 | integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== 39 | dependencies: 40 | assertion-error "^1.1.0" 41 | check-error "^1.0.2" 42 | deep-eql "^3.0.1" 43 | get-func-name "^2.0.0" 44 | pathval "^1.1.0" 45 | type-detect "^4.0.5" 46 | 47 | check-error@^1.0.2: 48 | version "1.0.2" 49 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 50 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 51 | 52 | commander@^2.20.0: 53 | version "2.20.3" 54 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 55 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 56 | 57 | debug@^4.1.1: 58 | version "4.1.1" 59 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 60 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 61 | dependencies: 62 | ms "^2.1.1" 63 | 64 | deep-eql@^3.0.1: 65 | version "3.0.1" 66 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 67 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 68 | dependencies: 69 | type-detect "^4.0.0" 70 | 71 | fs-extra@^8.1.0: 72 | version "8.1.0" 73 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 74 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 75 | dependencies: 76 | graceful-fs "^4.2.0" 77 | jsonfile "^4.0.0" 78 | universalify "^0.1.0" 79 | 80 | get-func-name@^2.0.0: 81 | version "2.0.0" 82 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 83 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 84 | 85 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 86 | version "4.2.3" 87 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 88 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== 89 | 90 | holding@^3.1.1: 91 | version "3.1.1" 92 | resolved "https://registry.yarnpkg.com/holding/-/holding-3.1.1.tgz#601b8770794e24552bb227eead96b43766fd1c04" 93 | integrity sha512-467ENnVR4iYdbqtyQFEzBVNPYMvHTbwbcy8Lm2Q0xibHr0fZ83S6Z3ushXAHcLvSD6cY+YMNTLWj1F8QAsoanA== 94 | 95 | jsonfile@^4.0.0: 96 | version "4.0.0" 97 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 98 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 99 | optionalDependencies: 100 | graceful-fs "^4.1.6" 101 | 102 | ms@^2.1.1: 103 | version "2.1.2" 104 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 105 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 106 | 107 | pathval@^1.1.0: 108 | version "1.1.0" 109 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 110 | integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= 111 | 112 | rollup@^1.32.0: 113 | version "1.32.0" 114 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.0.tgz#c65ce134850aca1ce595fcac07d1dc5d53bf227c" 115 | integrity sha512-ab2tF5pdDqm2zuI8j02ceyrJSScl9V2C24FgWQ1v1kTFTu1UrG5H0hpP++mDZlEFyZX4k0chtGEHU2i+pAzBgA== 116 | dependencies: 117 | "@types/estree" "*" 118 | "@types/node" "*" 119 | acorn "^7.1.0" 120 | 121 | source-map-support@~0.5.12: 122 | version "0.5.16" 123 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" 124 | integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== 125 | dependencies: 126 | buffer-from "^1.0.0" 127 | source-map "^0.6.0" 128 | 129 | source-map@^0.6.0, source-map@~0.6.1: 130 | version "0.6.1" 131 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 132 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 133 | 134 | terser@^4.6.4: 135 | version "4.6.4" 136 | resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.4.tgz#40a0b37afbe5b57e494536815efa68326840fc00" 137 | integrity sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w== 138 | dependencies: 139 | commander "^2.20.0" 140 | source-map "~0.6.1" 141 | source-map-support "~0.5.12" 142 | 143 | type-detect@^4.0.0, type-detect@^4.0.5: 144 | version "4.0.8" 145 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 146 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 147 | 148 | universalify@^0.1.0: 149 | version "0.1.2" 150 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 151 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 152 | --------------------------------------------------------------------------------