├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── builder.js ├── package.json ├── test ├── builder.test.js └── fixtures │ └── sample-project │ ├── async.js │ ├── error.js │ ├── index.js │ ├── invalid.js │ ├── now.json │ ├── package.json │ ├── returning.js │ └── yarn.lock └── yarn.lock /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["taller"], 3 | "rules": { 4 | "no-unused-expressions": "off", 5 | "import/prefer-default-export": 0 6 | }, 7 | "globals": { 8 | "jest": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | test 3 | .babelrc 4 | .eslintrc 5 | .gitignore 6 | .travis.yml 7 | yarn.lock 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "stable" 4 | - "10" 5 | - "9" 6 | - "8" 7 | after_script: 8 | - "npm run codecov" 9 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | # 0.4.0 (2019-05-20) 7 | 8 | 9 | ### Bug Fixes 10 | 11 | * syntax error on builded code ([d97c62e](https://github.com/lucasconstantino/now-micro/commit/d97c62e)) 12 | 13 | 14 | ### Features 15 | 16 | * added initial builder as shallow copy from [@now](https://github.com/now)/node ([84b6fb4](https://github.com/lucasconstantino/now-micro/commit/84b6fb4)) 17 | * implemented builder ([f46e555](https://github.com/lucasconstantino/now-micro/commit/f46e555)) 18 | 19 | 20 | 21 | 22 | # [0.3.0](https://github.com/lucasconstantino/now-micro/compare/v0.2.0...v0.3.0) (2019-01-04) 23 | 24 | 25 | ### Bug Fixes 26 | 27 | * syntax error on builded code ([d97c62e](https://github.com/lucasconstantino/now-micro/commit/d97c62e)) 28 | 29 | 30 | ### Features 31 | 32 | * implemented builder ([f46e555](https://github.com/lucasconstantino/now-micro/commit/f46e555)) 33 | 34 | 35 | 36 | 37 | # 0.2.0 (2019-01-03) 38 | 39 | 40 | ### Features 41 | 42 | * added initial builder as shallow copy from [@now](https://github.com/now)/node ([84b6fb4](https://github.com/lucasconstantino/now-micro/commit/84b6fb4)) 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Lucas Constantino Silva 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Now Micro 2 | 3 | [![Build Status](https://travis-ci.org/lucasconstantino/now-micro.svg?branch=master)](https://travis-ci.org/lucasconstantino/now-micro) 4 | [![coverage](https://img.shields.io/codecov/c/github/lucasconstantino/now-micro.svg?style=flat-square)](https://codecov.io/github/lucasconstantino/now-micro) 5 | [![npm version](https://img.shields.io/npm/v/now-micro.svg?style=flat-square)](https://www.npmjs.com/package/now-micro) 6 | 7 | Proper Micro builder for [Now 2.0](https://zeit.co/blog/now-2) 8 | 9 | ## Purpose 10 | 11 | As of now, `@now/node` lambdas resemble a lot a [Micro](https://github.com/zeit/micro) environment, but it is just not that, which causes quite a lot of [unexpected](https://hyperion.alpha.spectrum.chat/zeit/now/504-lambda-invocation-timeout~dd711cf6-347d-4a91-83b3-c2ae097c4ce1) [results](https://github.com/zeit/now-builders/issues/133). 12 | 13 | ## Installation 14 | 15 | `yarn add now-micro micro` 16 | 17 | > Gotcha: so far we found no way to inject `micro` dependency during the build process, so it MUST be a dependency of your lambda, thus why we added it to the above command ;) 18 | 19 | ## Usage 20 | 21 | Use `now-micro` in your builders on `now.json`: 22 | 23 | ```json 24 | { 25 | "version": 2, 26 | "builds": [{ "src": "file.js", "use": "now-micro" }] 27 | } 28 | ``` 29 | 30 | Develop your lambdas as a fully Micro compatible function: 31 | 32 | ```js 33 | // ex. showing async usage and value returning (no res.end): 34 | module.exports = async req => Promise.resolve(`Some result`) 35 | ``` 36 | -------------------------------------------------------------------------------- /builder.js: -------------------------------------------------------------------------------- 1 | const { ensureDirSync, writeFileSync } = require('fs-extra') 2 | const { basename, dirname, join: pathJoin } = require('path') 3 | const FileBlob = require('@now/build-utils/file-blob') 4 | const FileFsRef = require('@now/build-utils/file-fs-ref') 5 | const { build: nodeBuild, prepareCache, config } = require('@now/node') 6 | 7 | // re-export equivalent assets 8 | module.exports.config = config 9 | module.exports.prepareCache = prepareCache 10 | 11 | /** 12 | * Now.sh builder for micro-compatible lambdas. 13 | * 14 | * @TODO: should ensure package.json contains micro dependency. 15 | */ 16 | module.exports.build = async (context, ...args) => { 17 | const { entrypoint, workPath } = context 18 | 19 | const stream = context.files[entrypoint].toStream() 20 | const { data } = await FileBlob.fromStream({ stream }) 21 | 22 | const content = `${data.toString()} 23 | let __original_lambda 24 | 25 | if (typeof exports === 'function') { 26 | __original_lambda = exports 27 | } 28 | else if (typeof module.exports === 'function') { 29 | __original_lambda = module.exports 30 | } 31 | else { 32 | throw new Error( 33 | \`now-micro builder expects main export to be a function (\${typeof module.exports} found)\`, 34 | ) 35 | } 36 | 37 | exports = module.exports = (req, res) => require('micro').run(req, res, __original_lambda) 38 | ` 39 | const fileDir = pathJoin(workPath, dirname(entrypoint).replace(__dirname, '')) 40 | const filePath = pathJoin(fileDir, basename(entrypoint)) 41 | await ensureDirSync(fileDir, { recursive: true }) 42 | await writeFileSync(filePath, content) 43 | 44 | // override entrypoint file 45 | context.files[entrypoint] = new FileFsRef({ fsPath: filePath }) 46 | 47 | // delegate to @now/node the rest of the building process 48 | return nodeBuild(context, ...args) 49 | } 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "now-micro", 3 | "version": "0.4.0", 4 | "description": "The missing Micro builder for Now 2.0", 5 | "keywords": [ 6 | "builder", 7 | "micro", 8 | "now" 9 | ], 10 | "homepage": "https://github.com/lucasconstantino/now-micro#readme", 11 | "bugs": { 12 | "url": "https://github.com/lucasconstantino/now-micro/issues" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/lucasconstantino/now-micro.git" 17 | }, 18 | "license": "MIT", 19 | "author": "Lucas Constantino Silva ", 20 | "main": "./builder.js", 21 | "module": "./builder.js", 22 | "jsnext:main": "./builder.js", 23 | "scripts": { 24 | "codecov": "yarn test && codecov", 25 | "lint": "eslint lib", 26 | "prepublish": "yarn qa", 27 | "prepush": "yarn qa", 28 | "qa": "yarn test && yarn lint", 29 | "release": "standard-version", 30 | "test": "jest test" 31 | }, 32 | "jest": { 33 | "collectCoverage": true, 34 | "collectCoverageFrom": [ 35 | "*.js" 36 | ], 37 | "moduleNameMapper": { 38 | "^now-micro(.*)$": "/$1" 39 | }, 40 | "testEnvironment": "node" 41 | }, 42 | "dependencies": { 43 | "@now/node": "^0.7.2", 44 | "fs-extra": "^8.0.1" 45 | }, 46 | "devDependencies": { 47 | "@now/build-utils": "^0.5.5", 48 | "codecov": "^3.0.2", 49 | "console-suppress": "^0.1.1", 50 | "eslint": "^4.19.1", 51 | "eslint-config-taller": "^2.0.0", 52 | "husky": "^1.3.1", 53 | "jest": "^23.6.0", 54 | "now-we-test": "^0.4.0", 55 | "standard-version": "^4.4.0", 56 | "then-sleep": "^1.0.1", 57 | "tmp": "^0.0.33" 58 | }, 59 | "peerDependencies": { 60 | "@now/build-utils": "^0.5.5" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /test/builder.test.js: -------------------------------------------------------------------------------- 1 | jest.mock('@now/node', () => ({ 2 | config: {}, 3 | prepareCache: () => {}, 4 | build: ({ files, entrypoint }) => ({ [entrypoint]: files[entrypoint] }) 5 | })) 6 | 7 | const { removeSync } = require('fs-extra') 8 | const tmp = require('tmp') 9 | const path = require('path') 10 | const nodeBuilder = require('@now/node') 11 | const FileBlob = require('@now/build-utils/file-blob') 12 | const FileFsRef = require('@now/build-utils/file-fs-ref') 13 | const microBuilder = require('now-micro') 14 | const { lambda } = require('now-we-test') 15 | const console = require('console-suppress').default 16 | 17 | const { build } = microBuilder 18 | 19 | describe('now-micro', () => { 20 | let tempDir 21 | 22 | const rootPath = path.resolve(__dirname, './fixtures/sample-project') 23 | 24 | const entrypoints = [ 25 | path.join(rootPath, '/index.js'), 26 | path.join(rootPath, '/invalid.js'), 27 | path.join(rootPath, '/error.js'), 28 | path.join(rootPath, '/returning.js'), 29 | path.join(rootPath, '/async.js') 30 | ] 31 | 32 | const getContext = (entrypoint, config = {}) => ({ 33 | config, 34 | workPath: tempDir.name, 35 | entrypoint, 36 | files: entrypoints.reduce( 37 | (carry, entrypoint) => ({ 38 | ...carry, 39 | [entrypoint]: new FileFsRef({ fsPath: entrypoint }) 40 | }), 41 | {} 42 | ) 43 | }) 44 | 45 | beforeEach(() => { 46 | // eslint-disable-next-line no-sync 47 | tempDir = tmp.dirSync() 48 | 49 | // cleanup suppressors 50 | console.cleanSuppressors() 51 | }) 52 | 53 | afterEach(() => { 54 | // cleanup temporary directory 55 | removeSync(tempDir.name) 56 | }) 57 | 58 | describe('build', () => { 59 | it('should re-export @now/node builder implementation', () => { 60 | expect(microBuilder.config).toBe(nodeBuilder.config) 61 | expect(microBuilder.prepareCache).toBe(nodeBuilder.prepareCache) 62 | }) 63 | 64 | it('should compile code correctly', async () => { 65 | const context = getContext(entrypoints[0]) 66 | 67 | const original = (await FileBlob.fromStream({ 68 | stream: context.files[entrypoints[0]].toStream() 69 | })).data.toString() 70 | 71 | const buildContext = await build(context) 72 | const data = (await FileBlob.fromStream({ 73 | stream: buildContext[entrypoints[0]].toStream() 74 | })).data.toString() 75 | 76 | expect(data.indexOf(original)).toBe(0) 77 | 78 | expect(data).toContain( 79 | 'exports = module.exports = (req, res) => require(\'micro\').run(req, res, __original_lambda)' 80 | ) 81 | }) 82 | }) 83 | 84 | describe('execution', () => { 85 | const compile = async entrypoint => { 86 | const content = (await FileBlob.fromStream({ 87 | stream: (await build(getContext(entrypoint)))[entrypoint].toStream() 88 | })).data.toString() 89 | 90 | let exports = {} 91 | // eslint-disable-next-line no-unused-vars 92 | let module = { exports } 93 | 94 | // eslint-disable-next-line no-eval 95 | eval(content) 96 | 97 | return exports 98 | } 99 | 100 | it('should throw when unable to figure out lambda', async () => { 101 | await expect(compile(entrypoints[1])).rejects.toThrow( 102 | 'now-micro builder expects main export to be a function (object found)' 103 | ) 104 | }) 105 | 106 | it('should compile to a micro executing lambda', async () => { 107 | const runner = await compile(entrypoints[0]) 108 | 109 | expect(runner.toString()).toBe( 110 | '(req, res) => require(\'micro\').run(req, res, __original_lambda)' 111 | ) 112 | }) 113 | 114 | it('should execute an http valid lambda', async () => { 115 | const runner = lambda(await compile(entrypoints[0])) 116 | const result = await runner.get('/') 117 | 118 | expect(result).toHaveProperty('status', 200) 119 | expect(result).toHaveProperty('text', 'SIMPLE HTTP LAMBDA') 120 | }) 121 | 122 | it('should execute an error throwing lambda', async () => { 123 | console.error.suppress(/ERROR THROWING LAMBDA/) 124 | 125 | const runner = lambda(await compile(entrypoints[2])) 126 | const result = await runner.get('/') 127 | 128 | expect(result).toHaveProperty('status', 400) 129 | expect(result).toHaveProperty('text', 'ERROR THROWING LAMBDA') 130 | }) 131 | 132 | it('should execute a value returning lambda', async () => { 133 | const runner = lambda(await compile(entrypoints[3])) 134 | const result = await runner.get('/') 135 | 136 | expect(result).toHaveProperty('status', 200) 137 | expect(result).toHaveProperty('text', 'VALUE RETURNING LAMBDA') 138 | }) 139 | 140 | it('should execute an async lambda', async () => { 141 | const runner = lambda(await compile(entrypoints[4])) 142 | const result = await runner.get('/') 143 | 144 | expect(result).toHaveProperty('status', 200) 145 | expect(result).toHaveProperty('text', 'ASYNC LAMBDA') 146 | }) 147 | }) 148 | }) 149 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/async.js: -------------------------------------------------------------------------------- 1 | const sleep = require('then-sleep') 2 | 3 | module.exports = async (req, res) => { 4 | await sleep(1000) 5 | res.end('ASYNC LAMBDA') 6 | } 7 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/error.js: -------------------------------------------------------------------------------- 1 | const { createError } = require('micro') 2 | 3 | module.exports = async (req, res) => { 4 | throw createError(400, 'ERROR THROWING LAMBDA') 5 | } 6 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/index.js: -------------------------------------------------------------------------------- 1 | module.exports = (req, res) => { 2 | res.end('SIMPLE HTTP LAMBDA') 3 | } 4 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/invalid.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-console 2 | console.log('some invalid lambda file') 3 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/now.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { "src": "index.js", "use": "now-micro" }, 5 | { "src": "invalid.js", "use": "now-micro" }, 6 | { "src": "error.js", "use": "now-micro" }, 7 | { "src": "returning.js", "use": "now-micro" }, 8 | { "src": "async.js", "use": "now-micro" } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "micro": "^9.3.3", 4 | "now-micro": "^0.3.0", 5 | "then-sleep": "^1.0.1" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/returning.js: -------------------------------------------------------------------------------- 1 | module.exports = () => 'VALUE RETURNING LAMBDA' 2 | -------------------------------------------------------------------------------- /test/fixtures/sample-project/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@now/node-bridge@^0.1.9": 6 | version "0.1.9" 7 | resolved "https://registry.yarnpkg.com/@now/node-bridge/-/node-bridge-0.1.9.tgz#30ed2d137e4cd93af908f8ec528595d20d0c3889" 8 | integrity sha512-yisxXv7s3z5iF5wM1tLJ+fOh77eVFqV2VOyJYFMGlGaEthOkB2JV2nfsnip1dIeEuom7ekhJomHN09KpNOsBDw== 9 | 10 | "@now/node@^0.4.27": 11 | version "0.4.27" 12 | resolved "https://registry.yarnpkg.com/@now/node/-/node-0.4.27.tgz#c53ef9c9a37d5ce88f653bc30d5e8bce5254a5d7" 13 | integrity sha512-LDpLSdHjqpYoIOsZLZj2+gkc6ZYLdei5pFZevtfc0HuGR6Z5aSwgfmHg9fspSWmvch0/Huzg27Df3zzgZfjS6A== 14 | dependencies: 15 | "@now/node-bridge" "^0.1.9" 16 | fs-extra "7.0.1" 17 | 18 | ansi-styles@^3.2.1: 19 | version "3.2.1" 20 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 21 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 22 | dependencies: 23 | color-convert "^1.9.0" 24 | 25 | arg@2.0.0: 26 | version "2.0.0" 27 | resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" 28 | integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== 29 | 30 | bytes@3.0.0: 31 | version "3.0.0" 32 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 33 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 34 | 35 | chalk@2.4.0: 36 | version "2.4.0" 37 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" 38 | integrity sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw== 39 | dependencies: 40 | ansi-styles "^3.2.1" 41 | escape-string-regexp "^1.0.5" 42 | supports-color "^5.3.0" 43 | 44 | color-convert@^1.9.0: 45 | version "1.9.3" 46 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 47 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 48 | dependencies: 49 | color-name "1.1.3" 50 | 51 | color-name@1.1.3: 52 | version "1.1.3" 53 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 54 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 55 | 56 | content-type@1.0.4: 57 | version "1.0.4" 58 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 59 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 60 | 61 | depd@1.1.1: 62 | version "1.1.1" 63 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 64 | integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= 65 | 66 | escape-string-regexp@^1.0.5: 67 | version "1.0.5" 68 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 69 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 70 | 71 | fs-extra@7.0.1: 72 | version "7.0.1" 73 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 74 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 75 | dependencies: 76 | graceful-fs "^4.1.2" 77 | jsonfile "^4.0.0" 78 | universalify "^0.1.0" 79 | 80 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 81 | version "4.1.15" 82 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 83 | integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 84 | 85 | has-flag@^3.0.0: 86 | version "3.0.0" 87 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 88 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 89 | 90 | http-errors@1.6.2: 91 | version "1.6.2" 92 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 93 | integrity sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY= 94 | dependencies: 95 | depd "1.1.1" 96 | inherits "2.0.3" 97 | setprototypeof "1.0.3" 98 | statuses ">= 1.3.1 < 2" 99 | 100 | iconv-lite@0.4.19: 101 | version "0.4.19" 102 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 103 | integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== 104 | 105 | inherits@2.0.3: 106 | version "2.0.3" 107 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 108 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 109 | 110 | is-stream@1.1.0: 111 | version "1.1.0" 112 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 113 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 114 | 115 | jsonfile@^4.0.0: 116 | version "4.0.0" 117 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 118 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 119 | optionalDependencies: 120 | graceful-fs "^4.1.6" 121 | 122 | micro@^9.3.3: 123 | version "9.3.3" 124 | resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.3.tgz#32728c7be15e807691ead85da27fd8117a8bca24" 125 | integrity sha512-GbCp4NFQguARch0odX+BuWDja2Kc1pbYZqWfRvEDihGFTJG8U77C0L+Owg2j7TPyhQ5Tc+7z/SxspRqjdiZCjQ== 126 | dependencies: 127 | arg "2.0.0" 128 | chalk "2.4.0" 129 | content-type "1.0.4" 130 | is-stream "1.1.0" 131 | raw-body "2.3.2" 132 | 133 | native-or-bluebird@^1.2.0: 134 | version "1.2.0" 135 | resolved "https://registry.yarnpkg.com/native-or-bluebird/-/native-or-bluebird-1.2.0.tgz#39c47bfd7825d1fb9ffad32210ae25daadf101c9" 136 | integrity sha1-OcR7/Xgl0fuf+tMiEK4l2q3xAck= 137 | 138 | now-micro@^0.3.0: 139 | version "0.3.0" 140 | resolved "https://registry.yarnpkg.com/now-micro/-/now-micro-0.3.0.tgz#34a53d258a7661dcc8a6a29f0349a6ad85d0fc73" 141 | integrity sha512-VnKjjxbWsv779puWiGxlt6Eb3W2kcTbWbuanNCgy/b4OMgigZdVhWbOug+Q2Ltw89NZgf7LtK4XxPzumxls81g== 142 | dependencies: 143 | "@now/node" "^0.4.27" 144 | 145 | raw-body@2.3.2: 146 | version "2.3.2" 147 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" 148 | integrity sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k= 149 | dependencies: 150 | bytes "3.0.0" 151 | http-errors "1.6.2" 152 | iconv-lite "0.4.19" 153 | unpipe "1.0.0" 154 | 155 | setprototypeof@1.0.3: 156 | version "1.0.3" 157 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 158 | integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= 159 | 160 | "statuses@>= 1.3.1 < 2": 161 | version "1.5.0" 162 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 163 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 164 | 165 | supports-color@^5.3.0: 166 | version "5.5.0" 167 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 168 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 169 | dependencies: 170 | has-flag "^3.0.0" 171 | 172 | then-sleep@^1.0.1: 173 | version "1.0.1" 174 | resolved "https://registry.yarnpkg.com/then-sleep/-/then-sleep-1.0.1.tgz#759823bdc4de56ba2a20812868eb872a803ed1f9" 175 | integrity sha1-dZgjvcTeVroqIIEoaOuHKoA+0fk= 176 | dependencies: 177 | native-or-bluebird "^1.2.0" 178 | 179 | universalify@^0.1.0: 180 | version "0.1.2" 181 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 182 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 183 | 184 | unpipe@1.0.0: 185 | version "1.0.0" 186 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 187 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 188 | --------------------------------------------------------------------------------