├── .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 | [](https://travis-ci.org/lucasconstantino/now-micro)
4 | [](https://codecov.io/github/lucasconstantino/now-micro)
5 | [](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 |
--------------------------------------------------------------------------------