diff --git a/speech/package.json b/speech/package.json index a82ed78d9bd..2b4cd5fc9bf 100644 --- a/speech/package.json +++ b/speech/package.json @@ -8,7 +8,8 @@ "test": "cd ..; npm run st -- --verbose speech/system-test/*.test.js" }, "dependencies": { - "@google-cloud/speech": "0.5.0", + "@google-cloud/speech": "0.6.0", + "@google-cloud/storage": "0.6.1", "node-record-lpcm16": "0.2.0", "yargs": "6.6.0" }, diff --git a/speech/recognize.js b/speech/recognize.js index 639406ef6bb..ce17701b2bc 100644 --- a/speech/recognize.js +++ b/speech/recognize.js @@ -23,143 +23,275 @@ 'use strict'; -const Speech = require('@google-cloud/speech'); +function syncRecognize (filename, encoding, sampleRate) { + // [START speech_sync_recognize] + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); -// [START speech_sync_recognize] -function syncRecognize (filename) { // Instantiates a client const speech = Speech(); - const config = { - // Configure these settings based on the audio you're transcribing - encoding: 'LINEAR16', - sampleRate: 16000 + // The path to the local file on which to perform speech recognition, e.g. /path/to/audio.raw + // const filename = '/path/to/audio.raw'; + + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { + encoding: encoding, + sampleRate: sampleRate }; - // Detects speech in the audio file, e.g. "./resources/audio.raw" - return speech.recognize(filename, config) + // Detects speech in the audio file + speech.recognize(filename, request) .then((results) => { const transcription = results[0]; + + console.log(`Transcription: ${transcription}`); + }); + // [END speech_sync_recognize] +} + +function syncRecognizeGCS (gcsUri, encoding, sampleRate) { + // [START speech_sync_recognize_gcs] + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); + + // Instantiates a client + const speech = Speech(); + + // The Google Cloud Storage URI of the file on which to perform speech recognition, e.g. gs://my-bucket/audio.raw + // const gcsUri = 'gs://my-bucket/audio.raw'; + + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { + encoding: encoding, + sampleRate: sampleRate + }; + + // Detects speech in the audio file + speech.recognize(gcsUri, request) + .then((results) => { + const transcription = results[0]; + + console.log(`Transcription: ${transcription}`); + }); + // [END speech_sync_recognize_gcs] +} + +function asyncRecognize (filename, encoding, sampleRate) { + // [START speech_async_recognize] + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); + + // Instantiates a client + const speech = Speech(); + + // The path to the local file on which to perform speech recognition, e.g. /path/to/audio.raw + // const filename = '/path/to/audio.raw'; + + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { + encoding: encoding, + sampleRate: sampleRate + }; + + // Detects speech in the audio file. This creates a recognition job that you + // can wait for now, or get its result later. + speech.startRecognition(filename, request) + .then((results) => { + const operation = results[0]; + // Get a Promise represention of the final result of the job + return operation.promise(); + }) + .then((transcription) => { console.log(`Transcription: ${transcription}`); - return transcription; }); + // [END speech_async_recognize] } -// [END speech_sync_recognize] -// [START speech_async_recognize] -function asyncRecognize (filename) { +function asyncRecognizeGCS (gcsUri, encoding, sampleRate) { + // [START speech_async_recognize_gcs] + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); + // Instantiates a client const speech = Speech(); - const config = { - // Configure these settings based on the audio you're transcribing - encoding: 'LINEAR16', - sampleRate: 16000 + // The Google Cloud Storage URI of the file on which to perform speech recognition, e.g. gs://my-bucket/audio.raw + // const gcsUri = 'gs://my-bucket/audio.raw'; + + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { + encoding: encoding, + sampleRate: sampleRate }; - // Detects speech in the audio file, e.g. "./resources/audio.raw" - // This creates a recognition job that you can wait for now, or get its result - // later. - return speech.startRecognition(filename, config) + // Detects speech in the audio file. This creates a recognition job that you + // can wait for now, or get its result later. + speech.startRecognition(gcsUri, request) .then((results) => { const operation = results[0]; - // Get a Promise represention the final result of the job + // Get a Promise represention of the final result of the job return operation.promise(); }) .then((transcription) => { console.log(`Transcription: ${transcription}`); - return transcription; }); + // [END speech_async_recognize_gcs] } -// [END speech_async_recognize] -// [START speech_streaming_recognize] -const fs = require('fs'); +function streamingRecognize (filename, encoding, sampleRate) { + // [START speech_streaming_recognize] + const fs = require('fs'); + + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); -function streamingRecognize (filename, callback) { // Instantiates a client const speech = Speech(); - const options = { + // The path to the local file on which to perform speech recognition, e.g. /path/to/audio.raw + // const filename = '/path/to/audio.raw'; + + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { config: { - // Configure these settings based on the audio you're transcribing - encoding: 'LINEAR16', - sampleRate: 16000 + encoding: encoding, + sampleRate: sampleRate } }; - // Create a recognize stream - const recognizeStream = speech.createRecognizeStream(options) - .on('error', callback) + // Stream the audio to the Google Cloud Speech API + const recognizeStream = speech.createRecognizeStream(request) + .on('error', console.error) .on('data', (data) => { console.log('Data received: %j', data); - callback(); }); // Stream an audio file from disk to the Speech API, e.g. "./resources/audio.raw" fs.createReadStream(filename).pipe(recognizeStream); + // [END speech_streaming_recognize] } -// [END speech_streaming_recognize] -// [START speech_streaming_mic_recognize] -const record = require('node-record-lpcm16'); +function streamingMicRecognize (encoding, sampleRate) { + // [START speech_streaming_mic_recognize] + const record = require('node-record-lpcm16'); + + // Imports the Google Cloud client library + const Speech = require('@google-cloud/speech'); -function streamingMicRecognize () { // Instantiates a client const speech = Speech(); - const options = { + // The encoding of the audio file, e.g. 'LINEAR16' + // const encoding = 'LINEAR16'; + + // The sample rate of the audio file, e.g. 16000 + // const sampleRate = 16000; + + const request = { config: { - // Configure these settings based on the audio you're transcribing - encoding: 'LINEAR16', - sampleRate: 16000 + encoding: encoding, + sampleRate: sampleRate } }; // Create a recognize stream - const recognizeStream = speech.createRecognizeStream(options) + const recognizeStream = speech.createRecognizeStream(request) .on('error', console.error) .on('data', (data) => process.stdout.write(data.results)); // Start recording and send the microphone input to the Speech API record.start({ - sampleRate: 16000, + sampleRate: sampleRate, threshold: 0 }).pipe(recognizeStream); console.log('Listening, press Ctrl+C to stop.'); + // [END speech_streaming_mic_recognize] } -// [END speech_streaming_mic_recognize] require(`yargs`) .demand(1) .command( `sync `, - `Detects speech in an audio file.`, + `Detects speech in a local audio file.`, {}, - (opts) => syncRecognize(opts.filename) + (opts) => syncRecognize(opts.filename, opts.encoding, opts.sampleRate) + ) + .command( + `sync-gcs `, + `Detects speech in an audio file located in a Google Cloud Storage bucket.`, + {}, + (opts) => syncRecognizeGCS(opts.gcsUri, opts.encoding, opts.sampleRate) ) .command( `async `, - `Creates a job to detect speech in an audio file, and waits for the job to complete.`, + `Creates a job to detect speech in a local audio file, and waits for the job to complete.`, {}, - (opts) => asyncRecognize(opts.filename) + (opts) => asyncRecognize(opts.filename, opts.encoding, opts.sampleRate) + ) + .command( + `async-gcs `, + `Creates a job to detect speech in an audio file located in a Google Cloud Storage bucket, and waits for the job to complete.`, + {}, + (opts) => asyncRecognizeGCS(opts.gcsUri, opts.encoding, opts.sampleRate) ) .command( `stream `, - `Detects speech in an audio file by streaming it to the Speech API.`, + `Detects speech in a local audio file by streaming it to the Speech API.`, {}, - (opts) => streamingRecognize(opts.filename, () => {}) + (opts) => streamingRecognize(opts.filename, opts.encoding, opts.sampleRate) ) .command( `listen`, `Detects speech in a microphone input stream.`, {}, - streamingMicRecognize + (opts) => streamingMicRecognize(opts.encoding, opts.sampleRate) ) - .example(`node $0 sync ./resources/audio.raw`) - .example(`node $0 async ./resources/audio.raw`) - .example(`node $0 stream ./resources/audio.raw`) + .options({ + encoding: { + alias: 'e', + default: 'LINEAR16', + global: true, + requiresArg: true, + type: 'string' + }, + sampleRate: { + alias: 'r', + default: 16000, + global: true, + requiresArg: true, + type: 'number' + } + }) + .example(`node $0 sync ./resources/audio.raw -e LINEAR16 -r 16000`) + .example(`node $0 async-gcs gs://my-bucket/audio.raw -e LINEAR16 -r 16000`) + .example(`node $0 stream ./resources/audio.raw -e LINEAR16 -r 16000`) .example(`node $0 listen`) .wrap(120) .recommendCommands() diff --git a/speech/system-test/recognize.test.js b/speech/system-test/recognize.test.js index d35f266f2a1..9ba06fd8643 100644 --- a/speech/system-test/recognize.test.js +++ b/speech/system-test/recognize.test.js @@ -18,23 +18,49 @@ require(`../../system-test/_setup`); const path = require(`path`); +const storage = require(`@google-cloud/storage`)(); +const uuid = require(`uuid`); +const bucketName = `nodejs-docs-samples-test-${uuid.v4()}`; const cmd = `node recognize.js`; const cwd = path.join(__dirname, `..`); -const filename = `./resources/audio.raw`; +const filename = `audio.raw`; +const filepath = path.join(__dirname, `../resources/${filename}`); const text = `how old is the Brooklyn Bridge`; +test.before(async () => { + const [bucket] = await storage.createBucket(bucketName); + await bucket.upload(filepath); +}); + +test.after.always(async () => { + const bucket = storage.bucket(bucketName); + await bucket.deleteFiles({ force: true }); + await bucket.deleteFiles({ force: true }); // Try a second time... + await bucket.delete(); +}); + test(`should run sync recognize`, async (t) => { - const output = await runAsync(`${cmd} sync ${filename}`, cwd); + const output = await runAsync(`${cmd} sync ${filepath}`, cwd); + t.true(output.includes(`Transcription: ${text}`)); +}); + +test(`should run sync recognize on a GCS file`, async (t) => { + const output = await runAsync(`${cmd} sync-gcs gs://${bucketName}/${filename}`, cwd); + t.true(output.includes(`Transcription: ${text}`)); +}); + +test(`should run async recognize on a local file`, async (t) => { + const output = await runAsync(`${cmd} async ${filepath}`, cwd); t.true(output.includes(`Transcription: ${text}`)); }); -test(`should run async recognize`, async (t) => { - const output = await runAsync(`${cmd} async ${filename}`, cwd); +test(`should run async recognize on a GCS file`, async (t) => { + const output = await runAsync(`${cmd} async-gcs gs://${bucketName}/${filename}`, cwd); t.true(output.includes(`Transcription: ${text}`)); }); test(`should run streaming recognize`, async (t) => { - const output = await runAsync(`${cmd} stream ${filename}`, cwd); + const output = await runAsync(`${cmd} stream ${filepath}`, cwd); t.true(output.includes(text)); }); diff --git a/speech/yarn.lock b/speech/yarn.lock index d4c2370070e..03b58d72c79 100644 --- a/speech/yarn.lock +++ b/speech/yarn.lock @@ -2,9 +2,23 @@ # yarn lockfile v1 -"@google-cloud/common@^0.9.0": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.9.1.tgz#c72249589046fb4dd131b8ae7dbea88bb6bcf88c" +"@google-cloud/common-grpc@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@google-cloud/common-grpc/-/common-grpc-0.1.1.tgz#0facc6c5e90eb9072bd4b602451248250bbf3ba0" + dependencies: + "@google-cloud/common" "^0.11.0" + dot-prop "^2.4.0" + duplexify "^3.5.0" + extend "^3.0.0" + google-proto-files "^0.8.6" + grpc "~1.0.1" + is "^3.2.0" + retry-request "^1.3.2" + through2 "^2.0.3" + +"@google-cloud/common@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.11.0.tgz#5c94674a1ea9a4939865e342f0c1b909ca04e980" dependencies: array-uniq "^1.0.2" arrify "^1.0.0" @@ -18,6 +32,7 @@ google-proto-files "^0.8.0" grpc "^1.0.0" is "^3.0.1" + log-driver "^1.2.5" methmeth "^1.0.0" modelo "^4.2.0" request "^2.70.0" @@ -27,11 +42,37 @@ string-format-obj "^1.0.0" through2 "^2.0.0" -"@google-cloud/speech@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@google-cloud/speech/-/speech-0.5.0.tgz#67f9adad2a67027f5ef2c1b16f13cf276763ac63" +"@google-cloud/common@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@google-cloud/common/-/common-0.12.0.tgz#b1cb0922c70f7e5273e402b0a6ae71de2f32abc3" dependencies: - "@google-cloud/common" "^0.9.0" + array-uniq "^1.0.3" + arrify "^1.0.1" + concat-stream "^1.6.0" + create-error-class "^3.0.2" + dot-prop "^2.4.0" + duplexify "^3.5.0" + ent "^2.2.0" + extend "^3.0.0" + google-auto-auth "^0.5.2" + google-proto-files "^0.8.6" + is "^3.2.0" + log-driver "^1.2.5" + methmeth "^1.1.0" + modelo "^4.2.0" + request "^2.79.0" + retry-request "^1.3.2" + split-array-stream "^1.0.0" + stream-events "^1.0.1" + string-format-obj "^1.1.0" + through2 "^2.0.3" + +"@google-cloud/speech@0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@google-cloud/speech/-/speech-0.6.0.tgz#161e9bb3f3aca4ed7acb65e1fdd8286ac34b41e8" + dependencies: + "@google-cloud/common" "^0.12.0" + "@google-cloud/common-grpc" "^0.1.1" events-intercept "^2.0.0" extend "^3.0.0" google-gax "^0.10.2" @@ -44,6 +85,27 @@ string-format-obj "^1.1.0" through2 "^2.0.1" +"@google-cloud/storage@0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-0.6.1.tgz#c0cb2966839b259b82ec3f04f34af61b5b2f4ec4" + dependencies: + "@google-cloud/common" "^0.11.0" + arrify "^1.0.0" + async "^2.0.1" + concat-stream "^1.5.0" + create-error-class "^3.0.2" + duplexify "^3.2.0" + extend "^3.0.0" + gcs-resumable-upload "^0.7.1" + hash-stream-validation "^0.2.1" + is "^3.0.1" + mime-types "^2.0.8" + once "^1.3.1" + pumpify "^1.3.3" + stream-events "^1.0.1" + string-format-obj "^1.0.0" + through2 "^2.0.0" + abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -71,11 +133,11 @@ arguejs@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/arguejs/-/arguejs-0.2.3.tgz#b6f939f5fe0e3cd1f3f93e2aa9262424bf312af7" -array-uniq@^1.0.2: +array-uniq@^1.0.2, array-uniq@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -174,6 +236,10 @@ buffer-equal-constant-time@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -257,7 +323,7 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -273,6 +339,19 @@ concat-stream@~1.4.7: readable-stream "~1.1.9" typedarray "~0.0.5" +configstore@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -327,7 +406,7 @@ dot-prop@^2.4.0: dependencies: is-obj "^1.0.0" -duplexify@^3.1.2, duplexify@^3.2.0: +duplexify@^3.1.2, duplexify@^3.2.0, duplexify@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" dependencies: @@ -449,6 +528,18 @@ gauge@~2.7.1: supports-color "^0.2.0" wide-align "^1.1.0" +gcs-resumable-upload@^0.7.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/gcs-resumable-upload/-/gcs-resumable-upload-0.7.4.tgz#6633967badf7a4aed2d79337e7badfe889cfd617" + dependencies: + buffer-equal "0.0.1" + configstore "^1.2.1" + google-auto-auth "^0.2.1" + pumpify "^1.3.3" + request "^2.61.0" + stream-events "^1.0.1" + through2 "^2.0.0" + generate-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" @@ -494,7 +585,7 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -google-auth-library@^0.9.10: +google-auth-library@^0.9.10, google-auth-library@^0.9.6: version "0.9.10" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.9.10.tgz#4993dc07bb4834b8ca0350213a6873a32c6051b9" dependencies: @@ -505,6 +596,13 @@ google-auth-library@^0.9.10: request "~2.74.0" string-template "~0.2.0" +google-auto-auth@^0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.2.4.tgz#16dafbf150d353a42190979c6803ffc75f6455fa" + dependencies: + google-auth-library "^0.9.6" + object-assign "^3.0.0" + google-auto-auth@^0.5.0, google-auto-auth@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/google-auto-auth/-/google-auto-auth-0.5.2.tgz#4c9f38574e69fb55a3c516ab0415e9fa33e67602" @@ -532,11 +630,11 @@ google-p12-pem@^0.1.0: dependencies: node-forge "^0.6.46" -google-proto-files@^0.8.0, google-proto-files@^0.8.3: +google-proto-files@^0.8.0, google-proto-files@^0.8.3, google-proto-files@^0.8.6: version "0.8.6" resolved "https://registry.yarnpkg.com/google-proto-files/-/google-proto-files-0.8.6.tgz#a7c8ddccd2179690d270b0ebfc42994d56da0ee6" -graceful-fs@^4.1.2: +graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -544,7 +642,7 @@ graceful-fs@^4.1.2: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -grpc@^1.0.0, grpc@~1.0: +grpc@^1.0.0, grpc@~1.0, grpc@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/grpc/-/grpc-1.0.1.tgz#e965544b5e56c998058102184e2ab1f27f123afd" dependencies: @@ -582,6 +680,12 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +hash-stream-validation@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz#ecc9b997b218be5bb31298628bb807869b73dcd1" + dependencies: + through2 "^2.0.0" + hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -607,6 +711,10 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + indent-string@^1.1.0: version "1.2.2" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-1.2.2.tgz#db99bcc583eb6abbb1e48dcbb1999a986041cb6b" @@ -685,7 +793,7 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" -is@^3.0.1, is@^3.1.0: +is@^3.0.1, is@^3.1.0, is@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/is/-/is-3.2.0.tgz#a362e3daf7df3fd8b7114115d624c5b7e1cb90f7" @@ -770,6 +878,10 @@ lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +log-driver@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" @@ -787,7 +899,7 @@ meow@~2.0.0: minimist "^1.1.0" object-assign "^1.0.0" -methmeth@^1.0.0: +methmeth@^1.0.0, methmeth@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/methmeth/-/methmeth-1.1.0.tgz#e80a26618e52f5c4222861bb748510bd10e29089" @@ -795,7 +907,7 @@ mime-db@~1.25.0: version "1.25.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: +mime-types@^2.0.8, mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: version "2.1.13" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" dependencies: @@ -819,7 +931,7 @@ minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -"mkdirp@>=0.5 0", mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -903,7 +1015,7 @@ object-assign@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" -object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" @@ -923,12 +1035,27 @@ optjs@~3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/optjs/-/optjs-3.2.2.tgz#69a6ce89c442a44403141ad2f9b370bd5bb6f4ee" +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" dependencies: lcid "^1.0.0" +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -991,7 +1118,7 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.5: +pumpify@^1.3.3, pumpify@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" dependencies: @@ -1110,7 +1237,7 @@ request@2.76.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" -request@^2.70.0, request@^2.72.0, request@^2.74.0, request@^2.79.0: +request@^2.61.0, request@^2.70.0, request@^2.72.0, request@^2.74.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" dependencies: @@ -1169,7 +1296,7 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -retry-request@^1.3.0: +retry-request@^1.3.0, retry-request@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/retry-request/-/retry-request-1.3.2.tgz#59ad24e71f8ae3f312d5f7b4bcf467a5e5a57bd6" dependencies: @@ -1198,6 +1325,10 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -1323,7 +1454,7 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" -through2@^2.0.0, through2@^2.0.1: +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -1356,6 +1487,10 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -1398,6 +1533,20 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" +write-file-atomic@^1.1.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"