diff --git a/.circleci/config.yml b/.circleci/config.yml index d60b3dc9e..5bc16d777 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,6 +5,8 @@ jobs: docker: - image: circleci/node:10 working_directory: ~/repo + environment: + GOPATH: $HOME/go steps: - checkout - restore_cache: @@ -12,17 +14,47 @@ jobs: - v1-dependencies-{{ checksum "yarn.lock" }} # fallback to using the latest cache if no exact match is found - v1-dependencies- + - run: + name: Updating apt packages + command: sudo apt-get update + - run: + name: Installing the latest version of Go + command: sudo apt-get install golang-go - run: name: Installing Dependencies - command: yarn + command: yarn install - save_cache: paths: - node_modules + - packages/now-build-utils/node_modules + - packages/now-cgi/node_modules + - packages/now-cli/node_modules + - packages/now-client/node_modules + - packages/now-go/node_modules + - packages/now-next/node_modules + - packages/now-node/node_modules + - packages/now-node-bridge/node_modules + - packages/now-python/node_modules + - packages/now-routing-utils/node_modules + - packages/now-ruby/node_modules + - packages/now-static-build/node_modules key: v1-dependencies-{{ checksum "yarn.lock" }} - persist_to_workspace: root: . paths: - node_modules + - packages/now-build-utils/node_modules + - packages/now-cgi/node_modules + - packages/now-cli/node_modules + - packages/now-client/node_modules + - packages/now-go/node_modules + - packages/now-next/node_modules + - packages/now-node/node_modules + - packages/now-node-bridge/node_modules + - packages/now-python/node_modules + - packages/now-routing-utils/node_modules + - packages/now-ruby/node_modules + - packages/now-static-build/node_modules build: docker: @@ -39,12 +71,26 @@ jobs: name: Building command: yarn build - store_artifacts: - path: dist + path: packages/now-cli/dist - persist_to_workspace: root: . paths: - - assets - - dist + - packages/now-build-utils/dist + - packages/now-cgi/dist + - packages/now-cli/dist + - packages/now-cli/assets + - packages/now-client/dist + - packages/now-go/dist + - packages/now-next/dist + - packages/now-node/dist + - packages/now-node/test/fixtures/15-helpers/ts/types.d.ts + - packages/now-node/test/fixtures/11-symlinks/symlink + - packages/now-node-bridge/index.js + - packages/now-node-bridge/bridge.js + - packages/now-python/dist + - packages/now-routing-utils/dist + - packages/now-ruby/dist + - packages/now-static-build/dist test-lint: docker: @@ -56,7 +102,7 @@ jobs: at: . - run: name: Compiling `now dev` HTML error templates - command: node ./scripts/compile-templates.js + command: node packages/now-cli/scripts/compile-templates.js - run: name: Linting Code command: yarn test-lint @@ -71,14 +117,14 @@ jobs: at: . - run: name: Compiling `now dev` HTML error templates - command: node ./scripts/compile-templates.js + command: node packages/now-cli/scripts/compile-templates.js - run: name: Running Unit Tests command: yarn test-unit --clean false - persist_to_workspace: root: . paths: - - .nyc_output + - packages/now-cli/.nyc_output test-integration-macos-node-8: macos: @@ -189,7 +235,7 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false @@ -207,7 +253,7 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false @@ -225,7 +271,7 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.56.0/hugo_0.56.0_macOS-64bit.tar.gz && tar -xzf hugo_0.56.0_macOS-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false @@ -243,7 +289,7 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false @@ -261,7 +307,7 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false @@ -279,11 +325,26 @@ jobs: command: node --version - run: name: Downloading Hugo - command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo test/dev/fixtures/08-hugo + command: curl -L -O https://github.com/gohugoio/hugo/releases/download/v0.55.6/hugo_0.55.6_Linux-64bit.tar.gz && tar -xzf hugo_0.55.6_Linux-64bit.tar.gz && mv ./hugo packages/now-cli/test/dev/fixtures/08-hugo/ - run: name: Running Integration Tests for `now dev` command: yarn test-integration-now-dev --clean false + test-integration-once: + docker: + - image: circleci/node:10 + working_directory: ~/repo + steps: + - checkout + - attach_workspace: + at: . + - run: + name: Output version + command: node --version + - run: + name: Running Integration Tests Once + command: yarn test-integration-once --clean false + coverage: docker: - image: circleci/node:10 @@ -294,7 +355,7 @@ jobs: at: . - run: name: Run coverage report - command: yarn coverage + command: yarn workspace now run coverage source-maps: docker: @@ -445,6 +506,12 @@ workflows: filters: tags: only: /.*/ + - test-integration-once: + requires: + - build + filters: + tags: + only: /.*/ - coverage: requires: - test-unit @@ -460,6 +527,7 @@ workflows: - test-integration-linux-now-dev-node-8 - test-integration-linux-now-dev-node-10 - test-integration-linux-now-dev-node-12 + - test-integration-once - test-lint filters: tags: diff --git a/.circleci/publish.sh b/.circleci/publish.sh new file mode 100755 index 000000000..92070f351 --- /dev/null +++ b/.circleci/publish.sh @@ -0,0 +1,34 @@ +#!/bin/bash +set -euo pipefail + +if [ -z "$NPM_TOKEN" ]; then + echo "NPM_TOKEN not found. Did you forget to assign the GitHub Action secret?" + exit 1 +fi + +echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + +if [ ! -e ~/.npmrc ]; then + echo "~/.npmrc file does not exist, skipping publish" + exit 0 +fi + +npm_tag="" +tag="$(git describe --tags --exact-match 2> /dev/null || :)" + +if [ -z "$tag" ]; then + echo "Not a tagged commit, skipping publish" + exit 0 +fi + +if [[ "$tag" =~ -canary ]]; then + echo "Publishing canary release" + npm_tag="--npm-tag canary" +else + echo "Publishing stable release" +fi + +# Sometimes this is a false alarm and blocks publish +git checkout yarn.lock + +yarn run lerna publish from-git $npm_tag --yes diff --git a/.circleci/run.sh b/.circleci/run.sh new file mode 100755 index 000000000..44c8b6e53 --- /dev/null +++ b/.circleci/run.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -euo pipefail + +if [ "$1" == "" ]; then + echo "Please provide at least one argument" + exit 1 +fi + +circleci_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +found="$(grep -rn \"""$1"\"": packages/*/package.json | cut -d '/' -f2 | uniq)" +modified="$(git diff origin/canary...HEAD --name-only | grep '^packages/' | cut -d '/' -f2 | uniq)" +echo "$found" > /tmp/found.txt +echo "$modified" > /tmp/modified.txt +pkgs="$(comm -12 <(sort /tmp/found.txt) <(sort /tmp/modified.txt))" +echo "The following packages were modified: " +echo "$pkgs" | wc -l +echo "$pkgs" + +for dir in $pkgs; do + echo "cd packages/$dir && yarn $1" + cd "$circleci_dir/../packages/$dir" + yarn "$1" +done \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6988158cd..693d1da70 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,18 @@ # Documentation # https://help.github.com/en/articles/about-code-owners -* @tootallnate @leo -/src/commands/dev/ @tootallnate @leo @styfle @AndyBitz -/src/util/dev/ @tootallnate @leo @styfle @AndyBitz -/src/commands/domains/ @javivelasco @mglagola @anatrajkovska -/src/commands/certs/ @javivelasco @mglagola @anatrajkovska +* @tootallnate @leo +/packages/now-cli/src/commands/dev/ @tootallnate @leo @styfle @AndyBitz +/packages/now-cli/src/util/dev/ @tootallnate @leo @styfle @AndyBitz +/packages/now-cli/src/commands/domains/ @javivelasco @mglagola @anatrajkovska +/packages/now-cli/src/commands/certs/ @javivelasco @mglagola @anatrajkovska +/packages/now-client @leo @rdev +/packages/now-build-utils @styfle @AndyBitz +/packages/now-node @styfle @tootallnate @lucleray +/packages/now-node-bridge @styfle @tootallnate @lucleray +/packages/now-next @Timer +/packages/now-go @styfle @sophearak +/packages/now-python @styfle @sophearak +/packages/now-ruby @styfle @coetry @nathancahill +/packages/now-static-build @styfle @AndyBitz +/packages/now-routing-utils @dav-is diff --git a/.gitignore b/.gitignore index e076694f7..41734517e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ node_modules package-lock.json dist -test/fixtures/integration npm-debug.log yarn-error.log .nyc_output @@ -9,11 +8,11 @@ coverage *.swp *.bak *.tgz -.builders -/assets -/src/util/dev/templates/*.ts -/test/**/yarn.lock -/test/**/node_modules -/test/dev/fixtures/08-hugo/hugo -/test/dev/fixtures/**/dist -/test/dev/fixtures/**/public +packages/now-cli/.builders +packages/now-cli/assets +packages/now-cli/src/util/dev/templates/*.ts +packages/now-cli/test/**/yarn.lock +packages/now-cli/test/**/node_modules +packages/now-cli/test/dev/fixtures/08-hugo/hugo +packages/now-cli/test/dev/fixtures/**/dist +packages/now-cli/test/dev/fixtures/**/public diff --git a/.yarnrc b/.yarnrc index fdd705c63..0b38d98e0 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1 +1 @@ -save-prefix "" +save-prefix "" \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..20a3be04c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,96 @@ +# Contributing + +When contributing to this repository, please first discuss the change you wish to make via [GitHub Issue](https://github.com/zeit/now-builders/issues/new) or [Spectrum](https://spectrum.chat/zeit) with the owners of this repository before submitting a Pull Request. + +Please read our [code of conduct](CODE_OF_CONDUCT.md) and follow it in all your interactions with the project. + +## Local development + +This project is configured in a monorepo pattern where one repo contains multiple npm packages. Dependencies are installed and managed with `yarn`, not `npm` CLI. + +To get started, execute the following: + +``` +git clone https://github.com/zeit/now-builders +yarn install +yarn bootstrap +yarn build +yarn lint +yarn test +``` + +Make sure all the tests pass before making changes. + +## Verifying your change + +Once you are done with your changes (we even suggest doing it along the way ), make sure all the test still run by running + +``` +yarn build && yarn test +``` + +from the root of the project. + +If any test fails, make sure to fix it along with your changes. See [Interpreting test errors](#Interpreting-test-errors) for more information about how the tests are executed, especially the integration tests. + +## Pull Request Process + +Once you are confident that your changes work properly, open a pull request on the main repository. + +The pull request will be reviewed by the maintainers and the tests will be checked by our continuous integration platform. + +## Interpreting test errors + +There are 2 kinds of tests in this repository – Unit tests and Integration tests. + +Unit tests are run locally with `jest` and execute quickly because they are testing the smallest units of code. + +### Integration tests + +Integration tests create deployments to your ZEIT account using the `test` project name. After each test is deployed, the `probes` key is used to check if the response is the expected value. If the value doesn't match, you'll see a message explaining the difference. If the deployment failed to build, you'll see a more generic message like the following: + +``` +[Error: Fetched page https://test-8ashcdlew.now.sh/root.js does not contain hello Root!. Instead it contains An error occurred with this application. + + NO_STATUS_CODE_FRO Response headers: + cache-control=s-maxage=0 + connection=close + content-type=text/plain; charset=utf-8 + date=Wed, 19 Jun 2019 18:01:37 GMT + server=now + strict-transport-security=max-age=63072000 + transfer-encoding=chunked + x-now-id=iad1:hgtzj-1560967297876-44ae12559f95 + x-now-trace=iad1] +``` + +In such cases you can visit the URL of the failed deployment and append `/_logs` so see the build error. In the case above, that would be https://test-8ashcdlew.now.sh/_logs + +The logs of this deployment will contain the actual error which may help you to understand what went wrong. + +### @zeit/node-file-trace + +Some of the Builders use `@zeit/node-file-trace` to tree-shake files before deployment. If you suspect an error with this tree-shaking mechanism, you can create the following script in your project: + +```js +const trace = require('@zeit/node-file-trace'); +trace(['path/to/entrypoint.js'], { + ts: true, + mixedModules: true, +}) + .then(o => console.log(o.fileList)) + .then(e => console.error(e)); +``` + +When you run this script, you'll see all imported files. If anything file is missing, the bug is in [@zeit/node-file-trace](https://github.com/zeit/node-file-trace) and not the Builder. + +## Deploy a Builder with existing project + +Sometimes you want to test changes to a Builder against an existing project, maybe with `now dev` or an actual deployment. You can avoid publishing every Builder change to npm by uploading the Builder as a tarball. + +1. Change directory to the desired Builder `cd ./packages/now-node` +2. Run `yarn build` to compile typescript and other build steps +3. Run `npm pack` to create a tarball file +4. Run `now *.tgz` to upload the tarball file and get a URL +5. Edit any existing `now.json` project and replace `use` with the URL +6. Run `now` or `now dev` to deploy with the experimental Builder diff --git a/DEVELOPING_A_BUILDER.md b/DEVELOPING_A_BUILDER.md new file mode 100644 index 000000000..b8db923dd --- /dev/null +++ b/DEVELOPING_A_BUILDER.md @@ -0,0 +1,447 @@ +# Builders Developer Reference + +The following page is a reference for how to create a Builder using the available Builder's API. + +A Builder is an npm module that exposes a `build` function and optionally an `analyze` function and `prepareCache` function. +Official Builders are published to [npmjs.com](https://npmjs.com) as a package and referenced in the `use` property of the `now.json` configuration file. +However, the `use` property will work with any [npm install argument](https://docs.npmjs.com/cli/install) such as a git repo url which is useful for testing your Builder. + +See the [Builders Documentation](https://zeit.co/docs/v2/advanced/builders) to view example usage. + +## Builder Exports + +### `version` + +A **required** exported constant that decides which version of the Builder API to use. + +The latest and suggested version is `2`. + +### `analyze` + +An **optional** exported function that returns a unique fingerprint used for the purpose of [build de-duplication](https://zeit.co/docs/v2/advanced/concepts/immutability#deduplication-algorithm). If the `analyze` function is not supplied, a random fingerprint is assigned to each build. + +```js +export analyze({ + files: Files, + entrypoint: String, + workPath: String, + config: Object +}) : String fingerprint +``` + +If you are using TypeScript, you should use the following types: + +```ts +import { AnalyzeOptions } from '@now/build-utils' + +export analyze(options: AnalyzeOptions) { + return 'fingerprint goes here' +} +``` + +### `build` + +A **required** exported function that returns a [Files](#files) data structure that contains the Build outputs, which can be a [Static File](#file) or a [Serverless Function](#serverless-function). + +What's a Serverless Function? Read about [Serverless Function concepts](https://zeit.co/docs/v2/deployments/concepts/lambdas) to learn more. + +```js +build({ + files: Files, + entrypoint: String, + workPath: String, + config: Object, + meta?: { + isDev?: Boolean, + requestPath?: String, + filesChanged?: Array, + filesRemoved?: Array + } +}) : { + watch: Array, + output: Files output, + routes: Object +} +``` + +If you are using TypeScript, you should use the following types: + +```ts +import { BuildOptions } from '@now/build-utils' + +export build(options: BuildOptions) { + // Build the code here + + return { + output: { + 'path-to-file': File, + 'path-to-lambda': Lambda + }, + watch: [], + routes: {} + } +} +``` + +### `prepareCache` + +An **optional** exported function that is equivalent to [`build`](#build), but it executes the instructions necessary to prepare a cache for the next run. + +```js +prepareCache({ + files: Files, + entrypoint: String, + workPath: String, + cachePath: String, + config: Object +}) : Files cacheOutput +``` + +If you are using TypeScript, you can import the types for each of these functions by using the following: + +```ts +import { PrepareCacheOptions } from '@now/build-utils' + +export prepareCache(options: PrepareCacheOptions) { + return { 'path-to-file': File } +} +``` + +### `shouldServe` + +An **optional** exported function that is only used by `now dev` in [Now CLI](https:///download) and indicates whether a [Builder](https://zeit.co/docs/v2/advanced/builders) wants to be responsible for building a certain request path. + +```js +shouldServe({ + entrypoint: String, + files: Files, + config: Object, + requestPath: String, + workPath: String +}) : Boolean +``` + +If you are using TypeScript, you can import the types for each of these functions by using the following: + +```ts +import { ShouldServeOptions } from '@now/build-utils' + +export shouldServe(options: ShouldServeOptions) { + return Boolean +} +``` + +If this method is not defined, Now CLI will default to [this function](https://github.com/zeit/now-builders/blob/52994bfe26c5f4f179bdb49783ee57ce19334631/packages/now-build-utils/src/should-serve.ts). + +### Builder Options + +The exported functions [`analyze`](#analyze), [`build`](#build), and [`prepareCache`](#preparecache) receive one argument with the following properties. + +**Properties:** + +- `files`: All source files of the project as a [Files](#files) data structure. +- `entrypoint`: Name of entrypoint file for this particular build job. Value `files[entrypoint]` is guaranteed to exist and be a valid [File](#files) reference. `entrypoint` is always a discrete file and never a glob, since globs are expanded into separate builds at deployment time. +- `workPath`: A writable temporary directory where you are encouraged to perform your build process. This directory will be populated with the restored cache from the previous run (if any) for [`analyze`](#analyze) and [`build`](#build). +- `cachePath`: A writable temporary directory where you can build a cache for the next run. This is only passed to `prepareCache`. +- `config`: An arbitrary object passed from by the user in the [Build definition](#defining-the-build-step) in `now.json`. + +## Example: html-minifier + +Let's walk through what it takes to create a simple builder that takes in a HTML source file and yields a minified HTML static file as its build output. + +While this is a very simple builder, the approach demonstrated here can be used to return anything: one or more static files and/or one or more lambdas. + +## Setting up the module + +### Defining the analyze step + +The `analyze` hook is optional. Its goal is to give the developer a tool to avoid wasting time _re-computing a build_ that has already occurred. + +The return value of `analyze` is a _fingerprint_: a simple string that uniquely identifies the build process. + +If `analyze` is not specified, its behavior is to use as the fingerprint the combined checksums of **all the files in the same directory level as the entrypoint**. This is a default that errs on making sure that we re-execute builds when files _other than the entrypoint_ (like dependencies, manifest files, etc) have changed. + +For our `html-minify` example, we know that HTML files don't have dependencies. Therefore, our analyze step can just return the `digest` of the entrypoint. + +Our `index.js` file looks as follows: + +```js +exports.analyze = function({ files, entrypoint }) { + return files[entrypoint].digest +} +``` + +This means that we will only re-minify and re-create the build output _only if the file contents (and therefore its digest) change._ + +### Defining the build step + +Your module will need some utilities to manipulate the data structures we pass you, create new ones and alter the filesystem. + +To that end, we expose our API as part of a `@now/build-utils` package. This package is always loaded on your behalf, so make sure it's only included as `peerDependencies` in your `package.json`. + +Builders can include dependencies of their liking: + +```js +const htmlMinifier = require('html-minifier') + +exports.version = 2 + +exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest + +exports.build = async ({ files, entrypoint, config }) => { + const stream = files[entrypoint].toStream() + const options = Object.assign({}, config || {}) + const { data } = await FileBlob.fromStream({ stream }) + const content = data.toString() + const minified = htmlMinifier(content, options) + const result = new FileBlob({ data: minified }) + + return { + output: { + [entrypoint]: result + }, + watch: [], + routes: {} + } +} +``` + +### Defining a `prepareCache` step + +If our builder had performed work that could be re-used in the next build invocation, we could define a `prepareCache` step. + +In this case, there are not intermediate artifacts that we can cache, and our `analyze` step already takes care of caching the full output based on the fingerprint of the input. + +## Technical Details + +### Execution Context + +A [Serverless Function](https://zeit.co/docs/v2/advanced/concepts/lambdas) is created where the builder logic is executed. The lambda is run using the Node.js 8 runtime. A brand new sandbox is created for each deployment, for security reasons. The sandbox is cleaned up between executions to ensure no lingering temporary files are shared from build to build. + +All the APIs you export ([`analyze`](#analyze), [`build`](#build) and [`prepareCache`](#preparecache)) are not guaranteed to be run in the same process, but the filesystem we expose (e.g.: `workPath` and the results of calling [`getWriteableDirectory`](#getWriteableDirectory) ) is retained. + +If you need to share state between those steps, use the filesystem. + +### Directory and Cache Lifecycle + +When a new build is created, we pre-populate the `workPath` supplied to `analyze` with the results of the `prepareCache` step of the previous build. + +The `analyze` step can modify that directory, and it will not be re-created when it's supplied to `build` and `prepareCache`. + +To learn how the cache key is computed and invalidated, refer to the [overview](https://zeit.co/docs/v2/advanced/builders#technical-details). + +### Accessing Environment and Secrets + +The env and secrets specified by the user as `build.env` are passed to the builder process. This means you can access user env via `process.env` in Node.js. + +### Utilities as peerDependencies + +When you publish your builder to npm, make sure to not specify `@now/build-utils` (as seen below in the API definitions) as a dependency, but rather as part of `peerDependencies`. + +## Types + +### `Files` + +```ts +import { File } from '@now/build-utils' +type Files = { [filePath: string]: File } +``` + +This is an abstract type that is implemented as a plain [JavaScript Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object). It's helpful to think of it as a virtual filesystem representation. + +When used as an input, the `Files` object will only contain `FileRefs`. When `Files` is an output, it may consist of `Lambda` (Serverless Functions) types as well as `FileRefs`. + +An example of a valid output `Files` object is: + +```json +{ + "index.html": FileRef, + "api/index.js": Lambda +} +``` + +### `File` + +This is an abstract type that can be imported if you are using TypeScript. + +```ts +import { File } from '@now/build-utils' +``` + +Valid `File` types include: + +- [`FileRef`](#fileref) +- [`FileFsRef`](#filefsref) +- [`FileBlob`](#fileblob) + +### `FileRef` + +```ts +import { FileRef } from '@now/build-utils' +``` + +This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract file instance stored in our platform, based on the file identifier string (its checksum). When a `Files` object is passed as an input to `analyze` or `build`, all its values will be instances of `FileRef`. + +**Properties:** + +- `mode : Number` file mode +- `digest : String` a checksum that represents the file + +**Methods:** + +- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body + +### `FileFsRef` + +```ts +import { FileFsRef } from '@now/build-utils' +``` + +This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract instance of a file present in the filesystem that the build process is executing in. + +**Properties:** + +- `mode : Number` file mode +- `fsPath : String` the absolute path of the file in file system + +**Methods:** + +- `static async fromStream({ mode : Number, stream : Stream, fsPath : String }) : FileFsRef` creates an instance of a [FileFsRef](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) from `Stream`, placing file at `fsPath` with `mode` +- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body + +### `FileBlob` + +```ts +import { FileBlob } from '@now/build-utils' +``` + +This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) that represents an abstract instance of a file present in memory. + +**Properties:** + +- `mode : Number` file mode +- `data : String | Buffer` the body of the file + +**Methods:** + +- `static async fromStream({ mode : Number, stream : Stream }) :FileBlob` creates an instance of a [FileBlob](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object) from [`Stream`](https://nodejs.org/api/stream.html) with `mode` +- `toStream() : Stream` creates a [Stream](https://nodejs.org/api/stream.html) of the file body + +### `Lambda` + +```ts +import { Lambda } from '@now/build-utils' +``` + +This is a [JavaScript class](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes), called a Serverless Function, that can be created by supplying `files`, `handler`, `runtime`, and `environment` as an object to the [`createLambda`](#createlambda) helper. The instances of this class should not be created directly. Instead use a call to [`createLambda`](#createlambda). + +**Properties:** + +- `files : Files` the internal filesystem of the lambda +- `handler : String` path to handler file and (optionally) a function name it exports +- `runtime : LambdaRuntime` the name of the lambda runtime +- `environment : Object` key-value map of handler-related (aside of those passed by user) environment variables + +### `LambdaRuntime` + +This is an abstract enumeration type that is implemented by one of the following possible `String` values: + +- `nodejs10.x` +- `nodejs8.10` +- `go1.x` +- `java-1.8.0-openjdk` +- `python3.6` +- `python2.7` +- `dotnetcore2.1` +- `dotnetcore2.0` +- `dotnetcore1.0` + +## JavaScript API + +The following is exposed by `@now/build-utils` to simplify the process of writing Builders, manipulating the file system, using the above types, etc. + +### `createLambda` + +Signature: `createLambda(Object spec) : Lambda` + +```ts +import { createLambda } from '@now/build-utils' +``` + +Constructor for the [`Lambda`](#lambda) type. + +```js +const { createLambda, FileBlob } = require('@now/build-utils') +await createLambda({ + runtime: 'nodejs8.10', + handler: 'index.main', + files: { + 'index.js': new FileBlob({ data: 'exports.main = () => {}' }) + } +}) +``` + +### `download` + +Signature: `download() : Files` + +```ts +import { download } from '@now/build-utils' +``` + +This utility allows you to download the contents of a [`Files`](#files) data structure, therefore creating the filesystem represented in it. + +Since `Files` is an abstract way of representing files, you can think of `download` as a way of making that virtual filesystem _real_. + +If the **optional** `meta` property is passed (the argument for [build](#build)), only the files that have changed are downloaded. This is decided using `filesRemoved` and `filesChanged` inside that object. + +```js +await download(files, workPath, meta) +``` + +### `glob` + +Signature: `glob() : Files` + +```ts +import { glob } from '@now/build-utils' +``` + +This utility allows you to _scan_ the filesystem and return a [`Files`](#files) representation of the matched glob search string. It can be thought of as the reverse of [`download`](#download). + +The following trivial example downloads everything to the filesystem, only to return it back (therefore just re-creating the passed-in [`Files`](#files)): + +```js +const { glob, download } = require('@now/build-utils') + +exports.build = ({ files, workPath }) => { + await download(files, workPath) + return glob('**', workPath) +} +``` + +### `getWriteableDirectory` + +Signature: `getWriteableDirectory() : String` + +```ts +import { getWriteableDirectory } from '@now/build-utils' +``` + +In some occasions, you might want to write to a temporary directory. + +### `rename` + +Signature: `rename(Files) : Files` + +```ts +import { rename } from '@now/build-utils' +``` + +Renames the keys of the [`Files`](#files) object, which represent the paths. For example, to remove the `*.go` suffix you can use: + +```js +const rename = require('@now/build-utils') +const originalFiles = { 'one.go': fileFsRef1, 'two.go': fileFsRef2 } +const renamedFiles = rename(originalFiles, path => path.replace(/\.go$/, '') +``` \ No newline at end of file diff --git a/PUBLISHING.md b/PUBLISHING.md new file mode 100644 index 000000000..a6e30d0a8 --- /dev/null +++ b/PUBLISHING.md @@ -0,0 +1,40 @@ +# Publishing to npm + +Always publish to the Canary Channel as soon as a PR is merged into the `canary` branch. + +``` +yarn publish-canary +``` + +Publish the Stable Channel weekly. + +- Cherry pick each commit from `canary` to `master` branch +- Verify that you are _in-sync_ with canary (with the exception of the `version` line in `package.json`) +- Deploy the modified Builders + +``` +# View differences excluding "Publish" commits +git checkout canary && git pull +git log --pretty=format:"$ad- %s [%an]" | grep -v Publish > ~/Desktop/canary.txt +git checkout master && git pull +git log --pretty=format:"$ad- %s [%an]" | grep -v Publish > ~/Desktop/master.txt +diff ~/Desktop/canary.txt ~/Desktop/master.txt + +# Cherry pick all PRs from canary into master ... +git cherry-pick +git cherry-pick +git cherry-pick +git cherry-pick + +# Verify the only difference is "version" in package.json +git diff origin/canary + +# Ship it +yarn publish-stable +``` + +After running this publish step, GitHub Actions will take care of publishing the modified Builder packages to npm. + +If for some reason GitHub Actions fails to publish the npm package, you may do so +manually by running `npm publish` from the package directory. Make sure to +use `npm publish --tag canary` if you are publishing a canary release! diff --git a/VERSIONING.md b/VERSIONING.md new file mode 100644 index 000000000..7e9c28d86 --- /dev/null +++ b/VERSIONING.md @@ -0,0 +1,25 @@ +# Versioning + +Builders are released to two different channels. + +## Channels + +| Channel | Git Branch | npm dist-tag | use example | +| ------- | ------------------------------------------------------------- | ------------ | ------------------ | +| Canary | [canary](https://github.com/zeit/now-builders/commits/canary) | `@canary` | `@now/node@canary` | +| Stable | [master](https://github.com/zeit/now-builders/commits/master) | `@latest` | `@now/node@latest` | + +All PRs are submitted to the `canary` branch. Once a PR is merged into the `canary` branch, it should be published to npm immediately using the Canary Channel. + +## Version Selection + +Since Builders are published to [npmjs.com](https://npmjs.com), this makes versioning works the same for Builders as it does for any npm package. The `use` statement in [now.json](https://zeit.co/docs/v2/advanced/configuration#builds) has a similar syntax to `npm install`. + +The following are valid examples [@now/node](https://www.npmjs.com/package/@now/node?activeTab=versions): + +- `@now/node` +- `@now/node@0.7.3` +- `@now/node@canary` +- `@now/node@0.7.2-canary.2` + +We always recommend using the latest version by leaving off the dist-tag suffix, `@now/node` for example. diff --git a/lerna.json b/lerna.json new file mode 100644 index 000000000..22f466334 --- /dev/null +++ b/lerna.json @@ -0,0 +1,14 @@ +{ + "npmClient": "yarn", + "useWorkspaces": true, + "packages": ["packages/*"], + "command": { + "publish": { + "npmClient": "npm", + "allowBranch": ["master", "canary"], + "registry": "https://registry.npmjs.org/" + } + }, + "version": "independent" + } + \ No newline at end of file diff --git a/package.json b/package.json index f3dd401c7..acf78cfa7 100644 --- a/package.json +++ b/package.json @@ -1,200 +1,32 @@ { - "name": "now", - "version": "16.1.2", - "preferGlobal": true, - "license": "Apache-2.0", - "description": "The command-line interface for Now", - "repository": "zeit/now-cli", - "scripts": { - "test": "yarn test-lint", - "preinstall": "node ./scripts/preinstall.js", - "test-unit": "nyc ava test/*unit.js --serial --fail-fast --verbose", - "test-integration": "ava test/integration.js --serial --fail-fast", - "test-integration-now-dev": "ava test/dev/integration.js --serial --fail-fast --verbose", - "test-lint": "eslint . --ext .js,.ts", - "prepublishOnly": "yarn build", - "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", - "build": "ts-node ./scripts/build.ts", - "build-dev": "ts-node ./scripts/build.ts --dev", - "format-modified": "prettier --parser typescript --write --single-quote `git diff --name-only HEAD * | grep -e \".*\\.ts$\" -e \".*\\.js$\" | xargs echo`" - }, - "nyc": { - "include": [ - "src/**" - ], - "extension": [ - ".js", - ".ts" - ], - "require": [ - "ts-node/register" - ], - "reporter": [ - "text", - "html" - ], - "sourceMap": true, - "instrument": true, - "all": true - }, - "git": { - "pre-commit": [ - "test-lint", - "format-modified" - ] - }, - "bin": { - "now": "./dist/index.js" - }, - "files": [ - "dist", - "scripts/preinstall.js" - ], - "ava": { - "compileEnhancements": false, - "extensions": [ - "ts" - ], - "require": [ - "ts-node/register/transpile-only", - "esm" - ] - }, - "engines": { - "node": ">= 8.11" - }, - "devDependencies": { - "@now/build-utils": "0.9.13", - "@now/go": "latest", - "@now/next": "latest", - "@now/node": "latest", - "@now/php": "latest", - "@now/static-build": "latest", - "@sentry/node": "5.5.0", - "@types/ansi-escapes": "3.0.0", - "@types/ansi-regex": "4.0.0", - "@types/async-retry": "1.2.1", - "@types/bytes": "3.0.0", - "@types/debug": "0.0.31", - "@types/dotenv": "6.1.1", - "@types/escape-html": "0.0.20", - "@types/execa": "0.9.0", - "@types/fs-extra": "5.0.5", - "@types/glob": "7.1.1", - "@types/http-proxy": "1.16.2", - "@types/load-json-file": "2.0.7", - "@types/micro": "7.3.3", - "@types/mime-types": "2.1.0", - "@types/minimatch": "3.0.3", - "@types/mri": "1.1.0", - "@types/ms": "0.7.30", - "@types/node": "11.11.0", - "@types/node-fetch": "2.1.4", - "@types/npm-package-arg": "6.1.0", - "@types/pluralize": "0.0.29", - "@types/progress": "2.0.3", - "@types/psl": "1.1.0", - "@types/semver": "6.0.1", - "@types/tar-fs": "1.16.1", - "@types/text-table": "0.2.0", - "@types/universal-analytics": "0.4.2", - "@types/which": "1.3.1", - "@types/write-json-file": "2.2.1", - "@typescript-eslint/eslint-plugin": "1.6.0", - "@typescript-eslint/parser": "1.1.0", - "@zeit/dockerignore": "0.0.5", - "@zeit/fun": "0.9.1", - "@zeit/git-hooks": "0.1.4", - "@zeit/ncc": "0.18.5", - "@zeit/source-map-support": "0.6.2", - "alpha-sort": "2.0.1", - "ansi-escapes": "3.0.0", - "ansi-regex": "3.0.0", - "arg": "2.0.0", - "async-listen": "1.2.0", - "async-retry": "1.1.3", - "async-sema": "2.1.4", - "ava": "2.2.0", - "bytes": "3.0.0", - "cache-or-tmp-directory": "1.0.0", - "chalk": "2.4.2", - "chokidar": "2.1.6", - "clipboardy": "2.1.0", - "codecov": "3.1.0", - "cpy": "7.2.0", - "credit-card": "3.0.1", - "date-fns": "1.29.0", - "death": "1.1.0", - "debug": "3.1.0", - "deployment-type": "1.0.1", - "docker-file-parser": "1.0.2", - "dot": "1.1.2", - "dotenv": "4.0.0", - "download": "6.2.5", - "email-prompt": "0.3.2", - "email-validator": "1.1.1", - "epipebomb": "1.0.0", - "escape-html": "1.0.3", - "eslint": "5.16.0", - "eslint-config-airbnb": "17.1.0", - "eslint-config-prettier": "4.1.0", - "eslint-import-resolver-typescript": "1.1.1", - "eslint-plugin-import": "2.16.0", - "eslint-plugin-jsx-a11y": "6.2.1", - "eslint-plugin-react": "7.12.4", - "esm": "3.1.4", - "execa": "1.0.0", - "fetch-h2": "2.0.3", - "fs-extra": "7.0.1", - "glob": "7.1.2", - "http-proxy": "1.17.0", - "ini": "1.3.4", - "inquirer": "3.3.0", - "is-url": "1.2.2", - "jaro-winkler": "0.2.8", - "jsonlines": "0.1.1", - "load-json-file": "3.0.0", - "micro": "9.1.2", - "mime-types": "2.1.24", - "minimatch": "3.0.4", - "mri": "1.1.0", - "ms": "2.1.1", - "node-fetch": "1.7.3", - "npm-package-arg": "6.1.0", - "nyc": "13.2.0", - "ora": "3.4.0", - "pcre-to-regexp": "0.0.5", - "pluralize": "7.0.0", - "pre-commit": "1.2.2", - "prettier": "1.16.2", - "printf": "0.2.5", - "progress": "2.0.3", - "promisepipe": "3.0.0", - "psl": "1.1.31", - "qr-image": "3.2.0", - "raw-body": "2.4.1", - "read-pkg": "2.0.0", - "rx-lite-aggregates": "4.0.8", - "semver": "5.5.0", - "serve-handler": "6.1.1", - "sinon": "4.4.2", - "strip-ansi": "5.2.0", - "stripe": "5.1.0", - "tar-fs": "1.16.3", - "test-listen": "1.1.0", - "text-table": "0.2.0", - "then-sleep": "1.0.1", - "through2": "2.0.3", - "title": "3.4.1", - "tmp-promise": "1.0.3", - "ts-node": "8.3.0", - "typescript": "3.2.4", - "universal-analytics": "0.4.20", - "update-check": "1.5.3", - "utility-types": "2.1.0", - "which": "1.3.1", - "which-promise": "1.0.0", - "write-json-file": "2.2.0", - "yarn": "1.17.3" + "name": "now-builders", + "version": "0.0.0", + "private": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "lerna": "3.16.4" + }, + "devDependencies": { + "@zeit/ncc": "0.20.4", + "async-retry": "1.2.3", + "buffer-replace": "1.0.0", + "node-fetch": "2.6.0" + }, + "scripts": { + "lerna": "lerna", + "bootstrap": "lerna bootstrap", + "publish-stable": "git checkout master && git pull && lerna version --exact", + "publish-canary": "git checkout canary && git pull && lerna version prerelease --preid canary --exact", + "publish-from-github": "./.circleci/publish.sh", + "build": "./.circleci/run.sh build", + "test-lint": "./.circleci/run.sh test-lint", + "test-unit": "./.circleci/run.sh test-unit", + "test-integration": "./.circleci/run.sh test-integration", + "test-integration-once": "./.circleci/run.sh test-integration-once", + "test-integration-now-dev": "./.circleci/run.sh test-integration-now-dev" + } } -} + \ No newline at end of file diff --git a/packages/now-build-utils/.gitignore b/packages/now-build-utils/.gitignore new file mode 100644 index 000000000..c25f9aa18 --- /dev/null +++ b/packages/now-build-utils/.gitignore @@ -0,0 +1,3 @@ +dist +test/symlinks-out +test/symlinks.zip diff --git a/packages/now-build-utils/.npmignore b/packages/now-build-utils/.npmignore new file mode 100644 index 000000000..7e59f5ba4 --- /dev/null +++ b/packages/now-build-utils/.npmignore @@ -0,0 +1,3 @@ +/src +/test +tmp \ No newline at end of file diff --git a/packages/now-build-utils/build.sh b/packages/now-build-utils/build.sh new file mode 100755 index 000000000..c5f5573c2 --- /dev/null +++ b/packages/now-build-utils/build.sh @@ -0,0 +1,6 @@ +tsc + +rm dist/index.js +ncc build src/index.ts -o dist/main +mv dist/main/index.js dist/index.js +rm -rf dist/main diff --git a/packages/now-build-utils/file-blob.js b/packages/now-build-utils/file-blob.js new file mode 100644 index 000000000..b567bd3ed --- /dev/null +++ b/packages/now-build-utils/file-blob.js @@ -0,0 +1 @@ +module.exports = require('./dist/index').FileBlob; diff --git a/packages/now-build-utils/file-fs-ref.js b/packages/now-build-utils/file-fs-ref.js new file mode 100644 index 000000000..2a28ef00e --- /dev/null +++ b/packages/now-build-utils/file-fs-ref.js @@ -0,0 +1 @@ +module.exports = require('./dist/index').FileFsRef; diff --git a/packages/now-build-utils/file-ref.js b/packages/now-build-utils/file-ref.js new file mode 100644 index 000000000..830373458 --- /dev/null +++ b/packages/now-build-utils/file-ref.js @@ -0,0 +1 @@ +module.exports = require('./dist/index').FileRef; diff --git a/packages/now-build-utils/fs/download.js b/packages/now-build-utils/fs/download.js new file mode 100644 index 000000000..b905ea978 --- /dev/null +++ b/packages/now-build-utils/fs/download.js @@ -0,0 +1 @@ +module.exports = require('../dist/index').download; diff --git a/packages/now-build-utils/fs/get-writable-directory.js b/packages/now-build-utils/fs/get-writable-directory.js new file mode 100644 index 000000000..d955f1e15 --- /dev/null +++ b/packages/now-build-utils/fs/get-writable-directory.js @@ -0,0 +1 @@ +module.exports = require('../dist/index').getWriteableDirectory; diff --git a/packages/now-build-utils/fs/glob.js b/packages/now-build-utils/fs/glob.js new file mode 100644 index 000000000..9fea25fff --- /dev/null +++ b/packages/now-build-utils/fs/glob.js @@ -0,0 +1 @@ +module.exports = require('../dist/index').glob; diff --git a/packages/now-build-utils/fs/rename.js b/packages/now-build-utils/fs/rename.js new file mode 100644 index 000000000..9d4a1721a --- /dev/null +++ b/packages/now-build-utils/fs/rename.js @@ -0,0 +1 @@ +module.exports = require('../dist/index').rename; diff --git a/packages/now-build-utils/fs/run-user-scripts.js b/packages/now-build-utils/fs/run-user-scripts.js new file mode 100644 index 000000000..16970325e --- /dev/null +++ b/packages/now-build-utils/fs/run-user-scripts.js @@ -0,0 +1 @@ +module.exports = require('../dist/index'); diff --git a/packages/now-build-utils/fs/stream-to-buffer.js b/packages/now-build-utils/fs/stream-to-buffer.js new file mode 100644 index 000000000..ab87fca3c --- /dev/null +++ b/packages/now-build-utils/fs/stream-to-buffer.js @@ -0,0 +1 @@ +module.exports = require('../dist/index').streamToBuffer; diff --git a/packages/now-build-utils/lambda.js b/packages/now-build-utils/lambda.js new file mode 100644 index 000000000..f4f0e9988 --- /dev/null +++ b/packages/now-build-utils/lambda.js @@ -0,0 +1 @@ +module.exports = require('./dist/index'); diff --git a/packages/now-build-utils/package.json b/packages/now-build-utils/package.json new file mode 100644 index 000000000..520157de7 --- /dev/null +++ b/packages/now-build-utils/package.json @@ -0,0 +1,43 @@ +{ + "name": "@now/build-utils", + "version": "0.9.13", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.js", + "homepage": "https://zeit.co/docs/v2/deployments/builders/developer-guide", + "repository": { + "type": "git", + "url": "https://github.com/zeit/now-builders.git", + "directory": "packages/now-build-utils" + }, + "scripts": { + "build": "./build.sh", + "test-integration-once": "jest --env node --verbose --runInBand", + "prepublishOnly": "./build.sh" + }, + "devDependencies": { + "@types/async-retry": "^1.2.1", + "@types/cross-spawn": "6.0.0", + "@types/end-of-stream": "^1.4.0", + "@types/fs-extra": "^5.0.5", + "@types/glob": "^7.1.1", + "@types/multistream": "2.1.1", + "@types/node-fetch": "^2.1.6", + "@types/semver": "6.0.0", + "@types/yazl": "^2.4.1", + "async-retry": "1.2.3", + "async-sema": "2.1.4", + "cross-spawn": "6.0.5", + "end-of-stream": "1.4.1", + "execa": "^1.0.0", + "fs-extra": "7.0.0", + "glob": "7.1.3", + "into-stream": "5.0.0", + "minimatch": "3.0.4", + "multistream": "2.1.1", + "node-fetch": "2.2.0", + "semver": "6.1.1", + "typescript": "3.5.2", + "yazl": "2.4.3" + } +} diff --git a/packages/now-build-utils/src/debug.ts b/packages/now-build-utils/src/debug.ts new file mode 100644 index 000000000..1df32c6d7 --- /dev/null +++ b/packages/now-build-utils/src/debug.ts @@ -0,0 +1,7 @@ +export default function debug(message: string, ...additional: any[]) { + if (process.env.NOW_BUILDER_DEBUG) { + console.log(message, ...additional); + } else if (process.env.NOW_BUILDER_ANNOTATE) { + console.log(`[now-builder-debug] ${message}`, ...additional); + } +} diff --git a/packages/now-build-utils/src/detect-builders.ts b/packages/now-build-utils/src/detect-builders.ts new file mode 100644 index 000000000..a396b288a --- /dev/null +++ b/packages/now-build-utils/src/detect-builders.ts @@ -0,0 +1,182 @@ +import { PackageJson, Builder, Config } from './types'; +import minimatch from 'minimatch'; + +interface ErrorResponse { + code: string; + message: string; +} + +interface Options { + tag?: 'canary' | 'latest' | string; +} + +const src: string = 'package.json'; +const config: Config = { zeroConfig: true }; + +const MISSING_BUILD_SCRIPT_ERROR: ErrorResponse = { + code: 'missing_build_script', + message: + 'Your `package.json` file is missing a `build` property inside the `script` property.' + + '\nMore details: https://zeit.co/docs/v2/advanced/platform/frequently-asked-questions#missing-build-script', +}; + +// Static builders are special cased in `@now/static-build` +function getBuilders(): Map { + return new Map([ + ['next', { src, use: '@now/next', config }], + ]); +} + +// Must be a function to ensure that the returned +// object won't be a reference +function getApiBuilders(): Builder[] { + return [ + { src: 'api/**/*.js', use: '@now/node', config }, + { src: 'api/**/*.ts', use: '@now/node', config }, + { src: 'api/**/*.go', use: '@now/go', config }, + { src: 'api/**/*.py', use: '@now/python', config }, + { src: 'api/**/*.rb', use: '@now/ruby', config }, + ]; +} + +function hasPublicDirectory(files: string[]) { + return files.some(name => name.startsWith('public/')); +} + +function hasBuildScript(pkg: PackageJson | undefined) { + const { scripts = {} } = pkg || {}; + return Boolean(scripts && scripts['build']); +} + +async function detectBuilder(pkg: PackageJson): Promise { + for (const [dependency, builder] of getBuilders()) { + const deps = Object.assign({}, pkg.dependencies, pkg.devDependencies); + + // Return the builder when a dependency matches + if (deps[dependency]) { + return builder; + } + } + + // By default we'll choose the `static-build` builder + return { src, use: '@now/static-build', config }; +} + +// Files that match a specific pattern will get ignored +export function ignoreApiFilter(file: string) { + if (file.includes('/.')) { + return false; + } + + if (file.includes('/_')) { + return false; + } + + if (file.endsWith('.d.ts')) { + return false; + } + + // If the file does not match any builder we also + // don't want to create a route e.g. `package.json` + if (getApiBuilders().every(({ src }) => !minimatch(file, src))) { + return false; + } + + return true; +} + +// We need to sort the file paths by alphabet to make +// sure the routes stay in the same order e.g. for deduping +export function sortFiles(fileA: string, fileB: string) { + return fileA.localeCompare(fileB); +} + +async function detectApiBuilders(files: string[]): Promise { + const builds = files + .sort(sortFiles) + .filter(ignoreApiFilter) + .map(file => { + const result = getApiBuilders().find( + ({ src }): boolean => minimatch(file, src) + ); + + return result ? { ...result, src: file } : null; + }); + + const finishedBuilds = builds.filter(Boolean); + return finishedBuilds as Builder[]; +} + +// When zero config is used we can call this function +// to determine what builders to use +export async function detectBuilders( + files: string[], + pkg?: PackageJson | undefined | null, + options?: Options +): Promise<{ + builders: Builder[] | null; + errors: ErrorResponse[] | null; +}> { + const errors: ErrorResponse[] = []; + + // Detect all builders for the `api` directory before anything else + let builders = await detectApiBuilders(files); + + if (pkg && hasBuildScript(pkg)) { + builders.push(await detectBuilder(pkg)); + } else { + if (pkg && builders.length === 0) { + // We only show this error when there are no api builders + // since the dependencies of the pkg could be used for those + errors.push(MISSING_BUILD_SCRIPT_ERROR); + return { errors, builders: null }; + } + + // We allow a `public` directory + // when there are no build steps + if (hasPublicDirectory(files)) { + builders.push({ + use: '@now/static', + src: 'public/**/*', + config, + }); + } else if (builders.length > 0) { + // We can't use pattern matching, since `!(api)` and `!(api)/**/*` + // won't give the correct results + builders.push( + ...files + .filter(name => !name.startsWith('api/')) + .filter(name => !(name === 'package.json')) + .map(name => ({ + use: '@now/static', + src: name, + config, + })) + ); + } + } + + // Change the tag for the builders + if (builders && builders.length) { + const tag = options && options.tag; + + if (tag) { + builders = builders.map((originBuilder: Builder) => { + // Copy builder to make sure it is not a reference + const builder = { ...originBuilder }; + + // @now/static has no canary builder + if (builder.use !== '@now/static') { + builder.use = `${builder.use}@${tag}`; + } + + return builder; + }); + } + } + + return { + builders: builders.length ? builders : null, + errors: errors.length ? errors : null, + }; +} diff --git a/packages/now-build-utils/src/detect-routes.ts b/packages/now-build-utils/src/detect-routes.ts new file mode 100644 index 000000000..e4e832a8e --- /dev/null +++ b/packages/now-build-utils/src/detect-routes.ts @@ -0,0 +1,297 @@ +import { Route, Builder } from './types'; +import { parse as parsePath } from 'path'; +import { ignoreApiFilter, sortFiles } from './detect-builders'; + +function escapeName(name: string) { + const special = '[]^$.|?*+()'.split(''); + + for (const char of special) { + name = name.replace(new RegExp(`\\${char}`, 'g'), `\\${char}`); + } + + return name; +} + +function joinPath(...segments: string[]) { + const joinedPath = segments.join('/'); + return joinedPath.replace(/\/{2,}/g, '/'); +} + +function concatArrayOfText(texts: string[]): string { + if (texts.length <= 2) { + return texts.join(' and '); + } + + const last = texts.pop(); + return `${texts.join(', ')}, and ${last}`; +} + +// Takes a filename or foldername, strips the extension +// gets the part between the "[]" brackets. +// It will return `null` if there are no brackets +// and therefore no segment. +function getSegmentName(segment: string): string | null { + const { name } = parsePath(segment); + + if (name.startsWith('[') && name.endsWith(']')) { + return name.slice(1, -1); + } + + return null; +} + +function createRouteFromPath(filePath: string): Route { + const parts = filePath.split('/'); + + let counter: number = 1; + const query: string[] = []; + + const srcParts = parts.map( + (segment, index): string => { + const name = getSegmentName(segment); + const isLast = index === parts.length - 1; + + if (name !== null) { + // We can't use `URLSearchParams` because `$` would get escaped + query.push(`${name}=$${counter++}`); + return `([^\\/]+)`; + } else if (isLast) { + const { name: fileName, ext } = parsePath(segment); + const isIndex = fileName === 'index'; + const prefix = isIndex ? '\\/' : ''; + + const names = [ + prefix, + prefix + escapeName(fileName), + prefix + escapeName(fileName) + escapeName(ext), + ].filter(Boolean); + + // Either filename with extension, filename without extension + // or nothing when the filename is `index` + return `(${names.join('|')})${isIndex ? '?' : ''}`; + } + + return segment; + } + ); + + const { name: fileName } = parsePath(filePath); + const isIndex = fileName === 'index'; + + const src = isIndex + ? `^/${srcParts.slice(0, -1).join('/')}${srcParts.slice(-1)[0]}$` + : `^/${srcParts.join('/')}$`; + + const dest = `/${filePath}${query.length ? '?' : ''}${query.join('&')}`; + + return { src, dest }; +} + +// Check if the path partially matches and has the same +// name for the path segment at the same position +function partiallyMatches(pathA: string, pathB: string): boolean { + const partsA = pathA.split('/'); + const partsB = pathB.split('/'); + + const long = partsA.length > partsB.length ? partsA : partsB; + const short = long === partsA ? partsB : partsA; + + let index = 0; + + for (const segmentShort of short) { + const segmentLong = long[index]; + + const nameLong = getSegmentName(segmentLong); + const nameShort = getSegmentName(segmentShort); + + // If there are no segments or the paths differ we + // return as they are not matching + if (segmentShort !== segmentLong && (!nameLong || !nameShort)) { + return false; + } + + if (nameLong !== nameShort) { + return true; + } + + index += 1; + } + + return false; +} + +// Counts how often a path occurres when all placeholders +// got resolved, so we can check if they have conflicts +function pathOccurrences(filePath: string, files: string[]): string[] { + const getAbsolutePath = (unresolvedPath: string): string => { + const { dir, name } = parsePath(unresolvedPath); + const parts = joinPath(dir, name).split('/'); + return parts.map(part => part.replace(/\[.*\]/, '1')).join('/'); + }; + + const currentAbsolutePath = getAbsolutePath(filePath); + + return files.reduce((prev: string[], file: string): string[] => { + const absolutePath = getAbsolutePath(file); + + if (absolutePath === currentAbsolutePath) { + prev.push(file); + } else if (partiallyMatches(filePath, file)) { + prev.push(file); + } + + return prev; + }, []); +} + +// Checks if a placeholder with the same name is used +// multiple times inside the same path +function getConflictingSegment(filePath: string): string | null { + const segments = new Set(); + + for (const segment of filePath.split('/')) { + const name = getSegmentName(segment); + + if (name !== null && segments.has(name)) { + return name; + } + + if (name) { + segments.add(name); + } + } + + return null; +} + +function sortFilesBySegmentCount(fileA: string, fileB: string): number { + const lengthA = fileA.split('/').length; + const lengthB = fileB.split('/').length; + + if (lengthA > lengthB) { + return -1; + } + + if (lengthA < lengthB) { + return 1; + } + + // Paths that have the same segment length but + // less placeholders are preferred + const countSegments = (prev: number, segment: string) => + getSegmentName(segment) ? prev + 1 : 0; + const segmentLengthA = fileA.split('/').reduce(countSegments, 0); + const segmentLengthB = fileB.split('/').reduce(countSegments, 0); + + if (segmentLengthA > segmentLengthB) { + return 1; + } + + if (segmentLengthA < segmentLengthB) { + return -1; + } + + return 0; +} + +interface RoutesResult { + defaultRoutes: Route[] | null; + error: { [key: string]: string } | null; +} + +async function detectApiRoutes(files: string[]): Promise { + if (!files || files.length === 0) { + return { defaultRoutes: null, error: null }; + } + + // The deepest routes need to be + // the first ones to get handled + const sortedFiles = files + .filter(ignoreApiFilter) + .sort(sortFiles) + .sort(sortFilesBySegmentCount); + + const defaultRoutes: Route[] = []; + + for (const file of sortedFiles) { + // We only consider every file in the api directory + // as we will strip extensions as well as resolving "[segments]" + if (!file.startsWith('api/')) { + continue; + } + + const conflictingSegment = getConflictingSegment(file); + + if (conflictingSegment) { + return { + defaultRoutes: null, + error: { + code: 'conflicting_path_segment', + message: + `The segment "${conflictingSegment}" occurres more than ` + + `one time in your path "${file}". Please make sure that ` + + `every segment in a path is unique`, + }, + }; + } + + const occurrences = pathOccurrences(file, sortedFiles).filter( + name => name !== file + ); + + if (occurrences.length > 0) { + const messagePaths = concatArrayOfText( + occurrences.map(name => `"${name}"`) + ); + + return { + defaultRoutes: null, + error: { + code: 'conflicting_file_path', + message: + `Two or more files have conflicting paths or names. ` + + `Please make sure path segments and filenames, without their extension, are unique. ` + + `The path "${file}" has conflicts with ${messagePaths}`, + }, + }; + } + + defaultRoutes.push(createRouteFromPath(file)); + } + + // 404 Route to disable directory listing + if (defaultRoutes.length) { + defaultRoutes.push({ + status: 404, + src: '/api(\\/.*)?$', + }); + } + + return { defaultRoutes, error: null }; +} + +function hasPublicBuilder(builders: Builder[]): boolean { + return builders.some( + builder => + builder.use === '@now/static' && + builder.src === 'public/**/*' && + builder.config && + builder.config.zeroConfig === true + ); +} + +export async function detectRoutes( + files: string[], + builders: Builder[] +): Promise { + const routesResult = await detectApiRoutes(files); + + if (routesResult.defaultRoutes && hasPublicBuilder(builders)) { + routesResult.defaultRoutes.push({ + src: '/(.*)', + dest: '/public/$1', + }); + } + + return routesResult; +} diff --git a/packages/now-build-utils/src/file-blob.ts b/packages/now-build-utils/src/file-blob.ts new file mode 100644 index 000000000..4807ba4a1 --- /dev/null +++ b/packages/now-build-utils/src/file-blob.ts @@ -0,0 +1,46 @@ +import assert from 'assert'; +import intoStream from 'into-stream'; +import { File } from './types'; + +interface FileBlobOptions { + mode?: number; + data: string | Buffer; +} + +interface FromStreamOptions { + mode?: number; + stream: NodeJS.ReadableStream; +} + +export default class FileBlob implements File { + public type: 'FileBlob'; + public mode: number; + public data: string | Buffer; + + constructor({ mode = 0o100644, data }: FileBlobOptions) { + assert(typeof mode === 'number'); + assert(typeof data === 'string' || Buffer.isBuffer(data)); + this.type = 'FileBlob'; + this.mode = mode; + this.data = data; + } + + static async fromStream({ mode = 0o100644, stream }: FromStreamOptions) { + assert(typeof mode === 'number'); + assert(typeof stream.pipe === 'function'); // is-stream + const chunks: Buffer[] = []; + + await new Promise((resolve, reject) => { + stream.on('data', chunk => chunks.push(Buffer.from(chunk))); + stream.on('error', error => reject(error)); + stream.on('end', () => resolve()); + }); + + const data = Buffer.concat(chunks); + return new FileBlob({ mode, data }); + } + + toStream(): NodeJS.ReadableStream { + return intoStream(this.data); + } +} diff --git a/packages/now-build-utils/src/file-fs-ref.ts b/packages/now-build-utils/src/file-fs-ref.ts new file mode 100644 index 000000000..20e847b69 --- /dev/null +++ b/packages/now-build-utils/src/file-fs-ref.ts @@ -0,0 +1,97 @@ +import assert from 'assert'; +import fs from 'fs-extra'; +import multiStream from 'multistream'; +import path from 'path'; +import Sema from 'async-sema'; +import { File } from './types'; + +const semaToPreventEMFILE = new Sema(20); + +interface FileFsRefOptions { + mode?: number; + fsPath: string; +} + +interface FromStreamOptions { + mode: number; + stream: NodeJS.ReadableStream; + fsPath: string; +} + +class FileFsRef implements File { + public type: 'FileFsRef'; + public mode: number; + public fsPath: string; + + constructor({ mode = 0o100644, fsPath }: FileFsRefOptions) { + assert(typeof mode === 'number'); + assert(typeof fsPath === 'string'); + this.type = 'FileFsRef'; + this.mode = mode; + this.fsPath = fsPath; + } + + static async fromFsPath({ + mode, + fsPath, + }: FileFsRefOptions): Promise { + let m = mode; + if (!m) { + const stat = await fs.lstat(fsPath); + m = stat.mode; + } + return new FileFsRef({ mode: m, fsPath }); + } + + static async fromStream({ + mode = 0o100644, + stream, + fsPath, + }: FromStreamOptions): Promise { + assert(typeof mode === 'number'); + assert(typeof stream.pipe === 'function'); // is-stream + assert(typeof fsPath === 'string'); + await fs.mkdirp(path.dirname(fsPath)); + + await new Promise((resolve, reject) => { + const dest = fs.createWriteStream(fsPath, { + mode: mode & 0o777, + }); + stream.pipe(dest); + stream.on('error', reject); + dest.on('finish', resolve); + dest.on('error', reject); + }); + + return new FileFsRef({ mode, fsPath }); + } + + async toStreamAsync(): Promise { + await semaToPreventEMFILE.acquire(); + const release = () => semaToPreventEMFILE.release(); + const stream = fs.createReadStream(this.fsPath); + stream.on('close', release); + stream.on('error', release); + return stream; + } + + toStream(): NodeJS.ReadableStream { + let flag = false; + + // eslint-disable-next-line consistent-return + return multiStream(cb => { + if (flag) return cb(null, null); + flag = true; + + this.toStreamAsync() + .then(stream => { + cb(null, stream); + }) + .catch(error => { + cb(error, null); + }); + }); + } +} + +export = FileFsRef; diff --git a/packages/now-build-utils/src/file-ref.ts b/packages/now-build-utils/src/file-ref.ts new file mode 100644 index 000000000..4bd0efa3f --- /dev/null +++ b/packages/now-build-utils/src/file-ref.ts @@ -0,0 +1,95 @@ +import assert from 'assert'; +import fetch from 'node-fetch'; +import multiStream from 'multistream'; +import retry from 'async-retry'; +import Sema from 'async-sema'; +import { File } from './types'; + +interface FileRefOptions { + mode?: number; + digest: string; +} + +const semaToDownloadFromS3 = new Sema(5); + +class BailableError extends Error { + public bail: boolean; + + constructor(...args: string[]) { + super(...args); + this.bail = false; + } +} + +export default class FileRef implements File { + public type: 'FileRef'; + public mode: number; + public digest: string; + + constructor({ mode = 0o100644, digest }: FileRefOptions) { + assert(typeof mode === 'number'); + assert(typeof digest === 'string'); + this.type = 'FileRef'; + this.mode = mode; + this.digest = digest; + } + + async toStreamAsync(): Promise { + let url = ''; + // sha:24be087eef9fac01d61b30a725c1a10d7b45a256 + const [digestType, digestHash] = this.digest.split(':'); + if (digestType === 'sha') { + // This CloudFront URL edge caches the `now-files` S3 bucket to prevent + // overloading it + // `https://now-files.s3.amazonaws.com/${digestHash}` + url = `https://dmmcy0pwk6bqi.cloudfront.net/${digestHash}`; + } else if (digestType === 'sha+ephemeral') { + // This URL is currently only used for cache files that constantly + // change. We shouldn't cache it on CloudFront because it'd always be a + // MISS. + url = `https://now-ephemeral-files.s3.amazonaws.com/${digestHash}`; + } else { + throw new Error('Expected digest to be sha'); + } + + await semaToDownloadFromS3.acquire(); + // console.time(`downloading ${url}`); + try { + return await retry( + async () => { + const resp = await fetch(url); + if (!resp.ok) { + const error = new BailableError( + `download: ${resp.status} ${resp.statusText} for ${url}` + ); + if (resp.status === 403) error.bail = true; + throw error; + } + return resp.body; + }, + { factor: 1, retries: 3 } + ); + } finally { + // console.timeEnd(`downloading ${url}`); + semaToDownloadFromS3.release(); + } + } + + toStream(): NodeJS.ReadableStream { + let flag = false; + + // eslint-disable-next-line consistent-return + return multiStream(cb => { + if (flag) return cb(null, null); + flag = true; + + this.toStreamAsync() + .then(stream => { + cb(null, stream); + }) + .catch(error => { + cb(error, null); + }); + }); + } +} diff --git a/packages/now-build-utils/src/fs/download.ts b/packages/now-build-utils/src/fs/download.ts new file mode 100644 index 000000000..5e475283a --- /dev/null +++ b/packages/now-build-utils/src/fs/download.ts @@ -0,0 +1,75 @@ +import path from 'path'; +import FileFsRef from '../file-fs-ref'; +import { File, Files, Meta } from '../types'; +import { remove, mkdirp, readlink, symlink } from 'fs-extra'; + +export interface DownloadedFiles { + [filePath: string]: FileFsRef; +} + +const S_IFMT = 61440; /* 0170000 type of file */ +const S_IFLNK = 40960; /* 0120000 symbolic link */ + +export function isSymbolicLink(mode: number): boolean { + return (mode & S_IFMT) === S_IFLNK; +} + +async function downloadFile(file: File, fsPath: string): Promise { + const { mode } = file; + if (mode && isSymbolicLink(mode) && file.type === 'FileFsRef') { + const [target] = await Promise.all([ + readlink((file as FileFsRef).fsPath), + mkdirp(path.dirname(fsPath)), + ]); + await symlink(target, fsPath); + return FileFsRef.fromFsPath({ mode, fsPath }); + } else { + const stream = file.toStream(); + return FileFsRef.fromStream({ mode, stream, fsPath }); + } +} + +async function removeFile(basePath: string, fileMatched: string) { + const file = path.join(basePath, fileMatched); + await remove(file); +} + +export default async function download( + files: Files, + basePath: string, + meta?: Meta +): Promise { + const { isDev = false, skipDownload = false, filesChanged = null, filesRemoved = null } = + meta || {}; + + if (isDev || skipDownload) { + // In `now dev`, the `download()` function is a no-op because + // the `basePath` matches the `cwd` of the dev server, so the + // source files are already available. + return files as DownloadedFiles; + } + + const files2: DownloadedFiles = {}; + + await Promise.all( + Object.keys(files).map(async name => { + // If the file does not exist anymore, remove it. + if (Array.isArray(filesRemoved) && filesRemoved.includes(name)) { + await removeFile(basePath, name); + return; + } + + // If a file didn't change, do not re-download it. + if (Array.isArray(filesChanged) && !filesChanged.includes(name)) { + return; + } + + const file = files[name]; + const fsPath = path.join(basePath, name); + + files2[name] = await downloadFile(file, fsPath); + }) + ); + + return files2; +} diff --git a/packages/now-build-utils/src/fs/get-writable-directory.ts b/packages/now-build-utils/src/fs/get-writable-directory.ts new file mode 100644 index 000000000..6aff952fd --- /dev/null +++ b/packages/now-build-utils/src/fs/get-writable-directory.ts @@ -0,0 +1,10 @@ +import { join } from 'path'; +import { tmpdir } from 'os'; +import { mkdirp } from 'fs-extra'; + +export default async function getWritableDirectory() { + const name = Math.floor(Math.random() * 0x7fffffff).toString(16); + const directory = join(tmpdir(), name); + await mkdirp(directory); + return directory; +} diff --git a/packages/now-build-utils/src/fs/glob.ts b/packages/now-build-utils/src/fs/glob.ts new file mode 100644 index 000000000..bffe457ab --- /dev/null +++ b/packages/now-build-utils/src/fs/glob.ts @@ -0,0 +1,70 @@ +import path from 'path'; +import assert from 'assert'; +import vanillaGlob_ from 'glob'; +import { promisify } from 'util'; +import { lstat, Stats } from 'fs-extra'; +import FileFsRef from '../file-fs-ref'; + +type GlobOptions = vanillaGlob_.IOptions; + +interface FsFiles { + [filePath: string]: FileFsRef; +} + +const vanillaGlob = promisify(vanillaGlob_); + +export default async function glob( + pattern: string, + opts: GlobOptions | string, + mountpoint?: string +): Promise { + let options: GlobOptions; + if (typeof opts === 'string') { + options = { cwd: opts }; + } else { + options = opts; + } + + if (!options.cwd) { + throw new Error( + 'Second argument (basePath) must be specified for names of resulting files' + ); + } + + if (!path.isAbsolute(options.cwd)) { + throw new Error(`basePath/cwd must be an absolute path (${options.cwd})`); + } + + const results: FsFiles = {}; + + options.symlinks = {}; + options.statCache = {}; + options.stat = true; + options.dot = true; + + const files = await vanillaGlob(pattern, options); + + for (const relativePath of files) { + const fsPath = path.join(options.cwd!, relativePath).replace(/\\/g, '/'); + let stat: Stats = options.statCache![fsPath] as Stats; + assert( + stat, + `statCache does not contain value for ${relativePath} (resolved to ${fsPath})` + ); + if (stat.isFile()) { + const isSymlink = options.symlinks![fsPath]; + if (isSymlink) { + stat = await lstat(fsPath); + } + + let finalPath = relativePath; + if (mountpoint) { + finalPath = path.join(mountpoint, finalPath); + } + + results[finalPath] = new FileFsRef({ mode: stat.mode, fsPath }); + } + } + + return results; +} diff --git a/packages/now-build-utils/src/fs/node-version.ts b/packages/now-build-utils/src/fs/node-version.ts new file mode 100644 index 000000000..3848aa4f2 --- /dev/null +++ b/packages/now-build-utils/src/fs/node-version.ts @@ -0,0 +1,53 @@ +import { intersects } from 'semver'; +import { NodeVersion } from '../types'; + +const supportedOptions: NodeVersion[] = [ + { major: 10, range: '10.x', runtime: 'nodejs10.x' }, + { major: 8, range: '8.10.x', runtime: 'nodejs8.10' }, +]; + +// This version should match Fargate's default in the PATH +// Today that is Node 8 +export const defaultSelection = supportedOptions.find( + o => o.major === 8 +) as NodeVersion; + +export async function getSupportedNodeVersion( + engineRange?: string, + silent?: boolean +): Promise { + let selection = defaultSelection; + + if (!engineRange) { + if (!silent) { + console.log( + 'missing `engines` in `package.json`, using default range: ' + + selection.range + ); + } + } else { + const found = supportedOptions.some(o => { + // the array is already in order so return the first + // match which will be the newest version of node + selection = o; + return intersects(o.range, engineRange); + }); + if (found) { + if (!silent) { + console.log( + 'Found `engines` in `package.json`, selecting range: ' + + selection.range + ); + } + } else { + if (!silent) { + throw new Error( + 'found `engines` in `package.json` with an unsupported node range: ' + + engineRange + + '\nplease use `10.x` or `8.10.x` instead' + ); + } + } + } + return selection; +} diff --git a/packages/now-build-utils/src/fs/rename.ts b/packages/now-build-utils/src/fs/rename.ts new file mode 100644 index 000000000..cf7082e51 --- /dev/null +++ b/packages/now-build-utils/src/fs/rename.ts @@ -0,0 +1,12 @@ +import { Files } from '../types'; +type Delegate = (name: string) => string; + +export default function rename(files: Files, delegate: Delegate): Files { + return Object.keys(files).reduce( + (newFiles, name) => ({ + ...newFiles, + [delegate(name)]: files[name], + }), + {} + ); +} diff --git a/packages/now-build-utils/src/fs/run-user-scripts.ts b/packages/now-build-utils/src/fs/run-user-scripts.ts new file mode 100644 index 000000000..03647df04 --- /dev/null +++ b/packages/now-build-utils/src/fs/run-user-scripts.ts @@ -0,0 +1,200 @@ +import assert from 'assert'; +import fs from 'fs-extra'; +import path from 'path'; +import spawn from 'cross-spawn'; +import { SpawnOptions } from 'child_process'; +import { deprecate } from 'util'; +import { Meta, PackageJson, NodeVersion, Config } from '../types'; +import { getSupportedNodeVersion } from './node-version'; + +function spawnAsync( + command: string, + args: string[], + cwd: string, + opts: SpawnOptions = {} +) { + return new Promise((resolve, reject) => { + const stderrLogs: Buffer[] = []; + opts = { stdio: 'inherit', cwd, ...opts }; + const child = spawn(command, args, opts); + + if (opts.stdio === 'pipe' && child.stderr) { + child.stderr.on('data', data => stderrLogs.push(data)); + } + + child.on('error', reject); + child.on('close', (code, signal) => { + if (code === 0) { + return resolve(); + } + + const errorLogs = stderrLogs.map(line => line.toString()).join(''); + if (opts.stdio !== 'inherit') { + reject(new Error(`Exited with ${code || signal}\n${errorLogs}`)); + } else { + reject(new Error(`Exited with ${code || signal}`)); + } + }); + }); +} + +async function chmodPlusX(fsPath: string) { + const s = await fs.stat(fsPath); + const newMode = s.mode | 64 | 8 | 1; // eslint-disable-line no-bitwise + if (s.mode === newMode) return; + const base8 = newMode.toString(8).slice(-3); + await fs.chmod(fsPath, base8); +} + +export async function runShellScript( + fsPath: string, + args: string[] = [], + spawnOpts?: SpawnOptions +) { + assert(path.isAbsolute(fsPath)); + const destPath = path.dirname(fsPath); + await chmodPlusX(fsPath); + await spawnAsync(`./${path.basename(fsPath)}`, args, destPath, spawnOpts); + return true; +} + +export function getSpawnOptions( + meta: Meta, + nodeVersion: NodeVersion +): SpawnOptions { + const opts = { + env: { ...process.env }, + }; + + if (!meta.isDev) { + opts.env.PATH = `/node${nodeVersion.major}/bin:${opts.env.PATH}`; + } + + return opts; +} + +export async function getNodeVersion( + destPath: string, + minNodeVersion?: string, + config?: Config +): Promise { + const { packageJson } = await scanParentDirs(destPath, true); + let range: string | undefined; + let silent = false; + if (packageJson && packageJson.engines && packageJson.engines.node) { + range = packageJson.engines.node; + } else if (minNodeVersion) { + range = minNodeVersion; + silent = true; + } else if (config && config.zeroConfig) { + // Use latest node version zero config detected + range = '10.x'; + silent = true; + } + return getSupportedNodeVersion(range, silent); +} + +async function scanParentDirs(destPath: string, readPackageJson = false) { + assert(path.isAbsolute(destPath)); + + let hasPackageLockJson = false; + let packageJson: PackageJson | undefined; + let currentDestPath = destPath; + + // eslint-disable-next-line no-constant-condition + while (true) { + const packageJsonPath = path.join(currentDestPath, 'package.json'); + // eslint-disable-next-line no-await-in-loop + if (await fs.pathExists(packageJsonPath)) { + // eslint-disable-next-line no-await-in-loop + if (readPackageJson) { + packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8')); + } + // eslint-disable-next-line no-await-in-loop + hasPackageLockJson = await fs.pathExists( + path.join(currentDestPath, 'package-lock.json') + ); + break; + } + + const newDestPath = path.dirname(currentDestPath); + if (currentDestPath === newDestPath) break; + currentDestPath = newDestPath; + } + + return { hasPackageLockJson, packageJson }; +} + +export async function runNpmInstall( + destPath: string, + args: string[] = [], + spawnOpts?: SpawnOptions +) { + assert(path.isAbsolute(destPath)); + + let commandArgs = args; + console.log(`installing to ${destPath}`); + const { hasPackageLockJson } = await scanParentDirs(destPath); + + const opts = spawnOpts || { env: process.env }; + + if (hasPackageLockJson) { + commandArgs = args.filter(a => a !== '--prefer-offline'); + await spawnAsync( + 'npm', + commandArgs.concat(['install', '--unsafe-perm']), + destPath, + opts + ); + } else { + await spawnAsync( + 'yarn', + commandArgs.concat(['--ignore-engines', '--cwd', destPath]), + destPath, + opts + ); + } +} + +export async function runPackageJsonScript( + destPath: string, + scriptName: string, + opts?: SpawnOptions +) { + assert(path.isAbsolute(destPath)); + const { packageJson, hasPackageLockJson } = await scanParentDirs( + destPath, + true + ); + const hasScript = Boolean( + packageJson && + packageJson.scripts && + scriptName && + packageJson.scripts[scriptName] + ); + if (!hasScript) return false; + + if (hasPackageLockJson) { + console.log(`running "npm run ${scriptName}"`); + await spawnAsync('npm', ['run', scriptName], destPath, opts); + } else { + console.log(`running "yarn run ${scriptName}"`); + await spawnAsync( + 'yarn', + ['--cwd', destPath, 'run', scriptName], + destPath, + opts + ); + } + + return true; +} + +/** + * @deprecate installDependencies() is deprecated. + * Please use runNpmInstall() instead. + */ +export const installDependencies = deprecate( + runNpmInstall, + 'installDependencies() is deprecated. Please use runNpmInstall() instead.' +); diff --git a/packages/now-build-utils/src/fs/stream-to-buffer.ts b/packages/now-build-utils/src/fs/stream-to-buffer.ts new file mode 100644 index 000000000..afbe90667 --- /dev/null +++ b/packages/now-build-utils/src/fs/stream-to-buffer.ts @@ -0,0 +1,28 @@ +import eos from 'end-of-stream'; + +export default function streamToBuffer( + stream: NodeJS.ReadableStream +): Promise { + return new Promise((resolve, reject) => { + const buffers: Buffer[] = []; + + stream.on('data', buffers.push.bind(buffers)); + + eos(stream, err => { + if (err) { + reject(err); + return; + } + switch (buffers.length) { + case 0: + resolve(Buffer.allocUnsafe(0)); + break; + case 1: + resolve(buffers[0]); + break; + default: + resolve(Buffer.concat(buffers)); + } + }); + }); +} diff --git a/packages/now-build-utils/src/index.ts b/packages/now-build-utils/src/index.ts new file mode 100644 index 000000000..be10d8d35 --- /dev/null +++ b/packages/now-build-utils/src/index.ts @@ -0,0 +1,47 @@ +import FileBlob from './file-blob'; +import FileFsRef from './file-fs-ref'; +import FileRef from './file-ref'; +import { Lambda, createLambda } from './lambda'; +import download, { DownloadedFiles } from './fs/download'; +import getWriteableDirectory from './fs/get-writable-directory'; +import glob from './fs/glob'; +import rename from './fs/rename'; +import { + installDependencies, + runPackageJsonScript, + runNpmInstall, + runShellScript, + getNodeVersion, + getSpawnOptions, +} from './fs/run-user-scripts'; +import streamToBuffer from './fs/stream-to-buffer'; +import shouldServe from './should-serve'; +import { detectBuilders } from './detect-builders'; +import { detectRoutes } from './detect-routes'; +import debug from './debug'; + +export { + FileBlob, + FileFsRef, + FileRef, + Lambda, + createLambda, + download, + DownloadedFiles, + getWriteableDirectory, + glob, + rename, + installDependencies, + runPackageJsonScript, + runNpmInstall, + runShellScript, + getNodeVersion, + getSpawnOptions, + streamToBuffer, + shouldServe, + detectBuilders, + detectRoutes, + debug, +}; + +export * from './types'; diff --git a/packages/now-build-utils/src/lambda.ts b/packages/now-build-utils/src/lambda.ts new file mode 100644 index 000000000..47adebd6b --- /dev/null +++ b/packages/now-build-utils/src/lambda.ts @@ -0,0 +1,107 @@ +import assert from 'assert'; +import Sema from 'async-sema'; +import { ZipFile } from 'yazl'; +import { readlink } from 'fs-extra'; +import { Files } from './types'; +import FileFsRef from './file-fs-ref'; +import { isSymbolicLink } from './fs/download'; +import streamToBuffer from './fs/stream-to-buffer'; + +interface Environment { + [key: string]: string; +} + +interface LambdaOptions { + zipBuffer: Buffer; + handler: string; + runtime: string; + environment: Environment; +} + +interface CreateLambdaOptions { + files: Files; + handler: string; + runtime: string; + environment?: Environment; +} + +export class Lambda { + public type: 'Lambda'; + public zipBuffer: Buffer; + public handler: string; + public runtime: string; + public environment: Environment; + + constructor({ zipBuffer, handler, runtime, environment }: LambdaOptions) { + this.type = 'Lambda'; + this.zipBuffer = zipBuffer; + this.handler = handler; + this.runtime = runtime; + this.environment = environment; + } +} + +const sema = new Sema(10); +const mtime = new Date(1540000000000); + +export async function createLambda({ + files, + handler, + runtime, + environment = {}, +}: CreateLambdaOptions): Promise { + assert(typeof files === 'object', '"files" must be an object'); + assert(typeof handler === 'string', '"handler" is not a string'); + assert(typeof runtime === 'string', '"runtime" is not a string'); + assert(typeof environment === 'object', '"environment" is not an object'); + + await sema.acquire(); + + try { + const zipBuffer = await createZip(files); + return new Lambda({ + zipBuffer, + handler, + runtime, + environment, + }); + } finally { + sema.release(); + } +} + +export async function createZip(files: Files): Promise { + const names = Object.keys(files).sort(); + + const symlinkTargets = new Map(); + for (const name of names) { + const file = files[name]; + if (file.mode && isSymbolicLink(file.mode) && file.type === 'FileFsRef') { + const symlinkTarget = await readlink((file as FileFsRef).fsPath); + symlinkTargets.set(name, symlinkTarget); + } + } + + const zipFile = new ZipFile(); + const zipBuffer = await new Promise((resolve, reject) => { + for (const name of names) { + const file = files[name]; + const opts = { mode: file.mode, mtime }; + const symlinkTarget = symlinkTargets.get(name); + if (typeof symlinkTarget === 'string') { + zipFile.addBuffer(Buffer.from(symlinkTarget, 'utf8'), name, opts); + } else { + const stream = file.toStream() as import('stream').Readable; + stream.on('error', reject); + zipFile.addReadStream(stream, name, opts); + } + } + + zipFile.end(); + streamToBuffer(zipFile.outputStream) + .then(resolve) + .catch(reject); + }); + + return zipBuffer; +} diff --git a/packages/now-build-utils/src/should-serve.ts b/packages/now-build-utils/src/should-serve.ts new file mode 100644 index 000000000..d28ef635b --- /dev/null +++ b/packages/now-build-utils/src/should-serve.ts @@ -0,0 +1,27 @@ +import { parse } from 'path'; +import { ShouldServeOptions } from './types'; +import FileFsRef from './file-fs-ref'; + +export default function shouldServe({ + entrypoint, + files, + requestPath, +}: ShouldServeOptions): boolean { + requestPath = requestPath.replace(/\/$/, ''); // sanitize trailing '/' + entrypoint = entrypoint.replace(/\\/, '/'); // windows compatibility + + if (entrypoint === requestPath && hasProp(files, entrypoint)) { + return true; + } + + const { dir, name } = parse(entrypoint); + if (name === 'index' && dir === requestPath && hasProp(files, entrypoint)) { + return true; + } + + return false; +} + +function hasProp(obj: { [path: string]: FileFsRef }, key: string): boolean { + return Object.hasOwnProperty.call(obj, key); +} diff --git a/packages/now-build-utils/src/types.ts b/packages/now-build-utils/src/types.ts new file mode 100644 index 000000000..fe9b8d909 --- /dev/null +++ b/packages/now-build-utils/src/types.ts @@ -0,0 +1,216 @@ +import FileRef from './file-ref'; +import FileFsRef from './file-fs-ref'; + +export interface File { + type: string; + mode: number; + toStream: () => NodeJS.ReadableStream; + /** + * The absolute path to the file in the filesystem + */ + fsPath?: string; +} + +export interface Files { + [filePath: string]: File; +} + +export interface Route { + src?: string; + dest?: string; + handle?: string; + type?: string; + headers?: { + [key: string]: string; + }; + continue?: boolean; + status?: number; +} + +export interface Config { + [key: string]: + | string + | string[] + | boolean + | number + | { [key: string]: string } + | undefined; + maxLambdaSize?: string; + includeFiles?: string | string[]; + bundle?: boolean; + ldsflags?: string; + helpers?: boolean; + rust?: string; + debug?: boolean; + zeroConfig?: boolean; + import?: { [key: string]: string }; +} + +export interface Meta { + isDev?: boolean; + skipDownload?: boolean; + requestPath?: string; + filesChanged?: string[]; + filesRemoved?: string[]; +} + +export interface AnalyzeOptions { + /** + * All source files of the project + */ + files: { + [filePath: string]: FileRef; + }; + + /** + * Name of entrypoint file for this particular build job. Value + * `files[entrypoint]` is guaranteed to exist and be a valid File reference. + * `entrypoint` is always a discrete file and never a glob, since globs are + * expanded into separate builds at deployment time. + */ + entrypoint: string; + + /** + * A writable temporary directory where you are encouraged to perform your + * build process. This directory will be populated with the restored cache. + */ + workPath: string; + + /** + * An arbitrary object passed by the user in the build definition defined + * in `now.json`. + */ + config: Config; +} + +export interface BuildOptions { + /** + * All source files of the project + */ + files: Files; + + /** + * Name of entrypoint file for this particular build job. Value + * `files[entrypoint]` is guaranteed to exist and be a valid File reference. + * `entrypoint` is always a discrete file and never a glob, since globs are + * expanded into separate builds at deployment time. + */ + entrypoint: string; + + /** + * A writable temporary directory where you are encouraged to perform your + * build process. This directory will be populated with the restored cache. + */ + workPath: string; + + /** + * An arbitrary object passed by the user in the build definition defined + * in `now.json`. + */ + config: Config; + + /** + * Metadata related to the invoker of the builder, used by `now dev`. + * Builders may use the properties on this object to change behavior based + * on the build environment. + */ + meta?: Meta; +} + +export interface PrepareCacheOptions { + /** + * All source files of the project + */ + files: Files; + + /** + * Name of entrypoint file for this particular build job. Value + * `files[entrypoint]` is guaranteed to exist and be a valid File reference. + * `entrypoint` is always a discrete file and never a glob, since globs are + * expanded into separate builds at deployment time. + */ + entrypoint: string; + + /** + * A writable temporary directory where you are encouraged to perform your + * build process. + */ + workPath: string; + + /** + * A writable temporary directory where you can build a cache to use for + * the next run. + */ + cachePath: string; + + /** + * An arbitrary object passed by the user in the build definition defined + * in `now.json`. + */ + config: Config; +} + +export interface ShouldServeOptions { + /** + * A path string from a request. + */ + requestPath: string; + + /** + * Name of entrypoint file for this particular build job. Value + * `files[entrypoint]` is guaranteed to exist and be a valid File reference. + * `entrypoint` is always a discrete file and never a glob, since globs are + * expanded into separate builds at deployment time. + */ + entrypoint: string; + + /** + * All source files of the project + */ + files: { + [path: string]: FileFsRef; + }; + + /** + * A writable temporary directory where you are encouraged to perform your + * build process. This directory will be populated with the restored cache. + */ + workPath: string; + + /** + * An arbitrary object passed by the user in the build definition defined + * in `now.json`. + */ + config: Config; +} + +export interface PackageJson { + name: string; + version: string; + engines?: { + [key: string]: string; + node: string; + npm: string; + }; + scripts?: { + [key: string]: string; + }; + dependencies?: { + [key: string]: string; + }; + devDependencies?: { + [key: string]: string; + }; +} + +export interface NodeVersion { + major: number; + range: string; + runtime: string; +} + +export interface Builder { + use: string; + src: string; + config?: Config; +} diff --git a/packages/now-build-utils/test/fixtures/01-zero-config-api/.gitignore b/packages/now-build-utils/test/fixtures/01-zero-config-api/.gitignore new file mode 100644 index 000000000..4e3879255 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/01-zero-config-api/.gitignore @@ -0,0 +1 @@ +now.json diff --git a/packages/now-build-utils/test/fixtures/01-zero-config-api/api/[endpoint].js b/packages/now-build-utils/test/fixtures/01-zero-config-api/api/[endpoint].js new file mode 100644 index 000000000..9b742e30f --- /dev/null +++ b/packages/now-build-utils/test/fixtures/01-zero-config-api/api/[endpoint].js @@ -0,0 +1,3 @@ +module.exports = (req, res) => { + res.end(req.query.endpoint); +}; diff --git a/test/fixtures/unit/now-dev-default-builds-and-routes/api/[endpoint]/[id].js b/packages/now-build-utils/test/fixtures/01-zero-config-api/api/[endpoint]/[id].js similarity index 100% rename from test/fixtures/unit/now-dev-default-builds-and-routes/api/[endpoint]/[id].js rename to packages/now-build-utils/test/fixtures/01-zero-config-api/api/[endpoint]/[id].js diff --git a/packages/now-build-utils/test/fixtures/01-zero-config-api/package.json b/packages/now-build-utils/test/fixtures/01-zero-config-api/package.json new file mode 100644 index 000000000..67ac03155 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/01-zero-config-api/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "build": "mkdir -p public && echo 'hello from index.txt' > public/index.txt" + } +} diff --git a/packages/now-build-utils/test/fixtures/02-zero-config-api/.gitignore b/packages/now-build-utils/test/fixtures/02-zero-config-api/.gitignore new file mode 100644 index 000000000..4e3879255 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/02-zero-config-api/.gitignore @@ -0,0 +1 @@ +now.json diff --git a/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date.js b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date.js new file mode 100644 index 000000000..efe0a211e --- /dev/null +++ b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date.js @@ -0,0 +1,3 @@ +module.exports = (req, res) => { + res.end('hello from api/date.js'); +}; diff --git a/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date/index.js b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date/index.js new file mode 100644 index 000000000..4bf8887c5 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/date/index.js @@ -0,0 +1,3 @@ +module.exports = (req, res) => { + res.end('hello from api/date/index.js'); +}; diff --git a/packages/now-build-utils/test/fixtures/02-zero-config-api/api/index.js b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/index.js new file mode 100644 index 000000000..978d8d301 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/02-zero-config-api/api/index.js @@ -0,0 +1,3 @@ +module.exports = (req, res) => { + res.end('hello from api/index.js'); +}; diff --git a/packages/now-build-utils/test/fixtures/02-zero-config-api/package.json b/packages/now-build-utils/test/fixtures/02-zero-config-api/package.json new file mode 100644 index 000000000..67ac03155 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/02-zero-config-api/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "build": "mkdir -p public && echo 'hello from index.txt' > public/index.txt" + } +} diff --git a/packages/now-build-utils/test/fixtures/07-cross-install/api/index.js b/packages/now-build-utils/test/fixtures/07-cross-install/api/index.js new file mode 100644 index 000000000..348be5b02 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/07-cross-install/api/index.js @@ -0,0 +1,5 @@ +const cowsay = require('cowsay').say; + +module.exports = (req, resp) => { + resp.end(cowsay({ text: 'cross-cow:RANDOMNESS_PLACEHOLDER' })); +}; diff --git a/packages/now-build-utils/test/fixtures/07-cross-install/api/package.json b/packages/now-build-utils/test/fixtures/07-cross-install/api/package.json new file mode 100644 index 000000000..1f603495a --- /dev/null +++ b/packages/now-build-utils/test/fixtures/07-cross-install/api/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "lib": "../lib" + } +} diff --git a/packages/now-build-utils/test/fixtures/07-cross-install/lib/package.json b/packages/now-build-utils/test/fixtures/07-cross-install/lib/package.json new file mode 100644 index 000000000..8f997c795 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/07-cross-install/lib/package.json @@ -0,0 +1,7 @@ +{ + "name": "lib", + "version": "0.0.1", + "dependencies": { + "cowsay": "*" + } +} diff --git a/packages/now-build-utils/test/fixtures/07-cross-install/now.json b/packages/now-build-utils/test/fixtures/07-cross-install/now.json new file mode 100644 index 000000000..ca2f24168 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/07-cross-install/now.json @@ -0,0 +1,10 @@ +{ + "version": 2, + "builds": [{ "src": "api/index.js", "use": "@now/node" }], + "probes": [ + { + "path": "/api/index.js", + "mustContain": "cross-cow:RANDOMNESS_PLACEHOLDER" + } + ] +} diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/now.json b/packages/now-build-utils/test/fixtures/08-yarn-npm/now.json new file mode 100644 index 000000000..67aa87af4 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/now.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "builds": [ + { "src": "with-npm/index.js", "use": "@now/node" }, + { "src": "with-yarn/index.js", "use": "@now/node" } + ], + "probes": [ + { "path": "/with-npm", "mustContain": "npm:RANDOMNESS_PLACEHOLDER" }, + { "path": "/with-yarn", "mustContain": "yarn:RANDOMNESS_PLACEHOLDER" } + ] +} diff --git a/test/fixtures/unit/directory-main/a/index.js b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/index.js old mode 100755 new mode 100644 similarity index 100% rename from test/fixtures/unit/directory-main/a/index.js rename to packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/index.js diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/must-be-npm.js b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/must-be-npm.js new file mode 100644 index 000000000..6117749be --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/must-be-npm.js @@ -0,0 +1,14 @@ +const fs = require('fs'); +const path = require('path'); + +const execpath = path.basename(process.env.npm_execpath); +console.log('execpath', execpath); + +if (execpath === 'npm-cli.js') { + fs.writeFileSync( + 'index.js', + 'module.exports = (_, resp) => resp.end("npm:RANDOMNESS_PLACEHOLDER");', + ); +} else { + throw new Error('npm is expected'); +} diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package-lock.json b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package-lock.json new file mode 100644 index 000000000..48e341a09 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package.json b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package.json new file mode 100644 index 000000000..7c395c71b --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-npm/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "now-build": "node must-be-npm.js" + } +} diff --git a/test/fixtures/unit/extensionless-main/index.js b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/index.js old mode 100755 new mode 100644 similarity index 100% rename from test/fixtures/unit/extensionless-main/index.js rename to packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/index.js diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/must-be-yarn.js b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/must-be-yarn.js new file mode 100644 index 000000000..df6e6e1d5 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/must-be-yarn.js @@ -0,0 +1,14 @@ +const fs = require('fs'); +const path = require('path'); + +const execpath = path.basename(process.env.npm_execpath); +console.log('execpath', execpath); + +if (execpath === 'yarn.js' || execpath === 'yarn') { + fs.writeFileSync( + 'index.js', + 'module.exports = (_, resp) => resp.end("yarn:RANDOMNESS_PLACEHOLDER");', + ); +} else { + throw new Error('yarn is expected'); +} diff --git a/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/package.json b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/package.json new file mode 100644 index 000000000..6d393fcc2 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/08-yarn-npm/with-yarn/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "now-build": "node must-be-yarn.js" + } +} diff --git a/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/index.js b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/index.js new file mode 100644 index 000000000..3ce6bc228 --- /dev/null +++ b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/index.js @@ -0,0 +1,9 @@ +const scheduler = require('@google-cloud/scheduler'); + +module.exports = (_, res) => { + if (scheduler) { + res.end('found:RANDOMNESS_PLACEHOLDER'); + } else { + res.end('nope:RANDOMNESS_PLACEHOLDER'); + } +}; diff --git a/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/now.json b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/now.json new file mode 100644 index 000000000..81132fcad --- /dev/null +++ b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/now.json @@ -0,0 +1,10 @@ +{ + "version": 2, + "builds": [ + { + "src": "index.js", + "use": "@now/node" + } + ], + "probes": [{ "path": "/", "mustContain": "found:RANDOMNESS_PLACEHOLDER" }] +} diff --git a/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/package.json b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/package.json new file mode 100644 index 000000000..3ad263a1c --- /dev/null +++ b/packages/now-build-utils/test/fixtures/15-yarn-ignore-engines/package.json @@ -0,0 +1,8 @@ +{ + "name": "15-yarn-ignore-engines", + "version": "1.0.0", + "main": "index.js", + "dependencies": { + "@google-cloud/scheduler": "0.3.0" + } +} diff --git a/packages/now-build-utils/test/symlinks/a.txt b/packages/now-build-utils/test/symlinks/a.txt new file mode 100644 index 000000000..12f00e90b --- /dev/null +++ b/packages/now-build-utils/test/symlinks/a.txt @@ -0,0 +1 @@ +contents diff --git a/packages/now-build-utils/test/symlinks/link.txt b/packages/now-build-utils/test/symlinks/link.txt new file mode 120000 index 000000000..1891a26c0 --- /dev/null +++ b/packages/now-build-utils/test/symlinks/link.txt @@ -0,0 +1 @@ +./a.txt \ No newline at end of file diff --git a/packages/now-build-utils/test/test.js b/packages/now-build-utils/test/test.js new file mode 100644 index 000000000..6157761f4 --- /dev/null +++ b/packages/now-build-utils/test/test.js @@ -0,0 +1,779 @@ +/* global beforeAll, expect, it, jest */ +const path = require('path'); +const fs = require('fs-extra'); +// eslint-disable-next-line import/no-extraneous-dependencies +const execa = require('execa'); +const assert = require('assert'); +const { createZip } = require('../dist/lambda'); +const { + glob, download, detectBuilders, detectRoutes, +} = require('../'); +const { + getSupportedNodeVersion, + defaultSelection, +} = require('../dist/fs/node-version'); +const { + packAndDeploy, + testDeployment, +} = require('../../../test/lib/deployment/test-deployment'); + +jest.setTimeout(4 * 60 * 1000); + +const builderUrl = '@canary'; +let buildUtilsUrl; + +beforeAll(async () => { + const buildUtilsPath = path.resolve(__dirname, '..'); + buildUtilsUrl = await packAndDeploy(buildUtilsPath); + console.log('buildUtilsUrl', buildUtilsUrl); +}); + +// unit tests + +it('should re-create symlinks properly', async () => { + const files = await glob('**', path.join(__dirname, 'symlinks')); + assert.equal(Object.keys(files).length, 2); + + const outDir = path.join(__dirname, 'symlinks-out'); + await fs.remove(outDir); + + const files2 = await download(files, outDir); + assert.equal(Object.keys(files2).length, 2); + + const [linkStat, aStat] = await Promise.all([ + fs.lstat(path.join(outDir, 'link.txt')), + fs.lstat(path.join(outDir, 'a.txt')), + ]); + assert(linkStat.isSymbolicLink()); + assert(aStat.isFile()); +}); + +it('should create zip files with symlinks properly', async () => { + const files = await glob('**', path.join(__dirname, 'symlinks')); + assert.equal(Object.keys(files).length, 2); + + const outFile = path.join(__dirname, 'symlinks.zip'); + await fs.remove(outFile); + + const outDir = path.join(__dirname, 'symlinks-out'); + await fs.remove(outDir); + await fs.mkdirp(outDir); + + await fs.writeFile(outFile, await createZip(files)); + await execa('unzip', [outFile], { cwd: outDir }); + + const [linkStat, aStat] = await Promise.all([ + fs.lstat(path.join(outDir, 'link.txt')), + fs.lstat(path.join(outDir, 'a.txt')), + ]); + assert(linkStat.isSymbolicLink()); + assert(aStat.isFile()); +}); + +it('should only match supported node versions', () => { + expect(getSupportedNodeVersion('10.x')).resolves.toHaveProperty('major', 10); + expect(getSupportedNodeVersion('8.10.x')).resolves.toHaveProperty('major', 8); + expect(getSupportedNodeVersion('8.11.x')).rejects.toThrow(); + expect(getSupportedNodeVersion('6.x')).rejects.toThrow(); + expect(getSupportedNodeVersion('999.x')).rejects.toThrow(); + expect(getSupportedNodeVersion('foo')).rejects.toThrow(); + expect(getSupportedNodeVersion('')).resolves.toBe(defaultSelection); + expect(getSupportedNodeVersion(null)).resolves.toBe(defaultSelection); + expect(getSupportedNodeVersion(undefined)).resolves.toBe(defaultSelection); +}); + +it('should match all semver ranges', () => { + // See https://docs.npmjs.com/files/package.json#engines + expect(getSupportedNodeVersion('10.0.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('10.x')).resolves.toHaveProperty('major', 10); + expect(getSupportedNodeVersion('>=10')).resolves.toHaveProperty('major', 10); + expect(getSupportedNodeVersion('>=10.3.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('8.5.0 - 10.5.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('>=9.0.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('>=9.5.0 <=10.5.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('~10.5.0')).resolves.toHaveProperty( + 'major', + 10, + ); + expect(getSupportedNodeVersion('^10.5.0')).resolves.toHaveProperty( + 'major', + 10, + ); +}); + +it('should support require by path for legacy builders', () => { + const index = require('@now/build-utils'); + + const download2 = require('@now/build-utils/fs/download.js'); + const getWriteableDirectory2 = require('@now/build-utils/fs/get-writable-directory.js'); + const glob2 = require('@now/build-utils/fs/glob.js'); + const rename2 = require('@now/build-utils/fs/rename.js'); + const { + runNpmInstall: runNpmInstall2, + } = require('@now/build-utils/fs/run-user-scripts.js'); + const streamToBuffer2 = require('@now/build-utils/fs/stream-to-buffer.js'); + + const FileBlob2 = require('@now/build-utils/file-blob.js'); + const FileFsRef2 = require('@now/build-utils/file-fs-ref.js'); + const FileRef2 = require('@now/build-utils/file-ref.js'); + const { Lambda: Lambda2 } = require('@now/build-utils/lambda.js'); + + expect(download2).toBe(index.download); + expect(getWriteableDirectory2).toBe(index.getWriteableDirectory); + expect(glob2).toBe(index.glob); + expect(rename2).toBe(index.rename); + expect(runNpmInstall2).toBe(index.runNpmInstall); + expect(streamToBuffer2).toBe(index.streamToBuffer); + + expect(FileBlob2).toBe(index.FileBlob); + expect(FileFsRef2).toBe(index.FileFsRef); + expect(FileRef2).toBe(index.FileRef); + expect(Lambda2).toBe(index.Lambda); +}); + +// own fixtures + +const fixturesPath = path.resolve(__dirname, 'fixtures'); + +// eslint-disable-next-line no-restricted-syntax +for (const fixture of fs.readdirSync(fixturesPath)) { + if (fixture.includes('zero-config')) { + // Those have separate tests + continue; // eslint-disable-line no-continue + } + + // eslint-disable-next-line no-loop-func + it(`should build ${fixture}`, async () => { + await expect( + testDeployment( + { builderUrl, buildUtilsUrl }, + path.join(fixturesPath, fixture), + ), + ).resolves.toBeDefined(); + }); +} + +// few foreign tests + +const buildersToTestWith = ['now-next', 'now-node', 'now-static-build']; + +// eslint-disable-next-line no-restricted-syntax +for (const builder of buildersToTestWith) { + const fixturesPath2 = path.resolve( + __dirname, + `../../${builder}/test/fixtures`, + ); + + // eslint-disable-next-line no-restricted-syntax + for (const fixture of fs.readdirSync(fixturesPath2)) { + // don't run all foreign fixtures, just some + if (['01-cowsay', '01-cache-headers', '03-env-vars'].includes(fixture)) { + // eslint-disable-next-line no-loop-func + it(`should build ${builder}/${fixture}`, async () => { + await expect( + testDeployment( + { builderUrl, buildUtilsUrl }, + path.join(fixturesPath2, fixture), + ), + ).resolves.toBeDefined(); + }); + } + } +} + +it('Test `detectBuilders`', async () => { + { + // package.json + no build + const pkg = { dependencies: { next: '9.0.0' } }; + const files = ['package.json', 'pages/index.js', 'public/index.html']; + const { builders, errors } = await detectBuilders(files, pkg); + expect(builders).toBe(null); + expect(errors.length).toBe(1); + } + + { + // package.json + no build + next + const pkg = { + scripts: { build: 'next build' }, + dependencies: { next: '9.0.0' }, + }; + const files = ['package.json', 'pages/index.js']; + const { builders, errors } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/next'); + expect(errors).toBe(null); + } + + { + // package.json + no build + next + const pkg = { + scripts: { build: 'next build' }, + devDependencies: { next: '9.0.0' }, + }; + const files = ['package.json', 'pages/index.js']; + const { builders, errors } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/next'); + expect(errors).toBe(null); + } + + { + // package.json + no build + const pkg = {}; + const files = ['package.json']; + const { builders, errors } = await detectBuilders(files, pkg); + expect(builders).toBe(null); + expect(errors.length).toBe(1); + } + + { + // static file + const files = ['index.html']; + const { builders, errors } = await detectBuilders(files); + expect(builders).toBe(null); + expect(errors).toBe(null); + } + + { + // no package.json + public + const files = ['api/users.js', 'public/index.html']; + const { builders, errors } = await detectBuilders(files); + expect(builders[1].use).toBe('@now/static'); + expect(errors).toBe(null); + } + + { + // no package.json + no build + raw static + api + const files = ['api/users.js', 'index.html']; + const { builders, errors } = await detectBuilders(files); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/users.js'); + expect(builders[1].use).toBe('@now/static'); + expect(builders[1].src).toBe('index.html'); + expect(builders.length).toBe(2); + expect(errors).toBe(null); + } + + { + // package.json + no build + root + api + const files = ['index.html', 'api/[endpoint].js', 'static/image.png']; + const { builders, errors } = await detectBuilders(files); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/[endpoint].js'); + expect(builders[1].use).toBe('@now/static'); + expect(builders[1].src).toBe('index.html'); + expect(builders[2].use).toBe('@now/static'); + expect(builders[2].src).toBe('static/image.png'); + expect(builders.length).toBe(3); + expect(errors).toBe(null); + } + + { + // api + ignore files + const files = [ + 'api/_utils/handler.js', + 'api/[endpoint]/.helper.js', + 'api/[endpoint]/[id].js', + ]; + + const { builders } = await detectBuilders(files); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/[endpoint]/[id].js'); + expect(builders.length).toBe(1); + } + + { + // api + next + public + const pkg = { + scripts: { build: 'next build' }, + devDependencies: { next: '9.0.0' }, + }; + const files = ['package.json', 'api/endpoint.js', 'public/index.html']; + + const { builders } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/endpoint.js'); + expect(builders[1].use).toBe('@now/next'); + expect(builders[1].src).toBe('package.json'); + expect(builders.length).toBe(2); + } + + { + // api + next + raw static + const pkg = { + scripts: { build: 'next build' }, + devDependencies: { next: '9.0.0' }, + }; + const files = ['package.json', 'api/endpoint.js', 'index.html']; + + const { builders } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/endpoint.js'); + expect(builders[1].use).toBe('@now/next'); + expect(builders[1].src).toBe('package.json'); + expect(builders.length).toBe(2); + } + + { + // api + raw static + const files = ['api/endpoint.js', 'index.html', 'favicon.ico']; + + const { builders } = await detectBuilders(files); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/endpoint.js'); + expect(builders[1].use).toBe('@now/static'); + expect(builders[1].src).toBe('favicon.ico'); + expect(builders[2].use).toBe('@now/static'); + expect(builders[2].src).toBe('index.html'); + expect(builders.length).toBe(3); + } + + { + // api + public + const files = [ + 'api/endpoint.js', + 'public/index.html', + 'public/favicon.ico', + 'README.md', + ]; + + const { builders } = await detectBuilders(files); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/endpoint.js'); + expect(builders[1].use).toBe('@now/static'); + expect(builders[1].src).toBe('public/**/*'); + expect(builders.length).toBe(2); + } + + { + // just public + const files = ['public/index.html', 'public/favicon.ico', 'README.md']; + + const { builders } = await detectBuilders(files); + expect(builders[0].src).toBe('public/**/*'); + expect(builders.length).toBe(1); + } + + { + // next + public + const pkg = { + scripts: { build: 'next build' }, + devDependencies: { next: '9.0.0' }, + }; + const files = ['package.json', 'public/index.html', 'README.md']; + + const { builders } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/next'); + expect(builders[0].src).toBe('package.json'); + expect(builders.length).toBe(1); + } + + { + // nuxt + const pkg = { + scripts: { build: 'nuxt build' }, + dependencies: { nuxt: '2.8.1' }, + }; + const files = ['package.json', 'pages/index.js']; + + const { builders } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/static-build'); + expect(builders[0].src).toBe('package.json'); + expect(builders.length).toBe(1); + } + + { + // package.json with no build + api + const pkg = { dependencies: { next: '9.0.0' } }; + const files = ['package.json', 'api/[endpoint].js']; + + const { builders } = await detectBuilders(files, pkg); + expect(builders[0].use).toBe('@now/node'); + expect(builders[0].src).toBe('api/[endpoint].js'); + expect(builders.length).toBe(1); + } + + { + // package.json with no build + public directory + const pkg = { dependencies: { next: '9.0.0' } }; + const files = ['package.json', 'public/index.html']; + + const { builders, errors } = await detectBuilders(files, pkg); + expect(builders).toBe(null); + expect(errors.length).toBe(1); + } + + { + // no package.json + api + const files = ['api/[endpoint].js', 'api/[endpoint]/[id].js']; + + const { builders } = await detectBuilders(files); + expect(builders.length).toBe(2); + } + + { + // no package.json + no api + const files = ['index.html']; + + const { builders, errors } = await detectBuilders(files); + expect(builders).toBe(null); + expect(errors).toBe(null); + } + + { + // package.json + api + canary + const pkg = { + scripts: { build: 'next build' }, + dependencies: { next: '9.0.0' }, + }; + const files = [ + 'pages/index.js', + 'api/[endpoint].js', + 'api/[endpoint]/[id].js', + ]; + + const { builders } = await detectBuilders(files, pkg, { tag: 'canary' }); + expect(builders[0].use).toBe('@now/node@canary'); + expect(builders[1].use).toBe('@now/node@canary'); + expect(builders[2].use).toBe('@now/next@canary'); + expect(builders.length).toBe(3); + } + + { + // package.json + api + latest + const pkg = { + scripts: { build: 'next build' }, + dependencies: { next: '9.0.0' }, + }; + const files = [ + 'pages/index.js', + 'api/[endpoint].js', + 'api/[endpoint]/[id].js', + ]; + + const { builders } = await detectBuilders(files, pkg, { tag: 'latest' }); + expect(builders[0].use).toBe('@now/node@latest'); + expect(builders[1].use).toBe('@now/node@latest'); + expect(builders[2].use).toBe('@now/next@latest'); + expect(builders.length).toBe(3); + } + + { + // package.json + api + random tag + const pkg = { + scripts: { build: 'next build' }, + dependencies: { next: '9.0.0' }, + }; + const files = [ + 'pages/index.js', + 'api/[endpoint].js', + 'api/[endpoint]/[id].js', + ]; + + const { builders } = await detectBuilders(files, pkg, { tag: 'haha' }); + expect(builders[0].use).toBe('@now/node@haha'); + expect(builders[1].use).toBe('@now/node@haha'); + expect(builders[2].use).toBe('@now/next@haha'); + expect(builders.length).toBe(3); + } +}); + +it('Test `detectRoutes`', async () => { + { + const files = ['api/user.go', 'api/team.js', 'api/package.json']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + expect(defaultRoutes.length).toBe(3); + expect(defaultRoutes[0].dest).toBe('/api/team.js'); + expect(defaultRoutes[1].dest).toBe('/api/user.go'); + expect(defaultRoutes[2].dest).not.toBeDefined(); + expect(defaultRoutes[2].status).toBe(404); + } + + { + const files = ['api/user.go', 'api/user.js']; + + const { builders } = await detectBuilders(files); + const { error } = await detectRoutes(files, builders); + expect(error.code).toBe('conflicting_file_path'); + } + + { + const files = ['api/[user].go', 'api/[team]/[id].js']; + + const { builders } = await detectBuilders(files); + const { error } = await detectRoutes(files, builders); + expect(error.code).toBe('conflicting_file_path'); + } + + { + const files = ['api/[team]/[team].js']; + + const { builders } = await detectBuilders(files); + const { error } = await detectRoutes(files, builders); + expect(error.code).toBe('conflicting_path_segment'); + } + + { + const files = ['api/date/index.js', 'api/date/index.go']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes, error } = await detectRoutes(files, builders); + expect(defaultRoutes).toBe(null); + expect(error.code).toBe('conflicting_file_path'); + } + + { + const files = ['api/[endpoint].js', 'api/[endpoint]/[id].js']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + expect(defaultRoutes.length).toBe(3); + } + + { + const files = [ + 'public/index.html', + 'api/[endpoint].js', + 'api/[endpoint]/[id].js', + ]; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + expect(defaultRoutes[2].status).toBe(404); + expect(defaultRoutes[2].src).toBe('/api(\\/.*)?$'); + expect(defaultRoutes[3].src).toBe('/(.*)'); + expect(defaultRoutes[3].dest).toBe('/public/$1'); + expect(defaultRoutes.length).toBe(4); + } + + { + const pkg = { + scripts: { build: 'next build' }, + devDependencies: { next: '9.0.0' }, + }; + const files = ['public/index.html', 'api/[endpoint].js']; + + const { builders } = await detectBuilders(files, pkg); + const { defaultRoutes } = await detectRoutes(files, builders); + expect(defaultRoutes[1].status).toBe(404); + expect(defaultRoutes[1].src).toBe('/api(\\/.*)?$'); + expect(defaultRoutes.length).toBe(2); + } + + { + const files = ['public/index.html']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + + expect(defaultRoutes.length).toBe(1); + } + + { + const files = ['api/date/index.js', 'api/date.js']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + + expect(defaultRoutes.length).toBe(3); + expect(defaultRoutes[0].src).toBe( + '^/api/date(\\/|\\/index|\\/index\\.js)?$', + ); + expect(defaultRoutes[0].dest).toBe('/api/date/index.js'); + expect(defaultRoutes[1].src).toBe('^/api/(date|date\\.js)$'); + expect(defaultRoutes[1].dest).toBe('/api/date.js'); + } + + { + const files = ['api/date.js', 'api/[date]/index.js']; + + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + + expect(defaultRoutes.length).toBe(3); + expect(defaultRoutes[0].src).toBe( + '^/api/([^\\/]+)(\\/|\\/index|\\/index\\.js)?$', + ); + expect(defaultRoutes[0].dest).toBe('/api/[date]/index.js?date=$1'); + expect(defaultRoutes[1].src).toBe('^/api/(date|date\\.js)$'); + expect(defaultRoutes[1].dest).toBe('/api/date.js'); + } + + { + const files = [ + 'api/index.ts', + 'api/index.d.ts', + 'api/users/index.ts', + 'api/users/index.d.ts', + 'api/food.ts', + 'api/ts/gold.ts', + ]; + const { builders } = await detectBuilders(files); + const { defaultRoutes } = await detectRoutes(files, builders); + + expect(builders.length).toBe(4); + expect(builders[0].use).toBe('@now/node'); + expect(builders[1].use).toBe('@now/node'); + expect(builders[2].use).toBe('@now/node'); + expect(builders[3].use).toBe('@now/node'); + expect(defaultRoutes.length).toBe(5); + } +}); + +it('Test `detectBuilders` and `detectRoutes`', async () => { + const fixture = path.join(__dirname, 'fixtures', '01-zero-config-api'); + const pkg = await fs.readJSON(path.join(fixture, 'package.json')); + const fileList = await glob('**', fixture); + const files = Object.keys(fileList); + + const probes = [ + { + path: '/api/my-endpoint', + mustContain: 'my-endpoint', + status: 200, + }, + { + path: '/api/other-endpoint', + mustContain: 'other-endpoint', + status: 200, + }, + { + path: '/api/team/zeit', + mustContain: 'team/zeit', + status: 200, + }, + { + path: '/api/user/myself', + mustContain: 'user/myself', + status: 200, + }, + { + path: '/api/not-okay/', + status: 404, + }, + { + path: '/api', + status: 404, + }, + { + path: '/api/', + status: 404, + }, + { + path: '/', + mustContain: 'hello from index.txt', + }, + ]; + + const { builders } = await detectBuilders(files, pkg); + const { defaultRoutes } = await detectRoutes(files, builders); + + const nowConfig = { builds: builders, routes: defaultRoutes, probes }; + await fs.writeFile( + path.join(fixture, 'now.json'), + JSON.stringify(nowConfig, null, 2), + ); + + const deployment = await testDeployment( + { builderUrl, buildUtilsUrl }, + fixture, + ); + expect(deployment).toBeDefined(); +}); + +it('Test `detectBuilders` and `detectRoutes` with `index` files', async () => { + const fixture = path.join(__dirname, 'fixtures', '02-zero-config-api'); + const pkg = await fs.readJSON(path.join(fixture, 'package.json')); + const fileList = await glob('**', fixture); + const files = Object.keys(fileList); + + const probes = [ + { + path: '/api/not-okay', + status: 404, + }, + { + path: '/api', + mustContain: 'hello from api/index.js', + status: 200, + }, + { + path: '/api/', + mustContain: 'hello from api/index.js', + status: 200, + }, + { + path: '/api/index', + mustContain: 'hello from api/index.js', + status: 200, + }, + { + path: '/api/index.js', + mustContain: 'hello from api/index.js', + status: 200, + }, + { + path: '/api/date.js', + mustContain: 'hello from api/date.js', + status: 200, + }, + { + // Someone might expect this to be `date.js`, + // but I doubt that there is any case were both + // `date/index.js` and `date.js` exists, + // so it is not special cased + path: '/api/date', + mustContain: 'hello from api/date/index.js', + status: 200, + }, + { + path: '/api/date/', + mustContain: 'hello from api/date/index.js', + status: 200, + }, + { + path: '/api/date/index', + mustContain: 'hello from api/date/index.js', + status: 200, + }, + { + path: '/api/date/index.js', + mustContain: 'hello from api/date/index.js', + status: 200, + }, + { + path: '/', + mustContain: 'hello from index.txt', + }, + ]; + + const { builders } = await detectBuilders(files, pkg); + const { defaultRoutes } = await detectRoutes(files, builders); + + const nowConfig = { builds: builders, routes: defaultRoutes, probes }; + await fs.writeFile( + path.join(fixture, 'now.json'), + JSON.stringify(nowConfig, null, 2), + ); + + const deployment = await testDeployment( + { builderUrl, buildUtilsUrl }, + fixture, + ); + expect(deployment).toBeDefined(); +}); diff --git a/packages/now-build-utils/tsconfig.json b/packages/now-build-utils/tsconfig.json new file mode 100644 index 000000000..15ef69379 --- /dev/null +++ b/packages/now-build-utils/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "declaration": true, + "esModuleInterop": true, + "lib": ["esnext"], + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "outDir": "./dist", + "types": ["node"], + "strict": true, + "target": "esnext" + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/packages/now-cgi/.editorconfig b/packages/now-cgi/.editorconfig new file mode 100644 index 000000000..dcdefda3b --- /dev/null +++ b/packages/now-cgi/.editorconfig @@ -0,0 +1,32 @@ +root = true + +[*] +indent_style = tab +indent_size = 4 +tab_width = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[{*.json,*.json.example,*.gyp,*.yml}] +indent_style = space +indent_size = 2 + +[*.py] +indent_style = space +indent_size = 4 + +[*.md] +trim_trailing_whitespace = false + +# Ideal settings - some plugins might support these. +[*.js] +quote_type = single + +[{*.c,*.cc,*.h,*.hh,*.cpp,*.hpp,*.m,*.mm,*.mpp,*.js,*.java,*.go,*.rs,*.php,*.ng,*.jsx,*.ts,*.d,*.cs,*.swift}] +curly_bracket_next_line = false +spaces_around_operators = true +spaces_around_brackets = outside +# close enough to 1TB +indent_brace_style = K&R diff --git a/packages/now-cgi/.gitignore b/packages/now-cgi/.gitignore new file mode 100644 index 000000000..90c4021f9 --- /dev/null +++ b/packages/now-cgi/.gitignore @@ -0,0 +1,2 @@ +node_modules +handler diff --git a/packages/now-cgi/build.sh b/packages/now-cgi/build.sh new file mode 100755 index 000000000..5db81d48f --- /dev/null +++ b/packages/now-cgi/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +export GOOS=linux +export GOARCH=amd64 +export GOPATH=$HOME/go +go get github.com/aws/aws-lambda-go/events +go get github.com/aws/aws-lambda-go/lambda +go build -o handler main.go diff --git a/packages/now-cgi/index.js b/packages/now-cgi/index.js new file mode 100644 index 000000000..6324eb2c0 --- /dev/null +++ b/packages/now-cgi/index.js @@ -0,0 +1,46 @@ +const path = require('path'); +const { mkdirp, copyFile } = require('fs-extra'); + +const glob = require('@now/build-utils/fs/glob'); // eslint-disable-line import/no-extraneous-dependencies +const download = require('@now/build-utils/fs/download'); // eslint-disable-line import/no-extraneous-dependencies +const { createLambda } = require('@now/build-utils/lambda'); // eslint-disable-line import/no-extraneous-dependencies +const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory'); // eslint-disable-line import/no-extraneous-dependencies +const { shouldServe } = require('@now/build-utils'); // eslint-disable-line import/no-extraneous-dependencies + +exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest; + +exports.build = async ({ + workPath, files, entrypoint, meta, +}) => { + console.log('downloading files...'); + const outDir = await getWritableDirectory(); + + await download(files, workPath, meta); + + const handlerPath = path.join(__dirname, 'handler'); + await copyFile(handlerPath, path.join(outDir, 'handler')); + + const entrypointOutDir = path.join(outDir, path.dirname(entrypoint)); + await mkdirp(entrypointOutDir); + + // For now only the entrypoint file is copied into the lambda + await copyFile( + path.join(workPath, entrypoint), + path.join(outDir, entrypoint), + ); + + const lambda = await createLambda({ + files: await glob('**', outDir), + handler: 'handler', + runtime: 'go1.x', + environment: { + SCRIPT_FILENAME: entrypoint, + }, + }); + + return { + [entrypoint]: lambda, + }; +}; + +exports.shouldServe = shouldServe; diff --git a/packages/now-cgi/main.go b/packages/now-cgi/main.go new file mode 100644 index 000000000..c33deffd8 --- /dev/null +++ b/packages/now-cgi/main.go @@ -0,0 +1,36 @@ +package main + +import ( + now "../../utils/go/bridge" + "net/http" + "net/http/cgi" + "os" + "path/filepath" +) + +type CgiHandler struct { + http.Handler + Dir string + Script string +} + +func (h *CgiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + handler := cgi.Handler{ + Path: h.Script, + Root: "/" + h.Script, + Dir: h.Dir, + Env: []string{ + "HTTPS=on", + "SERVER_PORT=443", + "SERVER_SOFTWARE=@now/cgi", + }, + } + handler.ServeHTTP(w, r) +} + +func main() { + workdir, _ := filepath.Abs(".") + script := os.Getenv("SCRIPT_FILENAME") + handler := &CgiHandler{nil, workdir, script} + now.Start(handler) +} diff --git a/packages/now-cgi/package.json b/packages/now-cgi/package.json new file mode 100644 index 000000000..6ce387df7 --- /dev/null +++ b/packages/now-cgi/package.json @@ -0,0 +1,25 @@ +{ + "name": "@now/cgi", + "version": "0.1.4", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/zeit/now-builders.git", + "directory": "packages/now-cgi" + }, + "scripts": { + "test-integration": "best -I test/*.js", + "prepublish": "./build.sh" + }, + "files": [ + "index.js", + "handler" + ], + "dependencies": { + "fs-extra": "7.0.0" + }, + "devDependencies": { + "@zeit/best": "0.4.3", + "rmfr": "2.0.0" + } +} diff --git a/packages/now-cgi/yarn.lock b/packages/now-cgi/yarn.lock new file mode 100644 index 000000000..bff63c4c1 --- /dev/null +++ b/packages/now-cgi/yarn.lock @@ -0,0 +1,862 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@mrmlnc/readdir-enhanced@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.0.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + +"@zeit/best@0.4.3": + version "0.4.3" + resolved "http://registry.npmjs.org/@zeit/best/-/best-0.4.3.tgz#eaebdfa8b24121a97b1753501ea8c9330d549b30" + dependencies: + arg "1.0.0" + chalk "2.3.1" + diff "3.5.0" + globby "8.0.0" + signal-exit "3.0.2" + +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +append-type@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/append-type/-/append-type-1.0.1.tgz#e29a6eb22cec0c0b9b93063b3cf6b10d9e0c60f4" + +arg@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.0.tgz#444d885a4e25b121640b55155ef7cd03975d6050" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-to-sentence@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-to-sentence/-/array-to-sentence-1.1.0.tgz#c804956dafa53232495b205a9452753a258d39fc" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +assert-valid-glob-opts@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-valid-glob-opts/-/assert-valid-glob-opts-1.0.0.tgz#ab9b5438ec5e929f5bb08201819affb1227f730a" + dependencies: + glob-option-error "^1.0.0" + validate-glob-opts "^1.0.0" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + +chalk@2.3.1: + version "2.3.1" + resolved "http://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-glob@^2.0.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.0.1" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.1" + micromatch "^3.1.10" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fs-extra@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +glob-option-error@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glob-option-error/-/glob-option-error-1.0.0.tgz#57cc65def9c7d5c1461baf13129bb5403cff6176" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + +glob@^7.0.5, glob@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globby@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.0.tgz#e6f8340ead9a52fa417ec0e75ae664ae0026f5c6" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + fast-glob "^2.0.2" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.14" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.14.tgz#1b6e8362ef8c5ecb5da799901f39297e3054773a" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +ignore@^3.3.5: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + +indexed-filter@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/indexed-filter/-/indexed-filter-1.0.3.tgz#7911439191cac588188464640a8db4f6b324973d" + dependencies: + append-type "^1.0.1" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inspect-with-kind@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/inspect-with-kind/-/inspect-with-kind-1.0.5.tgz#fce151d4ce89722c82ca8e9860bb96f9167c316c" + dependencies: + kind-of "^6.0.2" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +merge2@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" + +micromatch@^3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + +rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rmfr@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rmfr/-/rmfr-2.0.0.tgz#8a42e81332550b3f0019b8fb8ab245bea81b6d1c" + dependencies: + assert-valid-glob-opts "^1.0.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + inspect-with-kind "^1.0.4" + rimraf "^2.6.2" + +safe-regex@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + dependencies: + ret "~0.1.10" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +signal-exit@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +supports-color@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + +validate-glob-opts@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate-glob-opts/-/validate-glob-opts-1.0.2.tgz#ef9f98977d965537ea4f51fa7d5799e9c6ebca91" + dependencies: + array-to-sentence "^1.1.0" + indexed-filter "^1.0.0" + inspect-with-kind "^1.0.4" + is-plain-obj "^1.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" diff --git a/.editorconfig b/packages/now-cli/.editorconfig similarity index 100% rename from .editorconfig rename to packages/now-cli/.editorconfig diff --git a/.eslintignore b/packages/now-cli/.eslintignore similarity index 100% rename from .eslintignore rename to packages/now-cli/.eslintignore diff --git a/.eslintrc.js b/packages/now-cli/.eslintrc.js similarity index 100% rename from .eslintrc.js rename to packages/now-cli/.eslintrc.js diff --git a/@types/arg/index.d.ts b/packages/now-cli/@types/arg/index.d.ts similarity index 100% rename from @types/arg/index.d.ts rename to packages/now-cli/@types/arg/index.d.ts diff --git a/@types/cache-or-tmp-directory/index.d.ts b/packages/now-cli/@types/cache-or-tmp-directory/index.d.ts similarity index 100% rename from @types/cache-or-tmp-directory/index.d.ts rename to packages/now-cli/@types/cache-or-tmp-directory/index.d.ts diff --git a/@types/intercept-stdout/index.d.ts b/packages/now-cli/@types/intercept-stdout/index.d.ts similarity index 100% rename from @types/intercept-stdout/index.d.ts rename to packages/now-cli/@types/intercept-stdout/index.d.ts diff --git a/@types/pcre-to-regexp/index.d.ts b/packages/now-cli/@types/pcre-to-regexp/index.d.ts similarity index 100% rename from @types/pcre-to-regexp/index.d.ts rename to packages/now-cli/@types/pcre-to-regexp/index.d.ts diff --git a/@types/promisepipe/index.d.ts b/packages/now-cli/@types/promisepipe/index.d.ts similarity index 100% rename from @types/promisepipe/index.d.ts rename to packages/now-cli/@types/promisepipe/index.d.ts diff --git a/@types/serve-handler/index.d.ts b/packages/now-cli/@types/serve-handler/index.d.ts similarity index 100% rename from @types/serve-handler/index.d.ts rename to packages/now-cli/@types/serve-handler/index.d.ts diff --git a/@types/which-promise/index.d.ts b/packages/now-cli/@types/which-promise/index.d.ts similarity index 100% rename from @types/which-promise/index.d.ts rename to packages/now-cli/@types/which-promise/index.d.ts diff --git a/packages/now-cli/README.md b/packages/now-cli/README.md new file mode 100644 index 000000000..16f350671 --- /dev/null +++ b/packages/now-cli/README.md @@ -0,0 +1,41 @@ +![now](https://assets.zeit.co/image/upload/v1542240976/repositories/now-cli/now-cli-repo-banner-v2.png) + +[![Build Status](https://circleci.com/gh/zeit/now-cli.svg?&style=shield)](https://circleci.com/gh/zeit/workflows/now-cli) +[![Join the community on Spectrum](https://withspectrum.github.io/badge/badge.svg)](https://spectrum.chat/zeit) + +**Note**: The [canary](https://github.com/zeit/now-cli/tree/canary) branch is under heavy development – the stable release branch is [master](https://github.com/zeit/now-cli/tree/master). + +## Usage + +To install the latest version of Now CLI, visit [zeit.co/download](https://zeit.co/download) or run this command: + +``` +npm i -g now +``` + +To quickly start a new project, run the following commands: + +``` +now init # Pick an example project to clone +cd # Change directory to the newly created project +now dev # Run locally during development +now # Deploy to the cloud +``` + +## Documentation + +For details on how to use Now CLI, check out our [documentation](https://zeit.co/docs). + +## Caught a Bug? + +1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device +2. Install dependencies with `yarn install` +3. Compile the code: `yarn build` +4. Link the package to the global module directory: `yarn link` +5. You can now start using `now` anywhere inside the command line + +As always, you should use `yarn test` to run the tests and see if your changes have broken anything. + +## How to Create a Release + +If you have write access to this repository, you can read more about how to publish a release [here](https://github.com/zeit/now-cli/wiki/Creating-a-Release). diff --git a/packages/now-cli/package.json b/packages/now-cli/package.json new file mode 100644 index 000000000..f3dd401c7 --- /dev/null +++ b/packages/now-cli/package.json @@ -0,0 +1,200 @@ +{ + "name": "now", + "version": "16.1.2", + "preferGlobal": true, + "license": "Apache-2.0", + "description": "The command-line interface for Now", + "repository": "zeit/now-cli", + "scripts": { + "test": "yarn test-lint", + "preinstall": "node ./scripts/preinstall.js", + "test-unit": "nyc ava test/*unit.js --serial --fail-fast --verbose", + "test-integration": "ava test/integration.js --serial --fail-fast", + "test-integration-now-dev": "ava test/dev/integration.js --serial --fail-fast --verbose", + "test-lint": "eslint . --ext .js,.ts", + "prepublishOnly": "yarn build", + "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", + "build": "ts-node ./scripts/build.ts", + "build-dev": "ts-node ./scripts/build.ts --dev", + "format-modified": "prettier --parser typescript --write --single-quote `git diff --name-only HEAD * | grep -e \".*\\.ts$\" -e \".*\\.js$\" | xargs echo`" + }, + "nyc": { + "include": [ + "src/**" + ], + "extension": [ + ".js", + ".ts" + ], + "require": [ + "ts-node/register" + ], + "reporter": [ + "text", + "html" + ], + "sourceMap": true, + "instrument": true, + "all": true + }, + "git": { + "pre-commit": [ + "test-lint", + "format-modified" + ] + }, + "bin": { + "now": "./dist/index.js" + }, + "files": [ + "dist", + "scripts/preinstall.js" + ], + "ava": { + "compileEnhancements": false, + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register/transpile-only", + "esm" + ] + }, + "engines": { + "node": ">= 8.11" + }, + "devDependencies": { + "@now/build-utils": "0.9.13", + "@now/go": "latest", + "@now/next": "latest", + "@now/node": "latest", + "@now/php": "latest", + "@now/static-build": "latest", + "@sentry/node": "5.5.0", + "@types/ansi-escapes": "3.0.0", + "@types/ansi-regex": "4.0.0", + "@types/async-retry": "1.2.1", + "@types/bytes": "3.0.0", + "@types/debug": "0.0.31", + "@types/dotenv": "6.1.1", + "@types/escape-html": "0.0.20", + "@types/execa": "0.9.0", + "@types/fs-extra": "5.0.5", + "@types/glob": "7.1.1", + "@types/http-proxy": "1.16.2", + "@types/load-json-file": "2.0.7", + "@types/micro": "7.3.3", + "@types/mime-types": "2.1.0", + "@types/minimatch": "3.0.3", + "@types/mri": "1.1.0", + "@types/ms": "0.7.30", + "@types/node": "11.11.0", + "@types/node-fetch": "2.1.4", + "@types/npm-package-arg": "6.1.0", + "@types/pluralize": "0.0.29", + "@types/progress": "2.0.3", + "@types/psl": "1.1.0", + "@types/semver": "6.0.1", + "@types/tar-fs": "1.16.1", + "@types/text-table": "0.2.0", + "@types/universal-analytics": "0.4.2", + "@types/which": "1.3.1", + "@types/write-json-file": "2.2.1", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.1.0", + "@zeit/dockerignore": "0.0.5", + "@zeit/fun": "0.9.1", + "@zeit/git-hooks": "0.1.4", + "@zeit/ncc": "0.18.5", + "@zeit/source-map-support": "0.6.2", + "alpha-sort": "2.0.1", + "ansi-escapes": "3.0.0", + "ansi-regex": "3.0.0", + "arg": "2.0.0", + "async-listen": "1.2.0", + "async-retry": "1.1.3", + "async-sema": "2.1.4", + "ava": "2.2.0", + "bytes": "3.0.0", + "cache-or-tmp-directory": "1.0.0", + "chalk": "2.4.2", + "chokidar": "2.1.6", + "clipboardy": "2.1.0", + "codecov": "3.1.0", + "cpy": "7.2.0", + "credit-card": "3.0.1", + "date-fns": "1.29.0", + "death": "1.1.0", + "debug": "3.1.0", + "deployment-type": "1.0.1", + "docker-file-parser": "1.0.2", + "dot": "1.1.2", + "dotenv": "4.0.0", + "download": "6.2.5", + "email-prompt": "0.3.2", + "email-validator": "1.1.1", + "epipebomb": "1.0.0", + "escape-html": "1.0.3", + "eslint": "5.16.0", + "eslint-config-airbnb": "17.1.0", + "eslint-config-prettier": "4.1.0", + "eslint-import-resolver-typescript": "1.1.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "esm": "3.1.4", + "execa": "1.0.0", + "fetch-h2": "2.0.3", + "fs-extra": "7.0.1", + "glob": "7.1.2", + "http-proxy": "1.17.0", + "ini": "1.3.4", + "inquirer": "3.3.0", + "is-url": "1.2.2", + "jaro-winkler": "0.2.8", + "jsonlines": "0.1.1", + "load-json-file": "3.0.0", + "micro": "9.1.2", + "mime-types": "2.1.24", + "minimatch": "3.0.4", + "mri": "1.1.0", + "ms": "2.1.1", + "node-fetch": "1.7.3", + "npm-package-arg": "6.1.0", + "nyc": "13.2.0", + "ora": "3.4.0", + "pcre-to-regexp": "0.0.5", + "pluralize": "7.0.0", + "pre-commit": "1.2.2", + "prettier": "1.16.2", + "printf": "0.2.5", + "progress": "2.0.3", + "promisepipe": "3.0.0", + "psl": "1.1.31", + "qr-image": "3.2.0", + "raw-body": "2.4.1", + "read-pkg": "2.0.0", + "rx-lite-aggregates": "4.0.8", + "semver": "5.5.0", + "serve-handler": "6.1.1", + "sinon": "4.4.2", + "strip-ansi": "5.2.0", + "stripe": "5.1.0", + "tar-fs": "1.16.3", + "test-listen": "1.1.0", + "text-table": "0.2.0", + "then-sleep": "1.0.1", + "through2": "2.0.3", + "title": "3.4.1", + "tmp-promise": "1.0.3", + "ts-node": "8.3.0", + "typescript": "3.2.4", + "universal-analytics": "0.4.20", + "update-check": "1.5.3", + "utility-types": "2.1.0", + "which": "1.3.1", + "which-promise": "1.0.0", + "write-json-file": "2.2.0", + "yarn": "1.17.3" + } +} diff --git a/scripts/build.ts b/packages/now-cli/scripts/build.ts similarity index 94% rename from scripts/build.ts rename to packages/now-cli/scripts/build.ts index c96d5aed4..be2309fc4 100644 --- a/scripts/build.ts +++ b/packages/now-cli/scripts/build.ts @@ -36,7 +36,7 @@ async function createBuildersTarball() { } } - const yarn = join(dirRoot, 'node_modules/yarn/bin/yarn.js'); + const yarn = join(dirRoot, '../../node_modules/yarn/bin/yarn.js'); await execa(process.execPath, [yarn, 'add', '--no-lockfile', ...builders], { cwd: buildersDir, stdio: 'inherit' @@ -61,7 +61,7 @@ async function main() { // `fsevents` feature using `useFsEvents: false`, so delete the module here so // that it is not compiled by ncc, which makes the npm package size larger // than necessary. - await remove(join(dirRoot, 'node_modules/fsevents')); + await remove(join(dirRoot, '../../node_modules/fsevents')); // Compile the `doT.js` template files for `now dev` console.log(); @@ -92,7 +92,7 @@ async function main() { // get compiled into the final ncc bundle file, however, we want them to be // present in the npm package because the contents of those files are involved // with `fun`'s cache invalidation mechanism and they need to be shasum'd. - const runtimes = join(dirRoot, 'node_modules/@zeit/fun/dist/src/runtimes'); + const runtimes = join(dirRoot, '../../node_modules/@zeit/fun/dist/src/runtimes'); const dest = join(dirRoot, 'dist/runtimes'); await cpy('**/*', dest, { parents: true, cwd: runtimes }); diff --git a/scripts/compile-templates.js b/packages/now-cli/scripts/compile-templates.js similarity index 93% rename from scripts/compile-templates.js rename to packages/now-cli/scripts/compile-templates.js index 6c9cf5495..c057d223c 100644 --- a/scripts/compile-templates.js +++ b/packages/now-cli/scripts/compile-templates.js @@ -7,7 +7,7 @@ async function main() { // Compile the `doT.js` template files for `now dev` const templatesDir = join(dirRoot, 'src/util/dev/templates'); - const dotPacker = join(dirRoot, 'node_modules/dot/bin/dot-packer'); + const dotPacker = join(dirRoot, '../../node_modules/dot/bin/dot-packer'); await execa(process.execPath, [dotPacker], { cwd: templatesDir, stdio: 'inherit' @@ -18,7 +18,7 @@ async function main() { // Prettier console.log('\nMaking the compiled template functions prettier...'); - const prettier = join(dirRoot, 'node_modules/prettier/bin-prettier.js'); + const prettier = join(dirRoot, '../../node_modules/prettier/bin-prettier.js'); await execa( process.execPath, [prettier, '--write', '--single-quote', ...compiledFiles], diff --git a/scripts/preinstall.js b/packages/now-cli/scripts/preinstall.js similarity index 100% rename from scripts/preinstall.js rename to packages/now-cli/scripts/preinstall.js diff --git a/scripts/start.js b/packages/now-cli/scripts/start.js similarity index 100% rename from scripts/start.js rename to packages/now-cli/scripts/start.js diff --git a/src/commands/alias/index.js b/packages/now-cli/src/commands/alias/index.js similarity index 100% rename from src/commands/alias/index.js rename to packages/now-cli/src/commands/alias/index.js diff --git a/src/commands/alias/ls.js b/packages/now-cli/src/commands/alias/ls.js similarity index 100% rename from src/commands/alias/ls.js rename to packages/now-cli/src/commands/alias/ls.js diff --git a/src/commands/alias/rm.js b/packages/now-cli/src/commands/alias/rm.js similarity index 100% rename from src/commands/alias/rm.js rename to packages/now-cli/src/commands/alias/rm.js diff --git a/src/commands/alias/set.ts b/packages/now-cli/src/commands/alias/set.ts similarity index 100% rename from src/commands/alias/set.ts rename to packages/now-cli/src/commands/alias/set.ts diff --git a/src/commands/billing/add.js b/packages/now-cli/src/commands/billing/add.js similarity index 100% rename from src/commands/billing/add.js rename to packages/now-cli/src/commands/billing/add.js diff --git a/src/commands/billing/index.js b/packages/now-cli/src/commands/billing/index.js similarity index 100% rename from src/commands/billing/index.js rename to packages/now-cli/src/commands/billing/index.js diff --git a/src/commands/certs/add.js b/packages/now-cli/src/commands/certs/add.js similarity index 100% rename from src/commands/certs/add.js rename to packages/now-cli/src/commands/certs/add.js diff --git a/src/commands/certs/index.js b/packages/now-cli/src/commands/certs/index.js similarity index 100% rename from src/commands/certs/index.js rename to packages/now-cli/src/commands/certs/index.js diff --git a/src/commands/certs/issue.ts b/packages/now-cli/src/commands/certs/issue.ts similarity index 100% rename from src/commands/certs/issue.ts rename to packages/now-cli/src/commands/certs/issue.ts diff --git a/src/commands/certs/ls.js b/packages/now-cli/src/commands/certs/ls.js similarity index 100% rename from src/commands/certs/ls.js rename to packages/now-cli/src/commands/certs/ls.js diff --git a/src/commands/certs/rm.ts b/packages/now-cli/src/commands/certs/rm.ts similarity index 100% rename from src/commands/certs/rm.ts rename to packages/now-cli/src/commands/certs/rm.ts diff --git a/src/commands/deploy/args.js b/packages/now-cli/src/commands/deploy/args.js similarity index 100% rename from src/commands/deploy/args.js rename to packages/now-cli/src/commands/deploy/args.js diff --git a/src/commands/deploy/index.js b/packages/now-cli/src/commands/deploy/index.js similarity index 100% rename from src/commands/deploy/index.js rename to packages/now-cli/src/commands/deploy/index.js diff --git a/src/commands/deploy/latest.js b/packages/now-cli/src/commands/deploy/latest.js similarity index 100% rename from src/commands/deploy/latest.js rename to packages/now-cli/src/commands/deploy/latest.js diff --git a/src/commands/deploy/legacy.ts b/packages/now-cli/src/commands/deploy/legacy.ts similarity index 100% rename from src/commands/deploy/legacy.ts rename to packages/now-cli/src/commands/deploy/legacy.ts diff --git a/src/commands/dev/dev.ts b/packages/now-cli/src/commands/dev/dev.ts similarity index 100% rename from src/commands/dev/dev.ts rename to packages/now-cli/src/commands/dev/dev.ts diff --git a/src/commands/dev/index.ts b/packages/now-cli/src/commands/dev/index.ts similarity index 100% rename from src/commands/dev/index.ts rename to packages/now-cli/src/commands/dev/index.ts diff --git a/src/commands/dns/add.ts b/packages/now-cli/src/commands/dns/add.ts similarity index 100% rename from src/commands/dns/add.ts rename to packages/now-cli/src/commands/dns/add.ts diff --git a/src/commands/dns/import.ts b/packages/now-cli/src/commands/dns/import.ts similarity index 100% rename from src/commands/dns/import.ts rename to packages/now-cli/src/commands/dns/import.ts diff --git a/src/commands/dns/index.ts b/packages/now-cli/src/commands/dns/index.ts similarity index 100% rename from src/commands/dns/index.ts rename to packages/now-cli/src/commands/dns/index.ts diff --git a/src/commands/dns/ls.ts b/packages/now-cli/src/commands/dns/ls.ts similarity index 100% rename from src/commands/dns/ls.ts rename to packages/now-cli/src/commands/dns/ls.ts diff --git a/src/commands/dns/rm.ts b/packages/now-cli/src/commands/dns/rm.ts similarity index 100% rename from src/commands/dns/rm.ts rename to packages/now-cli/src/commands/dns/rm.ts diff --git a/src/commands/domains/add.ts b/packages/now-cli/src/commands/domains/add.ts similarity index 100% rename from src/commands/domains/add.ts rename to packages/now-cli/src/commands/domains/add.ts diff --git a/src/commands/domains/buy.ts b/packages/now-cli/src/commands/domains/buy.ts similarity index 100% rename from src/commands/domains/buy.ts rename to packages/now-cli/src/commands/domains/buy.ts diff --git a/src/commands/domains/index.ts b/packages/now-cli/src/commands/domains/index.ts similarity index 100% rename from src/commands/domains/index.ts rename to packages/now-cli/src/commands/domains/index.ts diff --git a/src/commands/domains/inspect.ts b/packages/now-cli/src/commands/domains/inspect.ts similarity index 100% rename from src/commands/domains/inspect.ts rename to packages/now-cli/src/commands/domains/inspect.ts diff --git a/src/commands/domains/ls.ts b/packages/now-cli/src/commands/domains/ls.ts similarity index 100% rename from src/commands/domains/ls.ts rename to packages/now-cli/src/commands/domains/ls.ts diff --git a/src/commands/domains/move.ts b/packages/now-cli/src/commands/domains/move.ts similarity index 100% rename from src/commands/domains/move.ts rename to packages/now-cli/src/commands/domains/move.ts diff --git a/src/commands/domains/rm.ts b/packages/now-cli/src/commands/domains/rm.ts similarity index 100% rename from src/commands/domains/rm.ts rename to packages/now-cli/src/commands/domains/rm.ts diff --git a/src/commands/domains/transfer-in.ts b/packages/now-cli/src/commands/domains/transfer-in.ts similarity index 100% rename from src/commands/domains/transfer-in.ts rename to packages/now-cli/src/commands/domains/transfer-in.ts diff --git a/src/commands/domains/verify.ts b/packages/now-cli/src/commands/domains/verify.ts similarity index 100% rename from src/commands/domains/verify.ts rename to packages/now-cli/src/commands/domains/verify.ts diff --git a/src/commands/index.js b/packages/now-cli/src/commands/index.js similarity index 100% rename from src/commands/index.js rename to packages/now-cli/src/commands/index.js diff --git a/src/commands/init/index.ts b/packages/now-cli/src/commands/init/index.ts similarity index 100% rename from src/commands/init/index.ts rename to packages/now-cli/src/commands/init/index.ts diff --git a/src/commands/init/init.ts b/packages/now-cli/src/commands/init/init.ts similarity index 100% rename from src/commands/init/init.ts rename to packages/now-cli/src/commands/init/init.ts diff --git a/src/commands/inspect.js b/packages/now-cli/src/commands/inspect.js similarity index 100% rename from src/commands/inspect.js rename to packages/now-cli/src/commands/inspect.js diff --git a/src/commands/list.js b/packages/now-cli/src/commands/list.js similarity index 100% rename from src/commands/list.js rename to packages/now-cli/src/commands/list.js diff --git a/src/commands/login.js b/packages/now-cli/src/commands/login.js similarity index 100% rename from src/commands/login.js rename to packages/now-cli/src/commands/login.js diff --git a/src/commands/logout.js b/packages/now-cli/src/commands/logout.js similarity index 100% rename from src/commands/logout.js rename to packages/now-cli/src/commands/logout.js diff --git a/src/commands/logs.js b/packages/now-cli/src/commands/logs.js similarity index 100% rename from src/commands/logs.js rename to packages/now-cli/src/commands/logs.js diff --git a/src/commands/projects.js b/packages/now-cli/src/commands/projects.js similarity index 100% rename from src/commands/projects.js rename to packages/now-cli/src/commands/projects.js diff --git a/src/commands/remove.js b/packages/now-cli/src/commands/remove.js similarity index 100% rename from src/commands/remove.js rename to packages/now-cli/src/commands/remove.js diff --git a/src/commands/scale.js b/packages/now-cli/src/commands/scale.js similarity index 100% rename from src/commands/scale.js rename to packages/now-cli/src/commands/scale.js diff --git a/src/commands/secrets.js b/packages/now-cli/src/commands/secrets.js similarity index 100% rename from src/commands/secrets.js rename to packages/now-cli/src/commands/secrets.js diff --git a/src/commands/teams.js b/packages/now-cli/src/commands/teams.js similarity index 100% rename from src/commands/teams.js rename to packages/now-cli/src/commands/teams.js diff --git a/src/commands/teams/add.js b/packages/now-cli/src/commands/teams/add.js similarity index 100% rename from src/commands/teams/add.js rename to packages/now-cli/src/commands/teams/add.js diff --git a/src/commands/teams/invite.js b/packages/now-cli/src/commands/teams/invite.js similarity index 100% rename from src/commands/teams/invite.js rename to packages/now-cli/src/commands/teams/invite.js diff --git a/src/commands/teams/list.js b/packages/now-cli/src/commands/teams/list.js similarity index 100% rename from src/commands/teams/list.js rename to packages/now-cli/src/commands/teams/list.js diff --git a/src/commands/teams/switch.js b/packages/now-cli/src/commands/teams/switch.js similarity index 100% rename from src/commands/teams/switch.js rename to packages/now-cli/src/commands/teams/switch.js diff --git a/src/commands/update.ts b/packages/now-cli/src/commands/update.ts similarity index 100% rename from src/commands/update.ts rename to packages/now-cli/src/commands/update.ts diff --git a/src/commands/upgrade.js b/packages/now-cli/src/commands/upgrade.js similarity index 100% rename from src/commands/upgrade.js rename to packages/now-cli/src/commands/upgrade.js diff --git a/src/commands/whoami.js b/packages/now-cli/src/commands/whoami.js similarity index 100% rename from src/commands/whoami.js rename to packages/now-cli/src/commands/whoami.js diff --git a/src/index.js b/packages/now-cli/src/index.js similarity index 100% rename from src/index.js rename to packages/now-cli/src/index.js diff --git a/src/types.ts b/packages/now-cli/src/types.ts similarity index 100% rename from src/types.ts rename to packages/now-cli/src/types.ts diff --git a/src/util/agent.ts b/packages/now-cli/src/util/agent.ts similarity index 100% rename from src/util/agent.ts rename to packages/now-cli/src/util/agent.ts diff --git a/src/util/alias/assign-alias.ts b/packages/now-cli/src/util/alias/assign-alias.ts similarity index 100% rename from src/util/alias/assign-alias.ts rename to packages/now-cli/src/util/alias/assign-alias.ts diff --git a/src/util/alias/create-alias.ts b/packages/now-cli/src/util/alias/create-alias.ts similarity index 100% rename from src/util/alias/create-alias.ts rename to packages/now-cli/src/util/alias/create-alias.ts diff --git a/src/util/alias/deployment-is-aliased.ts b/packages/now-cli/src/util/alias/deployment-is-aliased.ts similarity index 100% rename from src/util/alias/deployment-is-aliased.ts rename to packages/now-cli/src/util/alias/deployment-is-aliased.ts diff --git a/src/util/alias/deployment-should-copy-scale.ts b/packages/now-cli/src/util/alias/deployment-should-copy-scale.ts similarity index 100% rename from src/util/alias/deployment-should-copy-scale.ts rename to packages/now-cli/src/util/alias/deployment-should-copy-scale.ts diff --git a/src/util/alias/deployment-should-downscale.ts b/packages/now-cli/src/util/alias/deployment-should-downscale.ts similarity index 100% rename from src/util/alias/deployment-should-downscale.ts rename to packages/now-cli/src/util/alias/deployment-should-downscale.ts diff --git a/src/util/alias/find-alias-by-alias-or-id.ts b/packages/now-cli/src/util/alias/find-alias-by-alias-or-id.ts similarity index 100% rename from src/util/alias/find-alias-by-alias-or-id.ts rename to packages/now-cli/src/util/alias/find-alias-by-alias-or-id.ts diff --git a/src/util/alias/get-aliases.ts b/packages/now-cli/src/util/alias/get-aliases.ts similarity index 100% rename from src/util/alias/get-aliases.ts rename to packages/now-cli/src/util/alias/get-aliases.ts diff --git a/src/util/alias/get-deployment-downscale-presets.ts b/packages/now-cli/src/util/alias/get-deployment-downscale-presets.ts similarity index 100% rename from src/util/alias/get-deployment-downscale-presets.ts rename to packages/now-cli/src/util/alias/get-deployment-downscale-presets.ts diff --git a/src/util/alias/get-deployment-for-alias.ts b/packages/now-cli/src/util/alias/get-deployment-for-alias.ts similarity index 100% rename from src/util/alias/get-deployment-for-alias.ts rename to packages/now-cli/src/util/alias/get-deployment-for-alias.ts diff --git a/src/util/alias/get-deployment-from-alias.ts b/packages/now-cli/src/util/alias/get-deployment-from-alias.ts similarity index 100% rename from src/util/alias/get-deployment-from-alias.ts rename to packages/now-cli/src/util/alias/get-deployment-from-alias.ts diff --git a/src/util/alias/get-domain-aliases.ts b/packages/now-cli/src/util/alias/get-domain-aliases.ts similarity index 100% rename from src/util/alias/get-domain-aliases.ts rename to packages/now-cli/src/util/alias/get-domain-aliases.ts diff --git a/src/util/alias/get-inferred-targets.ts b/packages/now-cli/src/util/alias/get-inferred-targets.ts similarity index 100% rename from src/util/alias/get-inferred-targets.ts rename to packages/now-cli/src/util/alias/get-inferred-targets.ts diff --git a/src/util/alias/get-rules-from-file.ts b/packages/now-cli/src/util/alias/get-rules-from-file.ts similarity index 100% rename from src/util/alias/get-rules-from-file.ts rename to packages/now-cli/src/util/alias/get-rules-from-file.ts diff --git a/src/util/alias/get-targets-for-alias.ts b/packages/now-cli/src/util/alias/get-targets-for-alias.ts similarity index 100% rename from src/util/alias/get-targets-for-alias.ts rename to packages/now-cli/src/util/alias/get-targets-for-alias.ts diff --git a/src/util/alias/remove-alias-by-id.ts b/packages/now-cli/src/util/alias/remove-alias-by-id.ts similarity index 100% rename from src/util/alias/remove-alias-by-id.ts rename to packages/now-cli/src/util/alias/remove-alias-by-id.ts diff --git a/src/util/alias/upsert-path-alias.ts b/packages/now-cli/src/util/alias/upsert-path-alias.ts similarity index 100% rename from src/util/alias/upsert-path-alias.ts rename to packages/now-cli/src/util/alias/upsert-path-alias.ts diff --git a/src/util/alias/validate-path-alias-rules.ts b/packages/now-cli/src/util/alias/validate-path-alias-rules.ts similarity index 100% rename from src/util/alias/validate-path-alias-rules.ts rename to packages/now-cli/src/util/alias/validate-path-alias-rules.ts diff --git a/src/util/arg-common.ts b/packages/now-cli/src/util/arg-common.ts similarity index 100% rename from src/util/arg-common.ts rename to packages/now-cli/src/util/arg-common.ts diff --git a/src/util/billing/card-brands.json b/packages/now-cli/src/util/billing/card-brands.json similarity index 100% rename from src/util/billing/card-brands.json rename to packages/now-cli/src/util/billing/card-brands.json diff --git a/src/util/billing/get-credit-cards.js b/packages/now-cli/src/util/billing/get-credit-cards.js similarity index 100% rename from src/util/billing/get-credit-cards.js rename to packages/now-cli/src/util/billing/get-credit-cards.js diff --git a/src/util/build-state.js b/packages/now-cli/src/util/build-state.js similarity index 100% rename from src/util/build-state.js rename to packages/now-cli/src/util/build-state.js diff --git a/src/util/certs/create-cert-for-alias.ts b/packages/now-cli/src/util/certs/create-cert-for-alias.ts similarity index 100% rename from src/util/certs/create-cert-for-alias.ts rename to packages/now-cli/src/util/certs/create-cert-for-alias.ts diff --git a/src/util/certs/create-cert-for-cns.ts b/packages/now-cli/src/util/certs/create-cert-for-cns.ts similarity index 100% rename from src/util/certs/create-cert-for-cns.ts rename to packages/now-cli/src/util/certs/create-cert-for-cns.ts diff --git a/src/util/certs/create-cert-from-file.ts b/packages/now-cli/src/util/certs/create-cert-from-file.ts similarity index 100% rename from src/util/certs/create-cert-from-file.ts rename to packages/now-cli/src/util/certs/create-cert-from-file.ts diff --git a/src/util/certs/delete-cert-by-id.ts b/packages/now-cli/src/util/certs/delete-cert-by-id.ts similarity index 100% rename from src/util/certs/delete-cert-by-id.ts rename to packages/now-cli/src/util/certs/delete-cert-by-id.ts diff --git a/src/util/certs/finish-cert-order.ts b/packages/now-cli/src/util/certs/finish-cert-order.ts similarity index 100% rename from src/util/certs/finish-cert-order.ts rename to packages/now-cli/src/util/certs/finish-cert-order.ts diff --git a/src/util/certs/get-cert-by-id.ts b/packages/now-cli/src/util/certs/get-cert-by-id.ts similarity index 100% rename from src/util/certs/get-cert-by-id.ts rename to packages/now-cli/src/util/certs/get-cert-by-id.ts diff --git a/src/util/certs/get-certs-for-domain.ts b/packages/now-cli/src/util/certs/get-certs-for-domain.ts similarity index 100% rename from src/util/certs/get-certs-for-domain.ts rename to packages/now-cli/src/util/certs/get-certs-for-domain.ts diff --git a/src/util/certs/get-certs.ts b/packages/now-cli/src/util/certs/get-certs.ts similarity index 100% rename from src/util/certs/get-certs.ts rename to packages/now-cli/src/util/certs/get-certs.ts diff --git a/src/util/certs/get-cns-from-args.ts b/packages/now-cli/src/util/certs/get-cns-from-args.ts similarity index 100% rename from src/util/certs/get-cns-from-args.ts rename to packages/now-cli/src/util/certs/get-cns-from-args.ts diff --git a/src/util/certs/get-wildcard-cns-for-domain.ts b/packages/now-cli/src/util/certs/get-wildcard-cns-for-domain.ts similarity index 100% rename from src/util/certs/get-wildcard-cns-for-domain.ts rename to packages/now-cli/src/util/certs/get-wildcard-cns-for-domain.ts diff --git a/src/util/certs/handle-cert-error.ts b/packages/now-cli/src/util/certs/handle-cert-error.ts similarity index 100% rename from src/util/certs/handle-cert-error.ts rename to packages/now-cli/src/util/certs/handle-cert-error.ts diff --git a/src/util/certs/issue-cert.ts b/packages/now-cli/src/util/certs/issue-cert.ts similarity index 100% rename from src/util/certs/issue-cert.ts rename to packages/now-cli/src/util/certs/issue-cert.ts diff --git a/src/util/certs/map-cert-error.ts b/packages/now-cli/src/util/certs/map-cert-error.ts similarity index 100% rename from src/util/certs/map-cert-error.ts rename to packages/now-cli/src/util/certs/map-cert-error.ts diff --git a/src/util/certs/start-cert-order.ts b/packages/now-cli/src/util/certs/start-cert-order.ts similarity index 100% rename from src/util/certs/start-cert-order.ts rename to packages/now-cli/src/util/certs/start-cert-order.ts diff --git a/src/util/check-path.js b/packages/now-cli/src/util/check-path.js similarity index 100% rename from src/util/check-path.js rename to packages/now-cli/src/util/check-path.js diff --git a/src/util/client.ts b/packages/now-cli/src/util/client.ts similarity index 100% rename from src/util/client.ts rename to packages/now-cli/src/util/client.ts diff --git a/src/util/combine-async-generators.ts b/packages/now-cli/src/util/combine-async-generators.ts similarity index 100% rename from src/util/combine-async-generators.ts rename to packages/now-cli/src/util/combine-async-generators.ts diff --git a/src/util/config/files.ts b/packages/now-cli/src/util/config/files.ts similarity index 100% rename from src/util/config/files.ts rename to packages/now-cli/src/util/config/files.ts diff --git a/src/util/config/get-default.js b/packages/now-cli/src/util/config/get-default.js similarity index 100% rename from src/util/config/get-default.js rename to packages/now-cli/src/util/config/get-default.js diff --git a/src/util/config/global-path.ts b/packages/now-cli/src/util/config/global-path.ts similarity index 100% rename from src/util/config/global-path.ts rename to packages/now-cli/src/util/config/global-path.ts diff --git a/src/util/config/local-path.ts b/packages/now-cli/src/util/config/local-path.ts similarity index 100% rename from src/util/config/local-path.ts rename to packages/now-cli/src/util/config/local-path.ts diff --git a/src/util/config/read-config.ts b/packages/now-cli/src/util/config/read-config.ts similarity index 100% rename from src/util/config/read-config.ts rename to packages/now-cli/src/util/config/read-config.ts diff --git a/src/util/constants.ts b/packages/now-cli/src/util/constants.ts similarity index 100% rename from src/util/constants.ts rename to packages/now-cli/src/util/constants.ts diff --git a/src/util/create-polling-fn.ts b/packages/now-cli/src/util/create-polling-fn.ts similarity index 100% rename from src/util/create-polling-fn.ts rename to packages/now-cli/src/util/create-polling-fn.ts diff --git a/src/util/credit-cards.js b/packages/now-cli/src/util/credit-cards.js similarity index 100% rename from src/util/credit-cards.js rename to packages/now-cli/src/util/credit-cards.js diff --git a/src/util/deploy/create-deploy.js b/packages/now-cli/src/util/deploy/create-deploy.js similarity index 100% rename from src/util/deploy/create-deploy.js rename to packages/now-cli/src/util/deploy/create-deploy.js diff --git a/src/util/deploy/generate-cert-for-deploy.ts b/packages/now-cli/src/util/deploy/generate-cert-for-deploy.ts similarity index 100% rename from src/util/deploy/generate-cert-for-deploy.ts rename to packages/now-cli/src/util/deploy/generate-cert-for-deploy.ts diff --git a/src/util/deploy/get-app-last-deployment.ts b/packages/now-cli/src/util/deploy/get-app-last-deployment.ts similarity index 100% rename from src/util/deploy/get-app-last-deployment.ts rename to packages/now-cli/src/util/deploy/get-app-last-deployment.ts diff --git a/src/util/deploy/get-app-name.ts b/packages/now-cli/src/util/deploy/get-app-name.ts similarity index 100% rename from src/util/deploy/get-app-name.ts rename to packages/now-cli/src/util/deploy/get-app-name.ts diff --git a/src/util/deploy/get-deployment-by-id-or-host.ts b/packages/now-cli/src/util/deploy/get-deployment-by-id-or-host.ts similarity index 100% rename from src/util/deploy/get-deployment-by-id-or-host.ts rename to packages/now-cli/src/util/deploy/get-deployment-by-id-or-host.ts diff --git a/src/util/deploy/get-deployment-by-id-or-throw.ts b/packages/now-cli/src/util/deploy/get-deployment-by-id-or-throw.ts similarity index 100% rename from src/util/deploy/get-deployment-by-id-or-throw.ts rename to packages/now-cli/src/util/deploy/get-deployment-by-id-or-throw.ts diff --git a/src/util/deploy/get-deployment-instances.ts b/packages/now-cli/src/util/deploy/get-deployment-instances.ts similarity index 100% rename from src/util/deploy/get-deployment-instances.ts rename to packages/now-cli/src/util/deploy/get-deployment-instances.ts diff --git a/src/util/deploy/get-deployments-by-appname.ts b/packages/now-cli/src/util/deploy/get-deployments-by-appname.ts similarity index 100% rename from src/util/deploy/get-deployments-by-appname.ts rename to packages/now-cli/src/util/deploy/get-deployments-by-appname.ts diff --git a/src/util/deploy/get-deployments-by-project-id.ts b/packages/now-cli/src/util/deploy/get-deployments-by-project-id.ts similarity index 100% rename from src/util/deploy/get-deployments-by-project-id.ts rename to packages/now-cli/src/util/deploy/get-deployments-by-project-id.ts diff --git a/src/util/deploy/get-events-stream.js b/packages/now-cli/src/util/deploy/get-events-stream.js similarity index 100% rename from src/util/deploy/get-events-stream.js rename to packages/now-cli/src/util/deploy/get-events-stream.js diff --git a/src/util/deploy/get-instance-index.js b/packages/now-cli/src/util/deploy/get-instance-index.js similarity index 100% rename from src/util/deploy/get-instance-index.js rename to packages/now-cli/src/util/deploy/get-instance-index.js diff --git a/src/util/deploy/get-state-change-from-polling.ts b/packages/now-cli/src/util/deploy/get-state-change-from-polling.ts similarity index 100% rename from src/util/deploy/get-state-change-from-polling.ts rename to packages/now-cli/src/util/deploy/get-state-change-from-polling.ts diff --git a/src/util/dev/builder-cache.ts b/packages/now-cli/src/util/dev/builder-cache.ts similarity index 100% rename from src/util/dev/builder-cache.ts rename to packages/now-cli/src/util/dev/builder-cache.ts diff --git a/src/util/dev/builder-worker.js b/packages/now-cli/src/util/dev/builder-worker.js similarity index 100% rename from src/util/dev/builder-worker.js rename to packages/now-cli/src/util/dev/builder-worker.js diff --git a/src/util/dev/builder.ts b/packages/now-cli/src/util/dev/builder.ts similarity index 100% rename from src/util/dev/builder.ts rename to packages/now-cli/src/util/dev/builder.ts diff --git a/src/util/dev/errors.ts b/packages/now-cli/src/util/dev/errors.ts similarity index 100% rename from src/util/dev/errors.ts rename to packages/now-cli/src/util/dev/errors.ts diff --git a/src/util/dev/is-url.ts b/packages/now-cli/src/util/dev/is-url.ts similarity index 100% rename from src/util/dev/is-url.ts rename to packages/now-cli/src/util/dev/is-url.ts diff --git a/src/util/dev/mime-type.ts b/packages/now-cli/src/util/dev/mime-type.ts similarity index 100% rename from src/util/dev/mime-type.ts rename to packages/now-cli/src/util/dev/mime-type.ts diff --git a/src/util/dev/parse-listen.ts b/packages/now-cli/src/util/dev/parse-listen.ts similarity index 100% rename from src/util/dev/parse-listen.ts rename to packages/now-cli/src/util/dev/parse-listen.ts diff --git a/src/util/dev/router.ts b/packages/now-cli/src/util/dev/router.ts similarity index 100% rename from src/util/dev/router.ts rename to packages/now-cli/src/util/dev/router.ts diff --git a/src/util/dev/server.ts b/packages/now-cli/src/util/dev/server.ts similarity index 100% rename from src/util/dev/server.ts rename to packages/now-cli/src/util/dev/server.ts diff --git a/src/util/dev/static-builder.ts b/packages/now-cli/src/util/dev/static-builder.ts similarity index 100% rename from src/util/dev/static-builder.ts rename to packages/now-cli/src/util/dev/static-builder.ts diff --git a/src/util/dev/templates/error.jst b/packages/now-cli/src/util/dev/templates/error.jst similarity index 100% rename from src/util/dev/templates/error.jst rename to packages/now-cli/src/util/dev/templates/error.jst diff --git a/src/util/dev/templates/error.tsdef b/packages/now-cli/src/util/dev/templates/error.tsdef similarity index 100% rename from src/util/dev/templates/error.tsdef rename to packages/now-cli/src/util/dev/templates/error.tsdef diff --git a/src/util/dev/templates/error_404.jst b/packages/now-cli/src/util/dev/templates/error_404.jst similarity index 100% rename from src/util/dev/templates/error_404.jst rename to packages/now-cli/src/util/dev/templates/error_404.jst diff --git a/src/util/dev/templates/error_404.tsdef b/packages/now-cli/src/util/dev/templates/error_404.tsdef similarity index 100% rename from src/util/dev/templates/error_404.tsdef rename to packages/now-cli/src/util/dev/templates/error_404.tsdef diff --git a/src/util/dev/templates/error_502.jst b/packages/now-cli/src/util/dev/templates/error_502.jst similarity index 100% rename from src/util/dev/templates/error_502.jst rename to packages/now-cli/src/util/dev/templates/error_502.jst diff --git a/src/util/dev/templates/error_502.tsdef b/packages/now-cli/src/util/dev/templates/error_502.tsdef similarity index 100% rename from src/util/dev/templates/error_502.tsdef rename to packages/now-cli/src/util/dev/templates/error_502.tsdef diff --git a/src/util/dev/templates/error_base.jst b/packages/now-cli/src/util/dev/templates/error_base.jst similarity index 100% rename from src/util/dev/templates/error_base.jst rename to packages/now-cli/src/util/dev/templates/error_base.jst diff --git a/src/util/dev/templates/error_base.tsdef b/packages/now-cli/src/util/dev/templates/error_base.tsdef similarity index 100% rename from src/util/dev/templates/error_base.tsdef rename to packages/now-cli/src/util/dev/templates/error_base.tsdef diff --git a/src/util/dev/templates/redirect.jst b/packages/now-cli/src/util/dev/templates/redirect.jst similarity index 100% rename from src/util/dev/templates/redirect.jst rename to packages/now-cli/src/util/dev/templates/redirect.jst diff --git a/src/util/dev/templates/redirect.tsdef b/packages/now-cli/src/util/dev/templates/redirect.tsdef similarity index 100% rename from src/util/dev/templates/redirect.tsdef rename to packages/now-cli/src/util/dev/templates/redirect.tsdef diff --git a/src/util/dev/types.ts b/packages/now-cli/src/util/dev/types.ts similarity index 100% rename from src/util/dev/types.ts rename to packages/now-cli/src/util/dev/types.ts diff --git a/src/util/dev/yarn-installer.ts b/packages/now-cli/src/util/dev/yarn-installer.ts similarity index 100% rename from src/util/dev/yarn-installer.ts rename to packages/now-cli/src/util/dev/yarn-installer.ts diff --git a/src/util/dns/add-dns-record.ts b/packages/now-cli/src/util/dns/add-dns-record.ts similarity index 100% rename from src/util/dns/add-dns-record.ts rename to packages/now-cli/src/util/dns/add-dns-record.ts diff --git a/src/util/dns/delete-dns-record-by-id.ts b/packages/now-cli/src/util/dns/delete-dns-record-by-id.ts similarity index 100% rename from src/util/dns/delete-dns-record-by-id.ts rename to packages/now-cli/src/util/dns/delete-dns-record-by-id.ts diff --git a/src/util/dns/get-dns-data.ts b/packages/now-cli/src/util/dns/get-dns-data.ts similarity index 100% rename from src/util/dns/get-dns-data.ts rename to packages/now-cli/src/util/dns/get-dns-data.ts diff --git a/src/util/dns/get-dns-record-by-id.ts b/packages/now-cli/src/util/dns/get-dns-record-by-id.ts similarity index 100% rename from src/util/dns/get-dns-record-by-id.ts rename to packages/now-cli/src/util/dns/get-dns-record-by-id.ts diff --git a/src/util/dns/get-dns-records.ts b/packages/now-cli/src/util/dns/get-dns-records.ts similarity index 100% rename from src/util/dns/get-dns-records.ts rename to packages/now-cli/src/util/dns/get-dns-records.ts diff --git a/src/util/dns/get-domain-dns-records.ts b/packages/now-cli/src/util/dns/get-domain-dns-records.ts similarity index 100% rename from src/util/dns/get-domain-dns-records.ts rename to packages/now-cli/src/util/dns/get-domain-dns-records.ts diff --git a/src/util/dns/import-zonefile.ts b/packages/now-cli/src/util/dns/import-zonefile.ts similarity index 100% rename from src/util/dns/import-zonefile.ts rename to packages/now-cli/src/util/dns/import-zonefile.ts diff --git a/src/util/dns/parse-add-dns-record-args.ts b/packages/now-cli/src/util/dns/parse-add-dns-record-args.ts similarity index 100% rename from src/util/dns/parse-add-dns-record-args.ts rename to packages/now-cli/src/util/dns/parse-add-dns-record-args.ts diff --git a/src/util/domains/add-domain.ts b/packages/now-cli/src/util/domains/add-domain.ts similarity index 100% rename from src/util/domains/add-domain.ts rename to packages/now-cli/src/util/domains/add-domain.ts diff --git a/src/util/domains/check-transfer.ts b/packages/now-cli/src/util/domains/check-transfer.ts similarity index 100% rename from src/util/domains/check-transfer.ts rename to packages/now-cli/src/util/domains/check-transfer.ts diff --git a/src/util/domains/get-auth-code.ts b/packages/now-cli/src/util/domains/get-auth-code.ts similarity index 100% rename from src/util/domains/get-auth-code.ts rename to packages/now-cli/src/util/domains/get-auth-code.ts diff --git a/src/util/domains/get-domain-by-name.ts b/packages/now-cli/src/util/domains/get-domain-by-name.ts similarity index 100% rename from src/util/domains/get-domain-by-name.ts rename to packages/now-cli/src/util/domains/get-domain-by-name.ts diff --git a/src/util/domains/get-domain-price.ts b/packages/now-cli/src/util/domains/get-domain-price.ts similarity index 100% rename from src/util/domains/get-domain-price.ts rename to packages/now-cli/src/util/domains/get-domain-price.ts diff --git a/src/util/domains/get-domain-status.ts b/packages/now-cli/src/util/domains/get-domain-status.ts similarity index 100% rename from src/util/domains/get-domain-status.ts rename to packages/now-cli/src/util/domains/get-domain-status.ts diff --git a/src/util/domains/get-domains.ts b/packages/now-cli/src/util/domains/get-domains.ts similarity index 100% rename from src/util/domains/get-domains.ts rename to packages/now-cli/src/util/domains/get-domains.ts diff --git a/src/util/domains/is-domain-external.ts b/packages/now-cli/src/util/domains/is-domain-external.ts similarity index 100% rename from src/util/domains/is-domain-external.ts rename to packages/now-cli/src/util/domains/is-domain-external.ts diff --git a/src/util/domains/maybe-get-domain-by-name.ts b/packages/now-cli/src/util/domains/maybe-get-domain-by-name.ts similarity index 100% rename from src/util/domains/maybe-get-domain-by-name.ts rename to packages/now-cli/src/util/domains/maybe-get-domain-by-name.ts diff --git a/src/util/domains/move-out-domain.ts b/packages/now-cli/src/util/domains/move-out-domain.ts similarity index 100% rename from src/util/domains/move-out-domain.ts rename to packages/now-cli/src/util/domains/move-out-domain.ts diff --git a/src/util/domains/purchase-domain-if-available.ts b/packages/now-cli/src/util/domains/purchase-domain-if-available.ts similarity index 100% rename from src/util/domains/purchase-domain-if-available.ts rename to packages/now-cli/src/util/domains/purchase-domain-if-available.ts diff --git a/src/util/domains/purchase-domain.ts b/packages/now-cli/src/util/domains/purchase-domain.ts similarity index 100% rename from src/util/domains/purchase-domain.ts rename to packages/now-cli/src/util/domains/purchase-domain.ts diff --git a/src/util/domains/remove-domain-by-name.ts b/packages/now-cli/src/util/domains/remove-domain-by-name.ts similarity index 100% rename from src/util/domains/remove-domain-by-name.ts rename to packages/now-cli/src/util/domains/remove-domain-by-name.ts diff --git a/src/util/domains/set-custom-suffix.ts b/packages/now-cli/src/util/domains/set-custom-suffix.ts similarity index 100% rename from src/util/domains/set-custom-suffix.ts rename to packages/now-cli/src/util/domains/set-custom-suffix.ts diff --git a/src/util/domains/setup-domain.ts b/packages/now-cli/src/util/domains/setup-domain.ts similarity index 100% rename from src/util/domains/setup-domain.ts rename to packages/now-cli/src/util/domains/setup-domain.ts diff --git a/src/util/domains/transfer-in-domain.ts b/packages/now-cli/src/util/domains/transfer-in-domain.ts similarity index 100% rename from src/util/domains/transfer-in-domain.ts rename to packages/now-cli/src/util/domains/transfer-in-domain.ts diff --git a/src/util/domains/verify-domain.ts b/packages/now-cli/src/util/domains/verify-domain.ts similarity index 100% rename from src/util/domains/verify-domain.ts rename to packages/now-cli/src/util/domains/verify-domain.ts diff --git a/src/util/error.js b/packages/now-cli/src/util/error.js similarity index 100% rename from src/util/error.js rename to packages/now-cli/src/util/error.js diff --git a/src/util/errors-ts.ts b/packages/now-cli/src/util/errors-ts.ts similarity index 100% rename from src/util/errors-ts.ts rename to packages/now-cli/src/util/errors-ts.ts diff --git a/src/util/errors.ts b/packages/now-cli/src/util/errors.ts similarity index 100% rename from src/util/errors.ts rename to packages/now-cli/src/util/errors.ts diff --git a/src/util/event-listener-to-generator.ts b/packages/now-cli/src/util/event-listener-to-generator.ts similarity index 100% rename from src/util/event-listener-to-generator.ts rename to packages/now-cli/src/util/event-listener-to-generator.ts diff --git a/src/util/events.js b/packages/now-cli/src/util/events.js similarity index 100% rename from src/util/events.js rename to packages/now-cli/src/util/events.js diff --git a/src/util/exit.js b/packages/now-cli/src/util/exit.js similarity index 100% rename from src/util/exit.js rename to packages/now-cli/src/util/exit.js diff --git a/src/util/fatal-error.js b/packages/now-cli/src/util/fatal-error.js similarity index 100% rename from src/util/fatal-error.js rename to packages/now-cli/src/util/fatal-error.js diff --git a/src/util/format-date.ts b/packages/now-cli/src/util/format-date.ts similarity index 100% rename from src/util/format-date.ts rename to packages/now-cli/src/util/format-date.ts diff --git a/src/util/format-dns-table.ts b/packages/now-cli/src/util/format-dns-table.ts similarity index 100% rename from src/util/format-dns-table.ts rename to packages/now-cli/src/util/format-dns-table.ts diff --git a/src/util/format-ns-table.ts b/packages/now-cli/src/util/format-ns-table.ts similarity index 100% rename from src/util/format-ns-table.ts rename to packages/now-cli/src/util/format-ns-table.ts diff --git a/src/util/format-table.ts b/packages/now-cli/src/util/format-table.ts similarity index 100% rename from src/util/format-table.ts rename to packages/now-cli/src/util/format-table.ts diff --git a/src/util/get-args.ts b/packages/now-cli/src/util/get-args.ts similarity index 100% rename from src/util/get-args.ts rename to packages/now-cli/src/util/get-args.ts diff --git a/src/util/get-config.ts b/packages/now-cli/src/util/get-config.ts similarity index 100% rename from src/util/get-config.ts rename to packages/now-cli/src/util/get-config.ts diff --git a/src/util/get-dist-tag.ts b/packages/now-cli/src/util/get-dist-tag.ts similarity index 100% rename from src/util/get-dist-tag.ts rename to packages/now-cli/src/util/get-dist-tag.ts diff --git a/src/util/get-files.ts b/packages/now-cli/src/util/get-files.ts similarity index 100% rename from src/util/get-files.ts rename to packages/now-cli/src/util/get-files.ts diff --git a/src/util/get-project-name.js b/packages/now-cli/src/util/get-project-name.js similarity index 100% rename from src/util/get-project-name.js rename to packages/now-cli/src/util/get-project-name.js diff --git a/src/util/get-scope.ts b/packages/now-cli/src/util/get-scope.ts similarity index 100% rename from src/util/get-scope.ts rename to packages/now-cli/src/util/get-scope.ts diff --git a/src/util/get-subcommand.ts b/packages/now-cli/src/util/get-subcommand.ts similarity index 100% rename from src/util/get-subcommand.ts rename to packages/now-cli/src/util/get-subcommand.ts diff --git a/src/util/get-team-by-id.ts b/packages/now-cli/src/util/get-team-by-id.ts similarity index 100% rename from src/util/get-team-by-id.ts rename to packages/now-cli/src/util/get-team-by-id.ts diff --git a/src/util/get-teams.ts b/packages/now-cli/src/util/get-teams.ts similarity index 100% rename from src/util/get-teams.ts rename to packages/now-cli/src/util/get-teams.ts diff --git a/src/util/get-update-command.ts b/packages/now-cli/src/util/get-update-command.ts similarity index 100% rename from src/util/get-update-command.ts rename to packages/now-cli/src/util/get-update-command.ts diff --git a/src/util/get-user.ts b/packages/now-cli/src/util/get-user.ts similarity index 100% rename from src/util/get-user.ts rename to packages/now-cli/src/util/get-user.ts diff --git a/src/util/git.js b/packages/now-cli/src/util/git.js similarity index 100% rename from src/util/git.js rename to packages/now-cli/src/util/git.js diff --git a/src/util/handle-error.ts b/packages/now-cli/src/util/handle-error.ts similarity index 100% rename from src/util/handle-error.ts rename to packages/now-cli/src/util/handle-error.ts diff --git a/src/util/hash.js b/packages/now-cli/src/util/hash.js similarity index 100% rename from src/util/hash.js rename to packages/now-cli/src/util/hash.js diff --git a/src/util/humanize-path.ts b/packages/now-cli/src/util/humanize-path.ts similarity index 100% rename from src/util/humanize-path.ts rename to packages/now-cli/src/util/humanize-path.ts diff --git a/src/util/ignored.ts b/packages/now-cli/src/util/ignored.ts similarity index 100% rename from src/util/ignored.ts rename to packages/now-cli/src/util/ignored.ts diff --git a/src/util/indent.js b/packages/now-cli/src/util/indent.js similarity index 100% rename from src/util/indent.js rename to packages/now-cli/src/util/indent.js diff --git a/src/util/index.js b/packages/now-cli/src/util/index.js similarity index 100% rename from src/util/index.js rename to packages/now-cli/src/util/index.js diff --git a/src/util/init/did-you-mean.ts b/packages/now-cli/src/util/init/did-you-mean.ts similarity index 100% rename from src/util/init/did-you-mean.ts rename to packages/now-cli/src/util/init/did-you-mean.ts diff --git a/src/util/input/list.js b/packages/now-cli/src/util/input/list.js similarity index 100% rename from src/util/input/list.js rename to packages/now-cli/src/util/input/list.js diff --git a/src/util/input/patch-inquirer.js b/packages/now-cli/src/util/input/patch-inquirer.js similarity index 100% rename from src/util/input/patch-inquirer.js rename to packages/now-cli/src/util/input/patch-inquirer.js diff --git a/src/util/input/prompt-bool.ts b/packages/now-cli/src/util/input/prompt-bool.ts similarity index 100% rename from src/util/input/prompt-bool.ts rename to packages/now-cli/src/util/input/prompt-bool.ts diff --git a/src/util/input/regexes.js b/packages/now-cli/src/util/input/regexes.js similarity index 100% rename from src/util/input/regexes.js rename to packages/now-cli/src/util/input/regexes.js diff --git a/src/util/input/text.ts b/packages/now-cli/src/util/input/text.ts similarity index 100% rename from src/util/input/text.ts rename to packages/now-cli/src/util/input/text.ts diff --git a/src/util/is-root-domain.ts b/packages/now-cli/src/util/is-root-domain.ts similarity index 100% rename from src/util/is-root-domain.ts rename to packages/now-cli/src/util/is-root-domain.ts diff --git a/src/util/is-zeit-world.js b/packages/now-cli/src/util/is-zeit-world.js similarity index 100% rename from src/util/is-zeit-world.js rename to packages/now-cli/src/util/is-zeit-world.js diff --git a/src/util/login/login.ts b/packages/now-cli/src/util/login/login.ts similarity index 100% rename from src/util/login/login.ts rename to packages/now-cli/src/util/login/login.ts diff --git a/src/util/metrics.ts b/packages/now-cli/src/util/metrics.ts similarity index 100% rename from src/util/metrics.ts rename to packages/now-cli/src/util/metrics.ts diff --git a/src/util/noop.js b/packages/now-cli/src/util/noop.js similarity index 100% rename from src/util/noop.js rename to packages/now-cli/src/util/noop.js diff --git a/src/util/now-error.ts b/packages/now-cli/src/util/now-error.ts similarity index 100% rename from src/util/now-error.ts rename to packages/now-cli/src/util/now-error.ts diff --git a/src/util/once.ts b/packages/now-cli/src/util/once.ts similarity index 100% rename from src/util/once.ts rename to packages/now-cli/src/util/once.ts diff --git a/src/util/output/aborted.js b/packages/now-cli/src/util/output/aborted.js similarity index 100% rename from src/util/output/aborted.js rename to packages/now-cli/src/util/output/aborted.js diff --git a/src/util/output/builds.js b/packages/now-cli/src/util/output/builds.js similarity index 100% rename from src/util/output/builds.js rename to packages/now-cli/src/util/output/builds.js diff --git a/src/util/output/chars.ts b/packages/now-cli/src/util/output/chars.ts similarity index 100% rename from src/util/output/chars.ts rename to packages/now-cli/src/util/output/chars.ts diff --git a/src/util/output/cmd.ts b/packages/now-cli/src/util/output/cmd.ts similarity index 100% rename from src/util/output/cmd.ts rename to packages/now-cli/src/util/output/cmd.ts diff --git a/src/util/output/code.ts b/packages/now-cli/src/util/output/code.ts similarity index 100% rename from src/util/output/code.ts rename to packages/now-cli/src/util/output/code.ts diff --git a/src/util/output/create-output.ts b/packages/now-cli/src/util/output/create-output.ts similarity index 100% rename from src/util/output/create-output.ts rename to packages/now-cli/src/util/output/create-output.ts diff --git a/src/util/output/effect.js b/packages/now-cli/src/util/output/effect.js similarity index 100% rename from src/util/output/effect.js rename to packages/now-cli/src/util/output/effect.js diff --git a/src/util/output/elapsed.ts b/packages/now-cli/src/util/output/elapsed.ts similarity index 100% rename from src/util/output/elapsed.ts rename to packages/now-cli/src/util/output/elapsed.ts diff --git a/src/util/output/erase-lines.ts b/packages/now-cli/src/util/output/erase-lines.ts similarity index 100% rename from src/util/output/erase-lines.ts rename to packages/now-cli/src/util/output/erase-lines.ts diff --git a/src/util/output/error.ts b/packages/now-cli/src/util/output/error.ts similarity index 100% rename from src/util/output/error.ts rename to packages/now-cli/src/util/output/error.ts diff --git a/src/util/output/format-log-cmd.js b/packages/now-cli/src/util/output/format-log-cmd.js similarity index 100% rename from src/util/output/format-log-cmd.js rename to packages/now-cli/src/util/output/format-log-cmd.js diff --git a/src/util/output/format-log-output.js b/packages/now-cli/src/util/output/format-log-output.js similarity index 100% rename from src/util/output/format-log-output.js rename to packages/now-cli/src/util/output/format-log-output.js diff --git a/src/util/output/format-log-text.js b/packages/now-cli/src/util/output/format-log-text.js similarity index 100% rename from src/util/output/format-log-text.js rename to packages/now-cli/src/util/output/format-log-text.js diff --git a/src/util/output/highlight.ts b/packages/now-cli/src/util/output/highlight.ts similarity index 100% rename from src/util/output/highlight.ts rename to packages/now-cli/src/util/output/highlight.ts diff --git a/src/util/output/indent.js b/packages/now-cli/src/util/output/indent.js similarity index 100% rename from src/util/output/indent.js rename to packages/now-cli/src/util/output/indent.js diff --git a/src/util/output/index.ts b/packages/now-cli/src/util/output/index.ts similarity index 100% rename from src/util/output/index.ts rename to packages/now-cli/src/util/output/index.ts diff --git a/src/util/output/info.ts b/packages/now-cli/src/util/output/info.ts similarity index 100% rename from src/util/output/info.ts rename to packages/now-cli/src/util/output/info.ts diff --git a/src/util/output/join-words.ts b/packages/now-cli/src/util/output/join-words.ts similarity index 100% rename from src/util/output/join-words.ts rename to packages/now-cli/src/util/output/join-words.ts diff --git a/src/util/output/link.ts b/packages/now-cli/src/util/output/link.ts similarity index 100% rename from src/util/output/link.ts rename to packages/now-cli/src/util/output/link.ts diff --git a/src/util/output/list-item.ts b/packages/now-cli/src/util/output/list-item.ts similarity index 100% rename from src/util/output/list-item.ts rename to packages/now-cli/src/util/output/list-item.ts diff --git a/src/util/output/logo.ts b/packages/now-cli/src/util/output/logo.ts similarity index 100% rename from src/util/output/logo.ts rename to packages/now-cli/src/util/output/logo.ts diff --git a/src/util/output/note.js b/packages/now-cli/src/util/output/note.js similarity index 100% rename from src/util/output/note.js rename to packages/now-cli/src/util/output/note.js diff --git a/src/util/output/ok.js b/packages/now-cli/src/util/output/ok.js similarity index 100% rename from src/util/output/ok.js rename to packages/now-cli/src/util/output/ok.js diff --git a/src/util/output/param.ts b/packages/now-cli/src/util/output/param.ts similarity index 100% rename from src/util/output/param.ts rename to packages/now-cli/src/util/output/param.ts diff --git a/src/util/output/ready.js b/packages/now-cli/src/util/output/ready.js similarity index 100% rename from src/util/output/ready.js rename to packages/now-cli/src/util/output/ready.js diff --git a/src/util/output/right-pad.js b/packages/now-cli/src/util/output/right-pad.js similarity index 100% rename from src/util/output/right-pad.js rename to packages/now-cli/src/util/output/right-pad.js diff --git a/src/util/output/routes.js b/packages/now-cli/src/util/output/routes.js similarity index 100% rename from src/util/output/routes.js rename to packages/now-cli/src/util/output/routes.js diff --git a/src/util/output/stamp.ts b/packages/now-cli/src/util/output/stamp.ts similarity index 100% rename from src/util/output/stamp.ts rename to packages/now-cli/src/util/output/stamp.ts diff --git a/src/util/output/success.ts b/packages/now-cli/src/util/output/success.ts similarity index 100% rename from src/util/output/success.ts rename to packages/now-cli/src/util/output/success.ts diff --git a/src/util/output/table.js b/packages/now-cli/src/util/output/table.js similarity index 100% rename from src/util/output/table.js rename to packages/now-cli/src/util/output/table.js diff --git a/src/util/output/uid.js b/packages/now-cli/src/util/output/uid.js similarity index 100% rename from src/util/output/uid.js rename to packages/now-cli/src/util/output/uid.js diff --git a/src/util/output/wait.ts b/packages/now-cli/src/util/output/wait.ts similarity index 100% rename from src/util/output/wait.ts rename to packages/now-cli/src/util/output/wait.ts diff --git a/src/util/parse-meta.js b/packages/now-cli/src/util/parse-meta.js similarity index 100% rename from src/util/parse-meta.js rename to packages/now-cli/src/util/parse-meta.js diff --git a/src/util/path-helpers.ts b/packages/now-cli/src/util/path-helpers.ts similarity index 100% rename from src/util/path-helpers.ts rename to packages/now-cli/src/util/path-helpers.ts diff --git a/src/util/pkg.ts b/packages/now-cli/src/util/pkg.ts similarity index 100% rename from src/util/pkg.ts rename to packages/now-cli/src/util/pkg.ts diff --git a/src/util/plans.js b/packages/now-cli/src/util/plans.js similarity index 100% rename from src/util/plans.js rename to packages/now-cli/src/util/plans.js diff --git a/src/util/prefer-v2-deployment.ts b/packages/now-cli/src/util/prefer-v2-deployment.ts similarity index 100% rename from src/util/prefer-v2-deployment.ts rename to packages/now-cli/src/util/prefer-v2-deployment.ts diff --git a/src/util/projects/get-project-by-id-or-name.ts b/packages/now-cli/src/util/projects/get-project-by-id-or-name.ts similarity index 100% rename from src/util/projects/get-project-by-id-or-name.ts rename to packages/now-cli/src/util/projects/get-project-by-id-or-name.ts diff --git a/src/util/projects/remove-project.ts b/packages/now-cli/src/util/projects/remove-project.ts similarity index 100% rename from src/util/projects/remove-project.ts rename to packages/now-cli/src/util/projects/remove-project.ts diff --git a/src/util/prompt-bool.ts b/packages/now-cli/src/util/prompt-bool.ts similarity index 100% rename from src/util/prompt-bool.ts rename to packages/now-cli/src/util/prompt-bool.ts diff --git a/src/util/prompt-options.js b/packages/now-cli/src/util/prompt-options.js similarity index 100% rename from src/util/prompt-options.js rename to packages/now-cli/src/util/prompt-options.js diff --git a/src/util/race-async-generators.ts b/packages/now-cli/src/util/race-async-generators.ts similarity index 100% rename from src/util/race-async-generators.ts rename to packages/now-cli/src/util/race-async-generators.ts diff --git a/src/util/read-json-file.ts b/packages/now-cli/src/util/read-json-file.ts similarity index 100% rename from src/util/read-json-file.ts rename to packages/now-cli/src/util/read-json-file.ts diff --git a/src/util/read-metadata.js b/packages/now-cli/src/util/read-metadata.js similarity index 100% rename from src/util/read-metadata.js rename to packages/now-cli/src/util/read-metadata.js diff --git a/src/util/read-package.ts b/packages/now-cli/src/util/read-package.ts similarity index 100% rename from src/util/read-package.ts rename to packages/now-cli/src/util/read-package.ts diff --git a/src/util/report-error.js b/packages/now-cli/src/util/report-error.js similarity index 100% rename from src/util/report-error.js rename to packages/now-cli/src/util/report-error.js diff --git a/src/util/response-error.ts b/packages/now-cli/src/util/response-error.ts similarity index 100% rename from src/util/response-error.ts rename to packages/now-cli/src/util/response-error.ts diff --git a/src/util/returnify-async-generator.ts b/packages/now-cli/src/util/returnify-async-generator.ts similarity index 100% rename from src/util/returnify-async-generator.ts rename to packages/now-cli/src/util/returnify-async-generator.ts diff --git a/src/util/scale/constants.js b/packages/now-cli/src/util/scale/constants.js similarity index 100% rename from src/util/scale/constants.js rename to packages/now-cli/src/util/scale/constants.js diff --git a/src/util/scale/get-dcs-from-args.js b/packages/now-cli/src/util/scale/get-dcs-from-args.js similarity index 100% rename from src/util/scale/get-dcs-from-args.js rename to packages/now-cli/src/util/scale/get-dcs-from-args.js diff --git a/src/util/scale/get-max-from-args.ts b/packages/now-cli/src/util/scale/get-max-from-args.ts similarity index 100% rename from src/util/scale/get-max-from-args.ts rename to packages/now-cli/src/util/scale/get-max-from-args.ts diff --git a/src/util/scale/get-min-from-args.ts b/packages/now-cli/src/util/scale/get-min-from-args.ts similarity index 100% rename from src/util/scale/get-min-from-args.ts rename to packages/now-cli/src/util/scale/get-min-from-args.ts diff --git a/src/util/scale/get-raw-min-from-args.ts b/packages/now-cli/src/util/scale/get-raw-min-from-args.ts similarity index 100% rename from src/util/scale/get-raw-min-from-args.ts rename to packages/now-cli/src/util/scale/get-raw-min-from-args.ts diff --git a/src/util/scale/get-scale-for-dc.ts b/packages/now-cli/src/util/scale/get-scale-for-dc.ts similarity index 100% rename from src/util/scale/get-scale-for-dc.ts rename to packages/now-cli/src/util/scale/get-scale-for-dc.ts diff --git a/src/util/scale/is-valid-min-max-value.ts b/packages/now-cli/src/util/scale/is-valid-min-max-value.ts similarity index 100% rename from src/util/scale/is-valid-min-max-value.ts rename to packages/now-cli/src/util/scale/is-valid-min-max-value.ts diff --git a/src/util/scale/normalize-regions-list.js b/packages/now-cli/src/util/scale/normalize-regions-list.js similarity index 100% rename from src/util/scale/normalize-regions-list.js rename to packages/now-cli/src/util/scale/normalize-regions-list.js diff --git a/src/util/scale/patch-deployment-scale.ts b/packages/now-cli/src/util/scale/patch-deployment-scale.ts similarity index 100% rename from src/util/scale/patch-deployment-scale.ts rename to packages/now-cli/src/util/scale/patch-deployment-scale.ts diff --git a/src/util/scale/region-or-dc-to-dc.js b/packages/now-cli/src/util/scale/region-or-dc-to-dc.js similarity index 100% rename from src/util/scale/region-or-dc-to-dc.js rename to packages/now-cli/src/util/scale/region-or-dc-to-dc.js diff --git a/src/util/scale/set-deployment-scale.ts b/packages/now-cli/src/util/scale/set-deployment-scale.ts similarity index 100% rename from src/util/scale/set-deployment-scale.ts rename to packages/now-cli/src/util/scale/set-deployment-scale.ts diff --git a/src/util/scale/to-number-or-auto.ts b/packages/now-cli/src/util/scale/to-number-or-auto.ts similarity index 100% rename from src/util/scale/to-number-or-auto.ts rename to packages/now-cli/src/util/scale/to-number-or-auto.ts diff --git a/src/util/scale/verify-deployment-scale.ts b/packages/now-cli/src/util/scale/verify-deployment-scale.ts similarity index 100% rename from src/util/scale/verify-deployment-scale.ts rename to packages/now-cli/src/util/scale/verify-deployment-scale.ts diff --git a/src/util/scale/wait-verify-deployment-scale.ts b/packages/now-cli/src/util/scale/wait-verify-deployment-scale.ts similarity index 100% rename from src/util/scale/wait-verify-deployment-scale.ts rename to packages/now-cli/src/util/scale/wait-verify-deployment-scale.ts diff --git a/src/util/secrets.js b/packages/now-cli/src/util/secrets.js similarity index 100% rename from src/util/secrets.js rename to packages/now-cli/src/util/secrets.js diff --git a/src/util/sleep.ts b/packages/now-cli/src/util/sleep.ts similarity index 100% rename from src/util/sleep.ts rename to packages/now-cli/src/util/sleep.ts diff --git a/src/util/strlen.ts b/packages/now-cli/src/util/strlen.ts similarity index 100% rename from src/util/strlen.ts rename to packages/now-cli/src/util/strlen.ts diff --git a/src/util/teams.js b/packages/now-cli/src/util/teams.js similarity index 99% rename from src/util/teams.js rename to packages/now-cli/src/util/teams.js index 6bc77abee..2fc6de7f2 100644 --- a/src/util/teams.js +++ b/packages/now-cli/src/util/teams.js @@ -1,4 +1,4 @@ -import Now from '.'; +import Now from './index'; export default class Teams extends Now { async create({ slug }) { diff --git a/src/util/test.js b/packages/now-cli/src/util/test.js similarity index 100% rename from src/util/test.js rename to packages/now-cli/src/util/test.js diff --git a/src/util/to-host.ts b/packages/now-cli/src/util/to-host.ts similarity index 100% rename from src/util/to-host.ts rename to packages/now-cli/src/util/to-host.ts diff --git a/src/util/ua-browser.ts b/packages/now-cli/src/util/ua-browser.ts similarity index 100% rename from src/util/ua-browser.ts rename to packages/now-cli/src/util/ua-browser.ts diff --git a/src/util/ua.ts b/packages/now-cli/src/util/ua.ts similarity index 100% rename from src/util/ua.ts rename to packages/now-cli/src/util/ua.ts diff --git a/src/util/unique-strings.ts b/packages/now-cli/src/util/unique-strings.ts similarity index 100% rename from src/util/unique-strings.ts rename to packages/now-cli/src/util/unique-strings.ts diff --git a/src/util/url.js b/packages/now-cli/src/util/url.js similarity index 100% rename from src/util/url.js rename to packages/now-cli/src/util/url.js diff --git a/src/util/uuid.ts b/packages/now-cli/src/util/uuid.ts similarity index 100% rename from src/util/uuid.ts rename to packages/now-cli/src/util/uuid.ts diff --git a/src/util/with-spinner.ts b/packages/now-cli/src/util/with-spinner.ts similarity index 100% rename from src/util/with-spinner.ts rename to packages/now-cli/src/util/with-spinner.ts diff --git a/src/util/zeit-world-table.ts b/packages/now-cli/src/util/zeit-world-table.ts similarity index 100% rename from src/util/zeit-world-table.ts rename to packages/now-cli/src/util/zeit-world-table.ts diff --git a/test/dev-builder.unit.js b/packages/now-cli/test/dev-builder.unit.js similarity index 100% rename from test/dev-builder.unit.js rename to packages/now-cli/test/dev-builder.unit.js diff --git a/test/dev-router.unit.js b/packages/now-cli/test/dev-router.unit.js similarity index 100% rename from test/dev-router.unit.js rename to packages/now-cli/test/dev-router.unit.js diff --git a/test/dev-server.unit.js b/packages/now-cli/test/dev-server.unit.js similarity index 100% rename from test/dev-server.unit.js rename to packages/now-cli/test/dev-server.unit.js diff --git a/test/dev/fixtures/00-list-directory/directory/hello.md b/packages/now-cli/test/dev/fixtures/00-list-directory/directory/hello.md similarity index 100% rename from test/dev/fixtures/00-list-directory/directory/hello.md rename to packages/now-cli/test/dev/fixtures/00-list-directory/directory/hello.md diff --git a/test/dev/fixtures/00-list-directory/test1.txt b/packages/now-cli/test/dev/fixtures/00-list-directory/test1.txt similarity index 100% rename from test/dev/fixtures/00-list-directory/test1.txt rename to packages/now-cli/test/dev/fixtures/00-list-directory/test1.txt diff --git a/test/dev/fixtures/00-list-directory/test2.txt b/packages/now-cli/test/dev/fixtures/00-list-directory/test2.txt similarity index 100% rename from test/dev/fixtures/00-list-directory/test2.txt rename to packages/now-cli/test/dev/fixtures/00-list-directory/test2.txt diff --git a/test/dev/fixtures/00-list-directory/test3.txt b/packages/now-cli/test/dev/fixtures/00-list-directory/test3.txt similarity index 100% rename from test/dev/fixtures/00-list-directory/test3.txt rename to packages/now-cli/test/dev/fixtures/00-list-directory/test3.txt diff --git a/test/dev/fixtures/01-node/.gitignore b/packages/now-cli/test/dev/fixtures/01-node/.gitignore similarity index 100% rename from test/dev/fixtures/01-node/.gitignore rename to packages/now-cli/test/dev/fixtures/01-node/.gitignore diff --git a/test/dev/fixtures/01-node/.nowignore b/packages/now-cli/test/dev/fixtures/01-node/.nowignore similarity index 100% rename from test/dev/fixtures/01-node/.nowignore rename to packages/now-cli/test/dev/fixtures/01-node/.nowignore diff --git a/test/dev/fixtures/01-node/api/date.js b/packages/now-cli/test/dev/fixtures/01-node/api/date.js similarity index 100% rename from test/dev/fixtures/01-node/api/date.js rename to packages/now-cli/test/dev/fixtures/01-node/api/date.js diff --git a/test/dev/fixtures/01-node/now.json b/packages/now-cli/test/dev/fixtures/01-node/now.json similarity index 100% rename from test/dev/fixtures/01-node/now.json rename to packages/now-cli/test/dev/fixtures/01-node/now.json diff --git a/test/dev/fixtures/01-node/package.json b/packages/now-cli/test/dev/fixtures/01-node/package.json similarity index 100% rename from test/dev/fixtures/01-node/package.json rename to packages/now-cli/test/dev/fixtures/01-node/package.json diff --git a/test/dev/fixtures/01-node/www/index.html b/packages/now-cli/test/dev/fixtures/01-node/www/index.html similarity index 100% rename from test/dev/fixtures/01-node/www/index.html rename to packages/now-cli/test/dev/fixtures/01-node/www/index.html diff --git a/test/dev/fixtures/01-node/www/style.css b/packages/now-cli/test/dev/fixtures/01-node/www/style.css similarity index 100% rename from test/dev/fixtures/01-node/www/style.css rename to packages/now-cli/test/dev/fixtures/01-node/www/style.css diff --git a/test/dev/fixtures/02-angular-node/.editorconfig b/packages/now-cli/test/dev/fixtures/02-angular-node/.editorconfig similarity index 100% rename from test/dev/fixtures/02-angular-node/.editorconfig rename to packages/now-cli/test/dev/fixtures/02-angular-node/.editorconfig diff --git a/test/dev/fixtures/02-angular-node/.gitignore b/packages/now-cli/test/dev/fixtures/02-angular-node/.gitignore similarity index 100% rename from test/dev/fixtures/02-angular-node/.gitignore rename to packages/now-cli/test/dev/fixtures/02-angular-node/.gitignore diff --git a/test/dev/fixtures/02-angular-node/angular.json b/packages/now-cli/test/dev/fixtures/02-angular-node/angular.json similarity index 100% rename from test/dev/fixtures/02-angular-node/angular.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/angular.json diff --git a/test/dev/fixtures/02-angular-node/api/date.js b/packages/now-cli/test/dev/fixtures/02-angular-node/api/date.js similarity index 100% rename from test/dev/fixtures/02-angular-node/api/date.js rename to packages/now-cli/test/dev/fixtures/02-angular-node/api/date.js diff --git a/test/dev/fixtures/02-angular-node/browserslist b/packages/now-cli/test/dev/fixtures/02-angular-node/browserslist similarity index 100% rename from test/dev/fixtures/02-angular-node/browserslist rename to packages/now-cli/test/dev/fixtures/02-angular-node/browserslist diff --git a/test/dev/fixtures/02-angular-node/e2e/protractor.conf.js b/packages/now-cli/test/dev/fixtures/02-angular-node/e2e/protractor.conf.js similarity index 100% rename from test/dev/fixtures/02-angular-node/e2e/protractor.conf.js rename to packages/now-cli/test/dev/fixtures/02-angular-node/e2e/protractor.conf.js diff --git a/test/dev/fixtures/02-angular-node/e2e/src/app.e2e-spec.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/e2e/src/app.e2e-spec.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/e2e/src/app.e2e-spec.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/e2e/src/app.e2e-spec.ts diff --git a/test/dev/fixtures/02-angular-node/e2e/src/app.po.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/e2e/src/app.po.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/e2e/src/app.po.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/e2e/src/app.po.ts diff --git a/test/dev/fixtures/02-angular-node/e2e/tsconfig.json b/packages/now-cli/test/dev/fixtures/02-angular-node/e2e/tsconfig.json similarity index 100% rename from test/dev/fixtures/02-angular-node/e2e/tsconfig.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/e2e/tsconfig.json diff --git a/test/dev/fixtures/02-angular-node/karma.conf.js b/packages/now-cli/test/dev/fixtures/02-angular-node/karma.conf.js similarity index 100% rename from test/dev/fixtures/02-angular-node/karma.conf.js rename to packages/now-cli/test/dev/fixtures/02-angular-node/karma.conf.js diff --git a/test/dev/fixtures/02-angular-node/package.json b/packages/now-cli/test/dev/fixtures/02-angular-node/package.json similarity index 100% rename from test/dev/fixtures/02-angular-node/package.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/package.json diff --git a/test/dev/fixtures/02-angular-node/src/app/app.component.css b/packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.css similarity index 100% rename from test/dev/fixtures/02-angular-node/src/app/app.component.css rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.css diff --git a/test/dev/fixtures/02-angular-node/src/app/app.component.html b/packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.html similarity index 100% rename from test/dev/fixtures/02-angular-node/src/app/app.component.html rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.html diff --git a/test/dev/fixtures/02-angular-node/src/app/app.component.spec.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.spec.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/app/app.component.spec.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.spec.ts diff --git a/test/dev/fixtures/02-angular-node/src/app/app.component.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/app/app.component.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.component.ts diff --git a/test/dev/fixtures/02-angular-node/src/app/app.module.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.module.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/app/app.module.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/app/app.module.ts diff --git a/test/dev/fixtures/02-angular-node/src/assets/.gitkeep b/packages/now-cli/test/dev/fixtures/02-angular-node/src/assets/.gitkeep similarity index 100% rename from test/dev/fixtures/02-angular-node/src/assets/.gitkeep rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/assets/.gitkeep diff --git a/test/dev/fixtures/02-angular-node/src/environments/environment.prod.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/environments/environment.prod.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/environments/environment.prod.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/environments/environment.prod.ts diff --git a/test/dev/fixtures/02-angular-node/src/environments/environment.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/environments/environment.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/environments/environment.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/environments/environment.ts diff --git a/test/dev/fixtures/02-angular-node/src/favicon.ico b/packages/now-cli/test/dev/fixtures/02-angular-node/src/favicon.ico similarity index 100% rename from test/dev/fixtures/02-angular-node/src/favicon.ico rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/favicon.ico diff --git a/test/dev/fixtures/02-angular-node/src/index.html b/packages/now-cli/test/dev/fixtures/02-angular-node/src/index.html similarity index 100% rename from test/dev/fixtures/02-angular-node/src/index.html rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/index.html diff --git a/test/dev/fixtures/02-angular-node/src/main.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/main.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/main.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/main.ts diff --git a/test/dev/fixtures/02-angular-node/src/polyfills.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/polyfills.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/polyfills.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/polyfills.ts diff --git a/test/dev/fixtures/02-angular-node/src/styles.css b/packages/now-cli/test/dev/fixtures/02-angular-node/src/styles.css similarity index 100% rename from test/dev/fixtures/02-angular-node/src/styles.css rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/styles.css diff --git a/test/dev/fixtures/02-angular-node/src/test.ts b/packages/now-cli/test/dev/fixtures/02-angular-node/src/test.ts similarity index 100% rename from test/dev/fixtures/02-angular-node/src/test.ts rename to packages/now-cli/test/dev/fixtures/02-angular-node/src/test.ts diff --git a/test/dev/fixtures/02-angular-node/tsconfig.app.json b/packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.app.json similarity index 100% rename from test/dev/fixtures/02-angular-node/tsconfig.app.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.app.json diff --git a/test/dev/fixtures/02-angular-node/tsconfig.json b/packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.json similarity index 100% rename from test/dev/fixtures/02-angular-node/tsconfig.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.json diff --git a/test/dev/fixtures/02-angular-node/tsconfig.spec.json b/packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.spec.json similarity index 100% rename from test/dev/fixtures/02-angular-node/tsconfig.spec.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/tsconfig.spec.json diff --git a/test/dev/fixtures/02-angular-node/tslint.json b/packages/now-cli/test/dev/fixtures/02-angular-node/tslint.json similarity index 100% rename from test/dev/fixtures/02-angular-node/tslint.json rename to packages/now-cli/test/dev/fixtures/02-angular-node/tslint.json diff --git a/test/dev/fixtures/03-aurelia/.babelrc.js b/packages/now-cli/test/dev/fixtures/03-aurelia/.babelrc.js similarity index 100% rename from test/dev/fixtures/03-aurelia/.babelrc.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/.babelrc.js diff --git a/test/dev/fixtures/03-aurelia/.editorconfig b/packages/now-cli/test/dev/fixtures/03-aurelia/.editorconfig similarity index 100% rename from test/dev/fixtures/03-aurelia/.editorconfig rename to packages/now-cli/test/dev/fixtures/03-aurelia/.editorconfig diff --git a/test/dev/fixtures/03-aurelia/.eslintrc.json b/packages/now-cli/test/dev/fixtures/03-aurelia/.eslintrc.json similarity index 100% rename from test/dev/fixtures/03-aurelia/.eslintrc.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/.eslintrc.json diff --git a/test/dev/fixtures/03-aurelia/.gitignore b/packages/now-cli/test/dev/fixtures/03-aurelia/.gitignore similarity index 100% rename from test/dev/fixtures/03-aurelia/.gitignore rename to packages/now-cli/test/dev/fixtures/03-aurelia/.gitignore diff --git a/test/dev/fixtures/03-aurelia/.nowignore b/packages/now-cli/test/dev/fixtures/03-aurelia/.nowignore similarity index 100% rename from test/dev/fixtures/03-aurelia/.nowignore rename to packages/now-cli/test/dev/fixtures/03-aurelia/.nowignore diff --git a/test/dev/fixtures/03-aurelia/README.md b/packages/now-cli/test/dev/fixtures/03-aurelia/README.md similarity index 100% rename from test/dev/fixtures/03-aurelia/README.md rename to packages/now-cli/test/dev/fixtures/03-aurelia/README.md diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/aurelia.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/aurelia.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/aurelia.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/aurelia.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/environments/dev.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/dev.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/environments/dev.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/dev.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/environments/prod.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/prod.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/environments/prod.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/prod.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/environments/stage.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/stage.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/environments/stage.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/stage.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/environments/test.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/test.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/environments/test.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/environments/test.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/attribute.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/binding-behavior.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/component.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/component.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/component.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/element.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/element.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/element.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/generator.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/task.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/task.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/task.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/generators/value-converter.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/build.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/environment.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/environment.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/environment.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/environment.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/jest.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/run.json diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.js b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.js similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.js diff --git a/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.json b/packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.json similarity index 100% rename from test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/aurelia_project/tasks/test.json diff --git a/test/dev/fixtures/03-aurelia/favicon.ico b/packages/now-cli/test/dev/fixtures/03-aurelia/favicon.ico similarity index 100% rename from test/dev/fixtures/03-aurelia/favicon.ico rename to packages/now-cli/test/dev/fixtures/03-aurelia/favicon.ico diff --git a/test/dev/fixtures/03-aurelia/index.ejs b/packages/now-cli/test/dev/fixtures/03-aurelia/index.ejs similarity index 100% rename from test/dev/fixtures/03-aurelia/index.ejs rename to packages/now-cli/test/dev/fixtures/03-aurelia/index.ejs diff --git a/test/dev/fixtures/03-aurelia/jsconfig.json b/packages/now-cli/test/dev/fixtures/03-aurelia/jsconfig.json similarity index 100% rename from test/dev/fixtures/03-aurelia/jsconfig.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/jsconfig.json diff --git a/test/dev/fixtures/03-aurelia/package.json b/packages/now-cli/test/dev/fixtures/03-aurelia/package.json similarity index 100% rename from test/dev/fixtures/03-aurelia/package.json rename to packages/now-cli/test/dev/fixtures/03-aurelia/package.json diff --git a/test/dev/fixtures/03-aurelia/src/app.html b/packages/now-cli/test/dev/fixtures/03-aurelia/src/app.html similarity index 100% rename from test/dev/fixtures/03-aurelia/src/app.html rename to packages/now-cli/test/dev/fixtures/03-aurelia/src/app.html diff --git a/test/dev/fixtures/03-aurelia/src/app.js b/packages/now-cli/test/dev/fixtures/03-aurelia/src/app.js similarity index 100% rename from test/dev/fixtures/03-aurelia/src/app.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/src/app.js diff --git a/test/dev/fixtures/03-aurelia/src/environment.js b/packages/now-cli/test/dev/fixtures/03-aurelia/src/environment.js similarity index 100% rename from test/dev/fixtures/03-aurelia/src/environment.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/src/environment.js diff --git a/test/dev/fixtures/03-aurelia/src/main.js b/packages/now-cli/test/dev/fixtures/03-aurelia/src/main.js similarity index 100% rename from test/dev/fixtures/03-aurelia/src/main.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/src/main.js diff --git a/test/dev/fixtures/03-aurelia/src/resources/index.js b/packages/now-cli/test/dev/fixtures/03-aurelia/src/resources/index.js similarity index 100% rename from test/dev/fixtures/03-aurelia/src/resources/index.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/src/resources/index.js diff --git a/test/dev/fixtures/03-aurelia/static/favicon.ico b/packages/now-cli/test/dev/fixtures/03-aurelia/static/favicon.ico similarity index 100% rename from test/dev/fixtures/03-aurelia/static/favicon.ico rename to packages/now-cli/test/dev/fixtures/03-aurelia/static/favicon.ico diff --git a/test/dev/fixtures/03-aurelia/test/jest-pretest.js b/packages/now-cli/test/dev/fixtures/03-aurelia/test/jest-pretest.js similarity index 100% rename from test/dev/fixtures/03-aurelia/test/jest-pretest.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/test/jest-pretest.js diff --git a/test/dev/fixtures/03-aurelia/test/unit/.eslintrc b/packages/now-cli/test/dev/fixtures/03-aurelia/test/unit/.eslintrc similarity index 100% rename from test/dev/fixtures/03-aurelia/test/unit/.eslintrc rename to packages/now-cli/test/dev/fixtures/03-aurelia/test/unit/.eslintrc diff --git a/test/dev/fixtures/03-aurelia/test/unit/app.spec.js b/packages/now-cli/test/dev/fixtures/03-aurelia/test/unit/app.spec.js similarity index 100% rename from test/dev/fixtures/03-aurelia/test/unit/app.spec.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/test/unit/app.spec.js diff --git a/test/dev/fixtures/03-aurelia/webpack.config.js b/packages/now-cli/test/dev/fixtures/03-aurelia/webpack.config.js similarity index 100% rename from test/dev/fixtures/03-aurelia/webpack.config.js rename to packages/now-cli/test/dev/fixtures/03-aurelia/webpack.config.js diff --git a/test/dev/fixtures/04-create-react-app/.gitignore b/packages/now-cli/test/dev/fixtures/04-create-react-app/.gitignore similarity index 100% rename from test/dev/fixtures/04-create-react-app/.gitignore rename to packages/now-cli/test/dev/fixtures/04-create-react-app/.gitignore diff --git a/test/dev/fixtures/04-create-react-app/.nowignore b/packages/now-cli/test/dev/fixtures/04-create-react-app/.nowignore similarity index 100% rename from test/dev/fixtures/04-create-react-app/.nowignore rename to packages/now-cli/test/dev/fixtures/04-create-react-app/.nowignore diff --git a/test/dev/fixtures/04-create-react-app/README.md b/packages/now-cli/test/dev/fixtures/04-create-react-app/README.md similarity index 100% rename from test/dev/fixtures/04-create-react-app/README.md rename to packages/now-cli/test/dev/fixtures/04-create-react-app/README.md diff --git a/test/dev/fixtures/04-create-react-app/package.json b/packages/now-cli/test/dev/fixtures/04-create-react-app/package.json similarity index 100% rename from test/dev/fixtures/04-create-react-app/package.json rename to packages/now-cli/test/dev/fixtures/04-create-react-app/package.json diff --git a/test/dev/fixtures/04-create-react-app/public/favicon.ico b/packages/now-cli/test/dev/fixtures/04-create-react-app/public/favicon.ico similarity index 100% rename from test/dev/fixtures/04-create-react-app/public/favicon.ico rename to packages/now-cli/test/dev/fixtures/04-create-react-app/public/favicon.ico diff --git a/test/dev/fixtures/04-create-react-app/public/index.html b/packages/now-cli/test/dev/fixtures/04-create-react-app/public/index.html similarity index 100% rename from test/dev/fixtures/04-create-react-app/public/index.html rename to packages/now-cli/test/dev/fixtures/04-create-react-app/public/index.html diff --git a/test/dev/fixtures/04-create-react-app/public/manifest.json b/packages/now-cli/test/dev/fixtures/04-create-react-app/public/manifest.json similarity index 100% rename from test/dev/fixtures/04-create-react-app/public/manifest.json rename to packages/now-cli/test/dev/fixtures/04-create-react-app/public/manifest.json diff --git a/test/dev/fixtures/04-create-react-app/src/App.css b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.css similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/App.css rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.css diff --git a/test/dev/fixtures/04-create-react-app/src/App.js b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.js similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/App.js rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.js diff --git a/test/dev/fixtures/04-create-react-app/src/App.test.js b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.test.js similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/App.test.js rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/App.test.js diff --git a/test/dev/fixtures/04-create-react-app/src/index.css b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/index.css similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/index.css rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/index.css diff --git a/test/dev/fixtures/04-create-react-app/src/index.js b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/index.js similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/index.js rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/index.js diff --git a/test/dev/fixtures/04-create-react-app/src/logo.svg b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/logo.svg similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/logo.svg rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/logo.svg diff --git a/test/dev/fixtures/04-create-react-app/src/serviceWorker.js b/packages/now-cli/test/dev/fixtures/04-create-react-app/src/serviceWorker.js similarity index 100% rename from test/dev/fixtures/04-create-react-app/src/serviceWorker.js rename to packages/now-cli/test/dev/fixtures/04-create-react-app/src/serviceWorker.js diff --git a/test/dev/fixtures/04-create-react-app/yarn.lock b/packages/now-cli/test/dev/fixtures/04-create-react-app/yarn.lock similarity index 100% rename from test/dev/fixtures/04-create-react-app/yarn.lock rename to packages/now-cli/test/dev/fixtures/04-create-react-app/yarn.lock diff --git a/test/dev/fixtures/05-gatsby/.gitignore b/packages/now-cli/test/dev/fixtures/05-gatsby/.gitignore similarity index 100% rename from test/dev/fixtures/05-gatsby/.gitignore rename to packages/now-cli/test/dev/fixtures/05-gatsby/.gitignore diff --git a/test/dev/fixtures/05-gatsby/.nowignore b/packages/now-cli/test/dev/fixtures/05-gatsby/.nowignore similarity index 100% rename from test/dev/fixtures/05-gatsby/.nowignore rename to packages/now-cli/test/dev/fixtures/05-gatsby/.nowignore diff --git a/test/dev/fixtures/05-gatsby/.prettierrc b/packages/now-cli/test/dev/fixtures/05-gatsby/.prettierrc similarity index 100% rename from test/dev/fixtures/05-gatsby/.prettierrc rename to packages/now-cli/test/dev/fixtures/05-gatsby/.prettierrc diff --git a/test/dev/fixtures/05-gatsby/LICENSE b/packages/now-cli/test/dev/fixtures/05-gatsby/LICENSE similarity index 100% rename from test/dev/fixtures/05-gatsby/LICENSE rename to packages/now-cli/test/dev/fixtures/05-gatsby/LICENSE diff --git a/test/dev/fixtures/05-gatsby/README.md b/packages/now-cli/test/dev/fixtures/05-gatsby/README.md similarity index 100% rename from test/dev/fixtures/05-gatsby/README.md rename to packages/now-cli/test/dev/fixtures/05-gatsby/README.md diff --git a/test/dev/fixtures/05-gatsby/gatsby-browser.js b/packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-browser.js similarity index 100% rename from test/dev/fixtures/05-gatsby/gatsby-browser.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-browser.js diff --git a/test/dev/fixtures/05-gatsby/gatsby-config.js b/packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-config.js similarity index 100% rename from test/dev/fixtures/05-gatsby/gatsby-config.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-config.js diff --git a/test/dev/fixtures/05-gatsby/gatsby-node.js b/packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-node.js similarity index 100% rename from test/dev/fixtures/05-gatsby/gatsby-node.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-node.js diff --git a/test/dev/fixtures/05-gatsby/gatsby-ssr.js b/packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-ssr.js similarity index 100% rename from test/dev/fixtures/05-gatsby/gatsby-ssr.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/gatsby-ssr.js diff --git a/test/dev/fixtures/05-gatsby/package.json b/packages/now-cli/test/dev/fixtures/05-gatsby/package.json similarity index 100% rename from test/dev/fixtures/05-gatsby/package.json rename to packages/now-cli/test/dev/fixtures/05-gatsby/package.json diff --git a/test/dev/fixtures/05-gatsby/src/components/header.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/components/header.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/components/header.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/components/header.js diff --git a/test/dev/fixtures/05-gatsby/src/components/image.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/components/image.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/components/image.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/components/image.js diff --git a/test/dev/fixtures/05-gatsby/src/components/layout.css b/packages/now-cli/test/dev/fixtures/05-gatsby/src/components/layout.css similarity index 100% rename from test/dev/fixtures/05-gatsby/src/components/layout.css rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/components/layout.css diff --git a/test/dev/fixtures/05-gatsby/src/components/layout.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/components/layout.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/components/layout.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/components/layout.js diff --git a/test/dev/fixtures/05-gatsby/src/components/seo.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/components/seo.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/components/seo.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/components/seo.js diff --git a/test/dev/fixtures/05-gatsby/src/images/gatsby-astronaut.png b/packages/now-cli/test/dev/fixtures/05-gatsby/src/images/gatsby-astronaut.png similarity index 100% rename from test/dev/fixtures/05-gatsby/src/images/gatsby-astronaut.png rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/images/gatsby-astronaut.png diff --git a/test/dev/fixtures/05-gatsby/src/images/gatsby-icon.png b/packages/now-cli/test/dev/fixtures/05-gatsby/src/images/gatsby-icon.png similarity index 100% rename from test/dev/fixtures/05-gatsby/src/images/gatsby-icon.png rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/images/gatsby-icon.png diff --git a/test/dev/fixtures/05-gatsby/src/pages/404.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/404.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/pages/404.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/404.js diff --git a/test/dev/fixtures/05-gatsby/src/pages/index.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/index.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/pages/index.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/index.js diff --git a/test/dev/fixtures/05-gatsby/src/pages/page-2.js b/packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/page-2.js similarity index 100% rename from test/dev/fixtures/05-gatsby/src/pages/page-2.js rename to packages/now-cli/test/dev/fixtures/05-gatsby/src/pages/page-2.js diff --git a/test/dev/fixtures/06-gridsome/.gitignore b/packages/now-cli/test/dev/fixtures/06-gridsome/.gitignore similarity index 100% rename from test/dev/fixtures/06-gridsome/.gitignore rename to packages/now-cli/test/dev/fixtures/06-gridsome/.gitignore diff --git a/test/dev/fixtures/06-gridsome/.nowignore b/packages/now-cli/test/dev/fixtures/06-gridsome/.nowignore similarity index 100% rename from test/dev/fixtures/06-gridsome/.nowignore rename to packages/now-cli/test/dev/fixtures/06-gridsome/.nowignore diff --git a/test/dev/fixtures/06-gridsome/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/README.md diff --git a/test/dev/fixtures/06-gridsome/gridsome.config.js b/packages/now-cli/test/dev/fixtures/06-gridsome/gridsome.config.js similarity index 100% rename from test/dev/fixtures/06-gridsome/gridsome.config.js rename to packages/now-cli/test/dev/fixtures/06-gridsome/gridsome.config.js diff --git a/test/dev/fixtures/06-gridsome/gridsome.server.js b/packages/now-cli/test/dev/fixtures/06-gridsome/gridsome.server.js similarity index 100% rename from test/dev/fixtures/06-gridsome/gridsome.server.js rename to packages/now-cli/test/dev/fixtures/06-gridsome/gridsome.server.js diff --git a/test/dev/fixtures/06-gridsome/package.json b/packages/now-cli/test/dev/fixtures/06-gridsome/package.json similarity index 100% rename from test/dev/fixtures/06-gridsome/package.json rename to packages/now-cli/test/dev/fixtures/06-gridsome/package.json diff --git a/test/dev/fixtures/06-gridsome/src/components/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/src/components/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/src/components/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/components/README.md diff --git a/test/dev/fixtures/06-gridsome/src/favicon.png b/packages/now-cli/test/dev/fixtures/06-gridsome/src/favicon.png similarity index 100% rename from test/dev/fixtures/06-gridsome/src/favicon.png rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/favicon.png diff --git a/test/dev/fixtures/06-gridsome/src/layouts/Default.vue b/packages/now-cli/test/dev/fixtures/06-gridsome/src/layouts/Default.vue similarity index 100% rename from test/dev/fixtures/06-gridsome/src/layouts/Default.vue rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/layouts/Default.vue diff --git a/test/dev/fixtures/06-gridsome/src/layouts/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/src/layouts/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/src/layouts/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/layouts/README.md diff --git a/test/dev/fixtures/06-gridsome/src/main.js b/packages/now-cli/test/dev/fixtures/06-gridsome/src/main.js similarity index 100% rename from test/dev/fixtures/06-gridsome/src/main.js rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/main.js diff --git a/test/dev/fixtures/06-gridsome/src/pages/About.vue b/packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/About.vue similarity index 100% rename from test/dev/fixtures/06-gridsome/src/pages/About.vue rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/About.vue diff --git a/test/dev/fixtures/06-gridsome/src/pages/Index.vue b/packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/Index.vue similarity index 100% rename from test/dev/fixtures/06-gridsome/src/pages/Index.vue rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/Index.vue diff --git a/test/dev/fixtures/06-gridsome/src/pages/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/src/pages/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/pages/README.md diff --git a/test/dev/fixtures/06-gridsome/src/templates/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/src/templates/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/src/templates/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/src/templates/README.md diff --git a/test/dev/fixtures/06-gridsome/static/README.md b/packages/now-cli/test/dev/fixtures/06-gridsome/static/README.md similarity index 100% rename from test/dev/fixtures/06-gridsome/static/README.md rename to packages/now-cli/test/dev/fixtures/06-gridsome/static/README.md diff --git a/test/dev/fixtures/06-gridsome/yarn.lock b/packages/now-cli/test/dev/fixtures/06-gridsome/yarn.lock similarity index 100% rename from test/dev/fixtures/06-gridsome/yarn.lock rename to packages/now-cli/test/dev/fixtures/06-gridsome/yarn.lock diff --git a/test/dev/fixtures/07-hexo-node/.gitignore b/packages/now-cli/test/dev/fixtures/07-hexo-node/.gitignore similarity index 100% rename from test/dev/fixtures/07-hexo-node/.gitignore rename to packages/now-cli/test/dev/fixtures/07-hexo-node/.gitignore diff --git a/test/dev/fixtures/07-hexo-node/_config.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/_config.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/_config.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/_config.yml diff --git a/test/dev/fixtures/07-hexo-node/api/date.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/api/date.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/api/date.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/api/date.js diff --git a/test/dev/fixtures/07-hexo-node/package.json b/packages/now-cli/test/dev/fixtures/07-hexo-node/package.json similarity index 100% rename from test/dev/fixtures/07-hexo-node/package.json rename to packages/now-cli/test/dev/fixtures/07-hexo-node/package.json diff --git a/test/dev/fixtures/07-hexo-node/scaffolds/draft.md b/packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/draft.md similarity index 100% rename from test/dev/fixtures/07-hexo-node/scaffolds/draft.md rename to packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/draft.md diff --git a/test/dev/fixtures/07-hexo-node/scaffolds/page.md b/packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/page.md similarity index 100% rename from test/dev/fixtures/07-hexo-node/scaffolds/page.md rename to packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/page.md diff --git a/test/dev/fixtures/07-hexo-node/scaffolds/post.md b/packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/post.md similarity index 100% rename from test/dev/fixtures/07-hexo-node/scaffolds/post.md rename to packages/now-cli/test/dev/fixtures/07-hexo-node/scaffolds/post.md diff --git a/test/dev/fixtures/07-hexo-node/source/_posts/hello-world.md b/packages/now-cli/test/dev/fixtures/07-hexo-node/source/_posts/hello-world.md similarity index 100% rename from test/dev/fixtures/07-hexo-node/source/_posts/hello-world.md rename to packages/now-cli/test/dev/fixtures/07-hexo-node/source/_posts/hello-world.md diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/.gitignore b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/.gitignore similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/.gitignore rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/.gitignore diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/Gruntfile.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/Gruntfile.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/Gruntfile.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/Gruntfile.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/LICENSE b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/LICENSE similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/LICENSE rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/LICENSE diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/README.md b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/README.md similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/README.md rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/README.md diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/_config.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/_config.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/_config.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/_config.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/de.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/de.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/de.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/de.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/default.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/default.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/default.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/default.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/es.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/es.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/es.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/es.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/fr.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/fr.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/fr.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/fr.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ja.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ja.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/ja.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ja.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ko.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ko.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/ko.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ko.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/nl.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/nl.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/nl.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/nl.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/no.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/no.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/no.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/no.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/pt.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/pt.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/pt.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/pt.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ru.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ru.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/ru.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/ru.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-CN.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-CN.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-CN.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-CN.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-TW.yml b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-TW.yml similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-TW.yml rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/languages/zh-TW.yml diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/after-footer.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/after-footer.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/after-footer.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/after-footer.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive-post.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive-post.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive-post.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive-post.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/archive.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/article.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/article.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/article.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/article.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/footer.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/footer.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/footer.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/footer.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/gauges-analytics.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/gauges-analytics.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/gauges-analytics.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/gauges-analytics.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/google-analytics.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/google-analytics.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/google-analytics.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/google-analytics.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/head.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/head.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/head.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/head.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/header.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/header.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/header.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/header.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/mobile-nav.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/mobile-nav.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/mobile-nav.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/mobile-nav.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/category.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/category.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/category.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/category.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/date.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/date.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/date.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/date.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/gallery.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/gallery.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/gallery.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/gallery.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/nav.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/nav.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/nav.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/nav.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/tag.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/tag.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/tag.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/tag.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/title.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/title.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/title.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/post/title.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/sidebar.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/sidebar.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/sidebar.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_partial/sidebar.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/archive.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/archive.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/archive.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/archive.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/category.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/category.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/category.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/category.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/recent_posts.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/recent_posts.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/recent_posts.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/recent_posts.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tag.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tag.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tag.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tag.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tagcloud.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tagcloud.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tagcloud.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/_widget/tagcloud.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/archive.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/archive.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/archive.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/archive.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/category.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/category.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/category.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/category.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/index.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/index.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/index.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/index.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/layout.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/layout.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/layout.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/layout.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/page.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/page.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/page.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/page.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/post.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/post.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/post.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/post.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/layout/tag.ejs b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/tag.ejs similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/layout/tag.ejs rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/layout/tag.ejs diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/package.json b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/package.json similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/package.json rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/package.json diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/scripts/fancybox.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/scripts/fancybox.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/scripts/fancybox.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/scripts/fancybox.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_extend.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_extend.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_extend.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_extend.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/archive.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/archive.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/archive.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/archive.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/article.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/article.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/article.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/article.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/comment.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/comment.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/comment.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/comment.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/footer.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/footer.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/footer.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/footer.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/header.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/header.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/header.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/header.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/highlight.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/highlight.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/highlight.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/highlight.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/mobile.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/mobile.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/mobile.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/mobile.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-aside.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-aside.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-aside.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-aside.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-bottom.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-bottom.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-bottom.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar-bottom.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_partial/sidebar.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/grid.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/grid.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/grid.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/grid.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/mixin.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/mixin.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/mixin.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_util/mixin.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_variables.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_variables.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_variables.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/_variables.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/FontAwesome.otf b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/FontAwesome.otf similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/FontAwesome.otf rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/FontAwesome.otf diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.eot b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.eot similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.eot rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.eot diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.svg b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.svg similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.svg rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.svg diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.ttf b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.ttf similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.ttf rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.ttf diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.woff b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.woff similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.woff rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/fonts/fontawesome-webfont.woff diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/images/banner.jpg b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/images/banner.jpg similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/images/banner.jpg rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/images/banner.jpg diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/style.styl b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/style.styl similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/css/style.styl rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/css/style.styl diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/blank.gif b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/blank.gif similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/blank.gif rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/blank.gif diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading.gif b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading.gif similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading.gif rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading.gif diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading@2x.gif b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading@2x.gif similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading@2x.gif rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_loading@2x.gif diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_overlay.png b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_overlay.png similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_overlay.png rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_overlay.png diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite.png b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite.png similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite.png rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite.png diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite@2x.png b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite@2x.png similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite@2x.png rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/fancybox_sprite@2x.png diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/fancybox_buttons.png b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/fancybox_buttons.png similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/fancybox_buttons.png rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/fancybox_buttons.png diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.css b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.css similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.css rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.css diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.pack.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.pack.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.pack.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/fancybox/jquery.fancybox.pack.js diff --git a/test/dev/fixtures/07-hexo-node/themes/landscape/source/js/script.js b/packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/js/script.js similarity index 100% rename from test/dev/fixtures/07-hexo-node/themes/landscape/source/js/script.js rename to packages/now-cli/test/dev/fixtures/07-hexo-node/themes/landscape/source/js/script.js diff --git a/test/dev/fixtures/08-hugo/LICENSE b/packages/now-cli/test/dev/fixtures/08-hugo/LICENSE similarity index 100% rename from test/dev/fixtures/08-hugo/LICENSE rename to packages/now-cli/test/dev/fixtures/08-hugo/LICENSE diff --git a/test/dev/fixtures/08-hugo/README.md b/packages/now-cli/test/dev/fixtures/08-hugo/README.md similarity index 100% rename from test/dev/fixtures/08-hugo/README.md rename to packages/now-cli/test/dev/fixtures/08-hugo/README.md diff --git a/test/dev/fixtures/08-hugo/archetypes/default.md b/packages/now-cli/test/dev/fixtures/08-hugo/archetypes/default.md similarity index 100% rename from test/dev/fixtures/08-hugo/archetypes/default.md rename to packages/now-cli/test/dev/fixtures/08-hugo/archetypes/default.md diff --git a/test/dev/fixtures/08-hugo/config.toml b/packages/now-cli/test/dev/fixtures/08-hugo/config.toml similarity index 100% rename from test/dev/fixtures/08-hugo/config.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/config.toml diff --git a/test/dev/fixtures/08-hugo/content/posts/my-first-post.md b/packages/now-cli/test/dev/fixtures/08-hugo/content/posts/my-first-post.md similarity index 100% rename from test/dev/fixtures/08-hugo/content/posts/my-first-post.md rename to packages/now-cli/test/dev/fixtures/08-hugo/content/posts/my-first-post.md diff --git a/test/dev/fixtures/08-hugo/package.json b/packages/now-cli/test/dev/fixtures/08-hugo/package.json similarity index 100% rename from test/dev/fixtures/08-hugo/package.json rename to packages/now-cli/test/dev/fixtures/08-hugo/package.json diff --git a/test/dev/fixtures/08-hugo/themes/ananke/.gitignore b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/.gitignore similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/.gitignore rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/.gitignore diff --git a/test/dev/fixtures/08-hugo/themes/ananke/CHANGELOG.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/CHANGELOG.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/CHANGELOG.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/CHANGELOG.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/LICENSE.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/LICENSE.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/LICENSE.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/LICENSE.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/README.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/README.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/README.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/README.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/archetypes/default.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/archetypes/default.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/archetypes/default.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/archetypes/default.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/data/webpack_assets.json b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/data/webpack_assets.json similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/data/webpack_assets.json rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/data/webpack_assets.json diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/config.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/config.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/config.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/config.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/_index.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/_index.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/_index.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/_index.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/about/_index.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/about/_index.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/about/_index.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/about/_index.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/contact.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/contact.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/contact.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/contact.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/_index.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/_index.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/_index.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/_index.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-1.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-1.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-1.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-1.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-2.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-2.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-2.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-2.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-3.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-3.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-3.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-3.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-4.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-4.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-4.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-4.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-5.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-5.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-5.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-5.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-6.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-6.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-6.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/content/post/chapter-6.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Pope-Edouard-de-Beaumont-1844.jpg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Pope-Edouard-de-Beaumont-1844.jpg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Pope-Edouard-de-Beaumont-1844.jpg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Pope-Edouard-de-Beaumont-1844.jpg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Victor_Hugo-Hunchback.jpg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Victor_Hugo-Hunchback.jpg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Victor_Hugo-Hunchback.jpg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/Victor_Hugo-Hunchback.jpg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/esmeralda.jpg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/esmeralda.jpg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/esmeralda.jpg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/esmeralda.jpg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/notebook.jpg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/notebook.jpg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/notebook.jpg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/exampleSite/static/images/notebook.jpg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/de.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/de.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/de.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/de.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/en.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/en.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/en.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/en.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/es.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/es.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/es.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/es.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/fr.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/fr.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/fr.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/fr.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/nl.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/nl.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/nl.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/nl.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/pt.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/pt.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/pt.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/pt.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/ru.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/ru.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/ru.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/ru.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/i18n/zh.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/zh.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/i18n/zh.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/i18n/zh.toml diff --git a/test/dev/fixtures/08-hugo/themes/ananke/images/screenshot.png b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/images/screenshot.png similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/images/screenshot.png rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/images/screenshot.png diff --git a/test/dev/fixtures/08-hugo/themes/ananke/images/tn.png b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/images/tn.png similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/images/tn.png rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/images/tn.png diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/404.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/404.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/404.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/404.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/baseof.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/baseof.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/baseof.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/baseof.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/list.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/list.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/list.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/list.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/single.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/single.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/single.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/single.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/taxonomy.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/taxonomy.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/taxonomy.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/taxonomy.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/terms.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/terms.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/terms.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/_default/terms.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/index.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/index.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/index.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/index.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/page/single.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/page/single.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/page/single.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/page/single.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/commento.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/commento.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/commento.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/commento.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/i18nlist.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/i18nlist.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/i18nlist.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/i18nlist.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/menu-contextual.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/menu-contextual.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/menu-contextual.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/menu-contextual.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/new-window-icon.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/new-window-icon.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/new-window-icon.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/new-window-icon.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/page-header.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/page-header.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/page-header.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/page-header.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-favicon.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-favicon.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-favicon.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-favicon.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-footer.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-footer.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-footer.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-footer.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-header.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-header.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-header.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-header.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-navigation.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-navigation.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-navigation.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-navigation.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-scripts.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-scripts.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-scripts.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/site-scripts.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/social-follow.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/social-follow.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/social-follow.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/social-follow.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary-with-image.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary-with-image.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary-with-image.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary-with-image.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/summary.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/facebook.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/facebook.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/facebook.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/facebook.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/github.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/github.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/github.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/github.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/gitlab.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/gitlab.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/gitlab.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/gitlab.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/instagram.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/instagram.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/instagram.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/instagram.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/linkedin.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/linkedin.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/linkedin.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/linkedin.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/mastodon.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/mastodon.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/mastodon.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/mastodon.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/medium.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/medium.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/medium.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/medium.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/new-window.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/new-window.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/new-window.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/new-window.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/twitter.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/twitter.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/twitter.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/twitter.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/youtube.svg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/youtube.svg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/youtube.svg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/svg/youtube.svg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/tags.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/tags.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/tags.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/partials/tags.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/list.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/list.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/post/list.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/list.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary-with-image.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary-with-image.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary-with-image.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary-with-image.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/post/summary.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/robots.txt b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/robots.txt similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/robots.txt rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/robots.txt diff --git a/test/dev/fixtures/08-hugo/themes/ananke/layouts/shortcodes/form-contact.html b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/shortcodes/form-contact.html similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/layouts/shortcodes/form-contact.html rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/layouts/shortcodes/form-contact.html diff --git a/test/dev/fixtures/08-hugo/themes/ananke/package.json b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/package.json similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/package.json rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/package.json diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/_code.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_code.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/_code.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_code.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/_hugo-internal-templates.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_hugo-internal-templates.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/_hugo-internal-templates.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_hugo-internal-templates.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/_social-icons.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_social-icons.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/_social-icons.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_social-icons.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/_styles.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_styles.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/_styles.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_styles.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/_tachyons.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_tachyons.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/_tachyons.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/_tachyons.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/main.css b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/main.css similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/main.css rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/main.css diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/css/postcss.config.js b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/postcss.config.js similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/css/postcss.config.js rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/css/postcss.config.js diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/js/main.js b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/js/main.js similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/js/main.js rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/js/main.js diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/package.json b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/package.json similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/package.json rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/package.json diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/readme.md b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/readme.md similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/readme.md rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/readme.md diff --git a/test/dev/fixtures/08-hugo/themes/ananke/src/webpack.config.js b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/webpack.config.js similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/src/webpack.config.js rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/src/webpack.config.js diff --git a/test/dev/fixtures/08-hugo/themes/ananke/static/images/gohugo-default-sample-hero-image.jpg b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/static/images/gohugo-default-sample-hero-image.jpg similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/static/images/gohugo-default-sample-hero-image.jpg rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/static/images/gohugo-default-sample-hero-image.jpg diff --git a/test/dev/fixtures/08-hugo/themes/ananke/theme.toml b/packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/theme.toml similarity index 100% rename from test/dev/fixtures/08-hugo/themes/ananke/theme.toml rename to packages/now-cli/test/dev/fixtures/08-hugo/themes/ananke/theme.toml diff --git a/test/dev/fixtures/10-nextjs-node/.gitignore b/packages/now-cli/test/dev/fixtures/10-nextjs-node/.gitignore similarity index 100% rename from test/dev/fixtures/10-nextjs-node/.gitignore rename to packages/now-cli/test/dev/fixtures/10-nextjs-node/.gitignore diff --git a/test/dev/fixtures/10-nextjs-node/.nowignore b/packages/now-cli/test/dev/fixtures/10-nextjs-node/.nowignore similarity index 100% rename from test/dev/fixtures/10-nextjs-node/.nowignore rename to packages/now-cli/test/dev/fixtures/10-nextjs-node/.nowignore diff --git a/test/dev/fixtures/10-nextjs-node/api/date.js b/packages/now-cli/test/dev/fixtures/10-nextjs-node/api/date.js similarity index 100% rename from test/dev/fixtures/10-nextjs-node/api/date.js rename to packages/now-cli/test/dev/fixtures/10-nextjs-node/api/date.js diff --git a/test/dev/fixtures/10-nextjs-node/package.json b/packages/now-cli/test/dev/fixtures/10-nextjs-node/package.json similarity index 100% rename from test/dev/fixtures/10-nextjs-node/package.json rename to packages/now-cli/test/dev/fixtures/10-nextjs-node/package.json diff --git a/test/dev/fixtures/10-nextjs-node/pages/index.js b/packages/now-cli/test/dev/fixtures/10-nextjs-node/pages/index.js similarity index 100% rename from test/dev/fixtures/10-nextjs-node/pages/index.js rename to packages/now-cli/test/dev/fixtures/10-nextjs-node/pages/index.js diff --git a/test/dev/fixtures/11-nuxtjs-node/.gitignore b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/.gitignore similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/.gitignore rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/.gitignore diff --git a/test/dev/fixtures/11-nuxtjs-node/.nowignore b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/.nowignore similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/.nowignore rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/.nowignore diff --git a/test/dev/fixtures/11-nuxtjs-node/api/date.js b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/api/date.js similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/api/date.js rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/api/date.js diff --git a/test/dev/fixtures/11-nuxtjs-node/nuxt.config.js b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/nuxt.config.js similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/nuxt.config.js rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/nuxt.config.js diff --git a/test/dev/fixtures/11-nuxtjs-node/package.json b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/package.json similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/package.json rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/package.json diff --git a/test/dev/fixtures/11-nuxtjs-node/pages/index.vue b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/pages/index.vue similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/pages/index.vue rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/pages/index.vue diff --git a/test/dev/fixtures/11-nuxtjs-node/static/favicon.ico b/packages/now-cli/test/dev/fixtures/11-nuxtjs-node/static/favicon.ico similarity index 100% rename from test/dev/fixtures/11-nuxtjs-node/static/favicon.ico rename to packages/now-cli/test/dev/fixtures/11-nuxtjs-node/static/favicon.ico diff --git a/test/dev/fixtures/12-polymer-node/.gitignore b/packages/now-cli/test/dev/fixtures/12-polymer-node/.gitignore similarity index 100% rename from test/dev/fixtures/12-polymer-node/.gitignore rename to packages/now-cli/test/dev/fixtures/12-polymer-node/.gitignore diff --git a/test/dev/fixtures/12-polymer-node/.nowignore b/packages/now-cli/test/dev/fixtures/12-polymer-node/.nowignore similarity index 100% rename from test/dev/fixtures/12-polymer-node/.nowignore rename to packages/now-cli/test/dev/fixtures/12-polymer-node/.nowignore diff --git a/test/dev/fixtures/12-polymer-node/api/date.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/api/date.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/api/date.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/api/date.js diff --git a/test/dev/fixtures/12-polymer-node/images/favicon.ico b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/favicon.ico similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/favicon.ico rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/favicon.ico diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-144x144.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-144x144.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-144x144.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-144x144.png diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-192x192.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-192x192.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-192x192.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-192x192.png diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-48x48.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-48x48.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-48x48.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-48x48.png diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-512x512.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-512x512.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-512x512.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-512x512.png diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-72x72.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-72x72.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-72x72.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-72x72.png diff --git a/test/dev/fixtures/12-polymer-node/images/manifest/icon-96x96.png b/packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-96x96.png similarity index 100% rename from test/dev/fixtures/12-polymer-node/images/manifest/icon-96x96.png rename to packages/now-cli/test/dev/fixtures/12-polymer-node/images/manifest/icon-96x96.png diff --git a/test/dev/fixtures/12-polymer-node/index.html b/packages/now-cli/test/dev/fixtures/12-polymer-node/index.html similarity index 100% rename from test/dev/fixtures/12-polymer-node/index.html rename to packages/now-cli/test/dev/fixtures/12-polymer-node/index.html diff --git a/test/dev/fixtures/12-polymer-node/manifest.json b/packages/now-cli/test/dev/fixtures/12-polymer-node/manifest.json similarity index 100% rename from test/dev/fixtures/12-polymer-node/manifest.json rename to packages/now-cli/test/dev/fixtures/12-polymer-node/manifest.json diff --git a/test/dev/fixtures/12-polymer-node/package.json b/packages/now-cli/test/dev/fixtures/12-polymer-node/package.json similarity index 100% rename from test/dev/fixtures/12-polymer-node/package.json rename to packages/now-cli/test/dev/fixtures/12-polymer-node/package.json diff --git a/test/dev/fixtures/12-polymer-node/polymer.json b/packages/now-cli/test/dev/fixtures/12-polymer-node/polymer.json similarity index 100% rename from test/dev/fixtures/12-polymer-node/polymer.json rename to packages/now-cli/test/dev/fixtures/12-polymer-node/polymer.json diff --git a/test/dev/fixtures/12-polymer-node/service-worker.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/service-worker.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/service-worker.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/service-worker.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-app.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-app.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-app.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-app.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-icons.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-icons.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-icons.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-icons.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-view1.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view1.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-view1.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view1.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-view2.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view2.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-view2.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view2.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-view3.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view3.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-view3.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view3.js diff --git a/test/dev/fixtures/12-polymer-node/src/my-view404.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view404.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/my-view404.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/my-view404.js diff --git a/test/dev/fixtures/12-polymer-node/src/shared-styles.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/src/shared-styles.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/src/shared-styles.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/src/shared-styles.js diff --git a/test/dev/fixtures/12-polymer-node/sw-precache-config.js b/packages/now-cli/test/dev/fixtures/12-polymer-node/sw-precache-config.js similarity index 100% rename from test/dev/fixtures/12-polymer-node/sw-precache-config.js rename to packages/now-cli/test/dev/fixtures/12-polymer-node/sw-precache-config.js diff --git a/test/dev/fixtures/12-polymer-node/test/index.html b/packages/now-cli/test/dev/fixtures/12-polymer-node/test/index.html similarity index 100% rename from test/dev/fixtures/12-polymer-node/test/index.html rename to packages/now-cli/test/dev/fixtures/12-polymer-node/test/index.html diff --git a/test/dev/fixtures/12-polymer-node/test/my-view1.html b/packages/now-cli/test/dev/fixtures/12-polymer-node/test/my-view1.html similarity index 100% rename from test/dev/fixtures/12-polymer-node/test/my-view1.html rename to packages/now-cli/test/dev/fixtures/12-polymer-node/test/my-view1.html diff --git a/test/dev/fixtures/13-preact-node/.babelrc b/packages/now-cli/test/dev/fixtures/13-preact-node/.babelrc similarity index 100% rename from test/dev/fixtures/13-preact-node/.babelrc rename to packages/now-cli/test/dev/fixtures/13-preact-node/.babelrc diff --git a/test/dev/fixtures/13-preact-node/.gitignore b/packages/now-cli/test/dev/fixtures/13-preact-node/.gitignore similarity index 100% rename from test/dev/fixtures/13-preact-node/.gitignore rename to packages/now-cli/test/dev/fixtures/13-preact-node/.gitignore diff --git a/test/dev/fixtures/13-preact-node/.nowignore b/packages/now-cli/test/dev/fixtures/13-preact-node/.nowignore similarity index 100% rename from test/dev/fixtures/13-preact-node/.nowignore rename to packages/now-cli/test/dev/fixtures/13-preact-node/.nowignore diff --git a/test/dev/fixtures/13-preact-node/api/date.js b/packages/now-cli/test/dev/fixtures/13-preact-node/api/date.js similarity index 100% rename from test/dev/fixtures/13-preact-node/api/date.js rename to packages/now-cli/test/dev/fixtures/13-preact-node/api/date.js diff --git a/test/dev/fixtures/13-preact-node/package.json b/packages/now-cli/test/dev/fixtures/13-preact-node/package.json similarity index 100% rename from test/dev/fixtures/13-preact-node/package.json rename to packages/now-cli/test/dev/fixtures/13-preact-node/package.json diff --git a/test/dev/fixtures/13-preact-node/src/assets/favicon.ico b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/favicon.ico similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/favicon.ico rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/favicon.ico diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-192x192.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-192x192.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-192x192.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-192x192.png diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-512x512.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-512x512.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-512x512.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/android-chrome-512x512.png diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/apple-touch-icon.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/apple-touch-icon.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/apple-touch-icon.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/apple-touch-icon.png diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-16x16.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-16x16.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/favicon-16x16.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-16x16.png diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-32x32.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-32x32.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/favicon-32x32.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/favicon-32x32.png diff --git a/test/dev/fixtures/13-preact-node/src/assets/icons/mstile-150x150.png b/packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/mstile-150x150.png similarity index 100% rename from test/dev/fixtures/13-preact-node/src/assets/icons/mstile-150x150.png rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/assets/icons/mstile-150x150.png diff --git a/test/dev/fixtures/13-preact-node/src/components/app.js b/packages/now-cli/test/dev/fixtures/13-preact-node/src/components/app.js similarity index 100% rename from test/dev/fixtures/13-preact-node/src/components/app.js rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/components/app.js diff --git a/test/dev/fixtures/13-preact-node/src/index.js b/packages/now-cli/test/dev/fixtures/13-preact-node/src/index.js similarity index 100% rename from test/dev/fixtures/13-preact-node/src/index.js rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/index.js diff --git a/test/dev/fixtures/13-preact-node/src/manifest.json b/packages/now-cli/test/dev/fixtures/13-preact-node/src/manifest.json similarity index 100% rename from test/dev/fixtures/13-preact-node/src/manifest.json rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/manifest.json diff --git a/test/dev/fixtures/13-preact-node/src/routes/home/index.js b/packages/now-cli/test/dev/fixtures/13-preact-node/src/routes/home/index.js similarity index 100% rename from test/dev/fixtures/13-preact-node/src/routes/home/index.js rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/routes/home/index.js diff --git a/test/dev/fixtures/13-preact-node/src/routes/home/style.css b/packages/now-cli/test/dev/fixtures/13-preact-node/src/routes/home/style.css similarity index 100% rename from test/dev/fixtures/13-preact-node/src/routes/home/style.css rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/routes/home/style.css diff --git a/test/dev/fixtures/13-preact-node/src/style/index.css b/packages/now-cli/test/dev/fixtures/13-preact-node/src/style/index.css similarity index 100% rename from test/dev/fixtures/13-preact-node/src/style/index.css rename to packages/now-cli/test/dev/fixtures/13-preact-node/src/style/index.css diff --git a/test/dev/fixtures/14-svelte-node/.gitignore b/packages/now-cli/test/dev/fixtures/14-svelte-node/.gitignore similarity index 100% rename from test/dev/fixtures/14-svelte-node/.gitignore rename to packages/now-cli/test/dev/fixtures/14-svelte-node/.gitignore diff --git a/test/dev/fixtures/14-svelte-node/.nowignore b/packages/now-cli/test/dev/fixtures/14-svelte-node/.nowignore similarity index 100% rename from test/dev/fixtures/14-svelte-node/.nowignore rename to packages/now-cli/test/dev/fixtures/14-svelte-node/.nowignore diff --git a/test/dev/fixtures/14-svelte-node/api/date.js b/packages/now-cli/test/dev/fixtures/14-svelte-node/api/date.js similarity index 100% rename from test/dev/fixtures/14-svelte-node/api/date.js rename to packages/now-cli/test/dev/fixtures/14-svelte-node/api/date.js diff --git a/test/dev/fixtures/14-svelte-node/package.json b/packages/now-cli/test/dev/fixtures/14-svelte-node/package.json similarity index 100% rename from test/dev/fixtures/14-svelte-node/package.json rename to packages/now-cli/test/dev/fixtures/14-svelte-node/package.json diff --git a/test/dev/fixtures/14-svelte-node/public/favicon.png b/packages/now-cli/test/dev/fixtures/14-svelte-node/public/favicon.png similarity index 100% rename from test/dev/fixtures/14-svelte-node/public/favicon.png rename to packages/now-cli/test/dev/fixtures/14-svelte-node/public/favicon.png diff --git a/test/dev/fixtures/14-svelte-node/public/global.css b/packages/now-cli/test/dev/fixtures/14-svelte-node/public/global.css similarity index 100% rename from test/dev/fixtures/14-svelte-node/public/global.css rename to packages/now-cli/test/dev/fixtures/14-svelte-node/public/global.css diff --git a/test/dev/fixtures/14-svelte-node/public/index.html b/packages/now-cli/test/dev/fixtures/14-svelte-node/public/index.html similarity index 100% rename from test/dev/fixtures/14-svelte-node/public/index.html rename to packages/now-cli/test/dev/fixtures/14-svelte-node/public/index.html diff --git a/test/dev/fixtures/14-svelte-node/rollup.config.js b/packages/now-cli/test/dev/fixtures/14-svelte-node/rollup.config.js similarity index 100% rename from test/dev/fixtures/14-svelte-node/rollup.config.js rename to packages/now-cli/test/dev/fixtures/14-svelte-node/rollup.config.js diff --git a/test/dev/fixtures/14-svelte-node/src/App.svelte b/packages/now-cli/test/dev/fixtures/14-svelte-node/src/App.svelte similarity index 100% rename from test/dev/fixtures/14-svelte-node/src/App.svelte rename to packages/now-cli/test/dev/fixtures/14-svelte-node/src/App.svelte diff --git a/test/dev/fixtures/14-svelte-node/src/main.js b/packages/now-cli/test/dev/fixtures/14-svelte-node/src/main.js similarity index 100% rename from test/dev/fixtures/14-svelte-node/src/main.js rename to packages/now-cli/test/dev/fixtures/14-svelte-node/src/main.js diff --git a/test/dev/fixtures/15-umijs-node/.env b/packages/now-cli/test/dev/fixtures/15-umijs-node/.env similarity index 100% rename from test/dev/fixtures/15-umijs-node/.env rename to packages/now-cli/test/dev/fixtures/15-umijs-node/.env diff --git a/test/dev/fixtures/15-umijs-node/.gitignore b/packages/now-cli/test/dev/fixtures/15-umijs-node/.gitignore similarity index 100% rename from test/dev/fixtures/15-umijs-node/.gitignore rename to packages/now-cli/test/dev/fixtures/15-umijs-node/.gitignore diff --git a/test/dev/fixtures/15-umijs-node/.nowignore b/packages/now-cli/test/dev/fixtures/15-umijs-node/.nowignore similarity index 100% rename from test/dev/fixtures/15-umijs-node/.nowignore rename to packages/now-cli/test/dev/fixtures/15-umijs-node/.nowignore diff --git a/test/dev/fixtures/15-umijs-node/.umirc.ts b/packages/now-cli/test/dev/fixtures/15-umijs-node/.umirc.ts similarity index 100% rename from test/dev/fixtures/15-umijs-node/.umirc.ts rename to packages/now-cli/test/dev/fixtures/15-umijs-node/.umirc.ts diff --git a/test/dev/fixtures/15-umijs-node/api/date.js b/packages/now-cli/test/dev/fixtures/15-umijs-node/api/date.js similarity index 100% rename from test/dev/fixtures/15-umijs-node/api/date.js rename to packages/now-cli/test/dev/fixtures/15-umijs-node/api/date.js diff --git a/test/dev/fixtures/15-umijs-node/package.json b/packages/now-cli/test/dev/fixtures/15-umijs-node/package.json similarity index 100% rename from test/dev/fixtures/15-umijs-node/package.json rename to packages/now-cli/test/dev/fixtures/15-umijs-node/package.json diff --git a/test/dev/fixtures/15-umijs-node/src/global.css b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/global.css similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/global.css rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/global.css diff --git a/test/dev/fixtures/15-umijs-node/src/pages/404.tsx b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/404.tsx similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/404.tsx rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/404.tsx diff --git a/test/dev/fixtures/15-umijs-node/src/pages/document.ejs b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/document.ejs similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/document.ejs rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/document.ejs diff --git a/test/dev/fixtures/15-umijs-node/src/pages/form.tsx b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/form.tsx similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/form.tsx rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/form.tsx diff --git a/test/dev/fixtures/15-umijs-node/src/pages/index.tsx b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/index.tsx similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/index.tsx rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/index.tsx diff --git a/test/dev/fixtures/15-umijs-node/src/pages/layout.tsx b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/layout.tsx similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/layout.tsx rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/layout.tsx diff --git a/test/dev/fixtures/15-umijs-node/src/pages/table.tsx b/packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/table.tsx similarity index 100% rename from test/dev/fixtures/15-umijs-node/src/pages/table.tsx rename to packages/now-cli/test/dev/fixtures/15-umijs-node/src/pages/table.tsx diff --git a/test/dev/fixtures/15-umijs-node/tsconfig.json b/packages/now-cli/test/dev/fixtures/15-umijs-node/tsconfig.json similarity index 100% rename from test/dev/fixtures/15-umijs-node/tsconfig.json rename to packages/now-cli/test/dev/fixtures/15-umijs-node/tsconfig.json diff --git a/test/dev/fixtures/15-umijs-node/typings.d.ts b/packages/now-cli/test/dev/fixtures/15-umijs-node/typings.d.ts similarity index 100% rename from test/dev/fixtures/15-umijs-node/typings.d.ts rename to packages/now-cli/test/dev/fixtures/15-umijs-node/typings.d.ts diff --git a/test/dev/fixtures/16-vue-node/.gitignore b/packages/now-cli/test/dev/fixtures/16-vue-node/.gitignore similarity index 100% rename from test/dev/fixtures/16-vue-node/.gitignore rename to packages/now-cli/test/dev/fixtures/16-vue-node/.gitignore diff --git a/test/dev/fixtures/16-vue-node/.nowignore b/packages/now-cli/test/dev/fixtures/16-vue-node/.nowignore similarity index 100% rename from test/dev/fixtures/16-vue-node/.nowignore rename to packages/now-cli/test/dev/fixtures/16-vue-node/.nowignore diff --git a/test/dev/fixtures/16-vue-node/api/date.js b/packages/now-cli/test/dev/fixtures/16-vue-node/api/date.js similarity index 100% rename from test/dev/fixtures/16-vue-node/api/date.js rename to packages/now-cli/test/dev/fixtures/16-vue-node/api/date.js diff --git a/test/dev/fixtures/16-vue-node/babel.config.js b/packages/now-cli/test/dev/fixtures/16-vue-node/babel.config.js similarity index 100% rename from test/dev/fixtures/16-vue-node/babel.config.js rename to packages/now-cli/test/dev/fixtures/16-vue-node/babel.config.js diff --git a/test/dev/fixtures/16-vue-node/package.json b/packages/now-cli/test/dev/fixtures/16-vue-node/package.json similarity index 100% rename from test/dev/fixtures/16-vue-node/package.json rename to packages/now-cli/test/dev/fixtures/16-vue-node/package.json diff --git a/test/dev/fixtures/16-vue-node/public/favicon.ico b/packages/now-cli/test/dev/fixtures/16-vue-node/public/favicon.ico similarity index 100% rename from test/dev/fixtures/16-vue-node/public/favicon.ico rename to packages/now-cli/test/dev/fixtures/16-vue-node/public/favicon.ico diff --git a/test/dev/fixtures/16-vue-node/public/index.html b/packages/now-cli/test/dev/fixtures/16-vue-node/public/index.html similarity index 100% rename from test/dev/fixtures/16-vue-node/public/index.html rename to packages/now-cli/test/dev/fixtures/16-vue-node/public/index.html diff --git a/test/dev/fixtures/16-vue-node/src/App.vue b/packages/now-cli/test/dev/fixtures/16-vue-node/src/App.vue similarity index 100% rename from test/dev/fixtures/16-vue-node/src/App.vue rename to packages/now-cli/test/dev/fixtures/16-vue-node/src/App.vue diff --git a/test/dev/fixtures/16-vue-node/src/main.js b/packages/now-cli/test/dev/fixtures/16-vue-node/src/main.js similarity index 100% rename from test/dev/fixtures/16-vue-node/src/main.js rename to packages/now-cli/test/dev/fixtures/16-vue-node/src/main.js diff --git a/test/dev/fixtures/17-vuepress-node/.gitignore b/packages/now-cli/test/dev/fixtures/17-vuepress-node/.gitignore similarity index 100% rename from test/dev/fixtures/17-vuepress-node/.gitignore rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/.gitignore diff --git a/test/dev/fixtures/17-vuepress-node/.nowignore b/packages/now-cli/test/dev/fixtures/17-vuepress-node/.nowignore similarity index 100% rename from test/dev/fixtures/17-vuepress-node/.nowignore rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/.nowignore diff --git a/test/dev/fixtures/17-vuepress-node/api/date.js b/packages/now-cli/test/dev/fixtures/17-vuepress-node/api/date.js similarity index 100% rename from test/dev/fixtures/17-vuepress-node/api/date.js rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/api/date.js diff --git a/test/dev/fixtures/17-vuepress-node/babel.config.js b/packages/now-cli/test/dev/fixtures/17-vuepress-node/babel.config.js similarity index 100% rename from test/dev/fixtures/17-vuepress-node/babel.config.js rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/babel.config.js diff --git a/test/dev/fixtures/17-vuepress-node/package.json b/packages/now-cli/test/dev/fixtures/17-vuepress-node/package.json similarity index 100% rename from test/dev/fixtures/17-vuepress-node/package.json rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/package.json diff --git a/test/dev/fixtures/17-vuepress-node/public/favicon.ico b/packages/now-cli/test/dev/fixtures/17-vuepress-node/public/favicon.ico similarity index 100% rename from test/dev/fixtures/17-vuepress-node/public/favicon.ico rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/public/favicon.ico diff --git a/test/dev/fixtures/17-vuepress-node/public/index.html b/packages/now-cli/test/dev/fixtures/17-vuepress-node/public/index.html similarity index 100% rename from test/dev/fixtures/17-vuepress-node/public/index.html rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/public/index.html diff --git a/test/dev/fixtures/17-vuepress-node/src/App.vue b/packages/now-cli/test/dev/fixtures/17-vuepress-node/src/App.vue similarity index 100% rename from test/dev/fixtures/17-vuepress-node/src/App.vue rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/src/App.vue diff --git a/test/dev/fixtures/17-vuepress-node/src/main.js b/packages/now-cli/test/dev/fixtures/17-vuepress-node/src/main.js similarity index 100% rename from test/dev/fixtures/17-vuepress-node/src/main.js rename to packages/now-cli/test/dev/fixtures/17-vuepress-node/src/main.js diff --git a/test/dev/fixtures/18-marko/.editorconfig b/packages/now-cli/test/dev/fixtures/18-marko/.editorconfig similarity index 100% rename from test/dev/fixtures/18-marko/.editorconfig rename to packages/now-cli/test/dev/fixtures/18-marko/.editorconfig diff --git a/test/dev/fixtures/18-marko/.eslintignore b/packages/now-cli/test/dev/fixtures/18-marko/.eslintignore similarity index 100% rename from test/dev/fixtures/18-marko/.eslintignore rename to packages/now-cli/test/dev/fixtures/18-marko/.eslintignore diff --git a/test/dev/fixtures/18-marko/.eslintrc.json b/packages/now-cli/test/dev/fixtures/18-marko/.eslintrc.json similarity index 100% rename from test/dev/fixtures/18-marko/.eslintrc.json rename to packages/now-cli/test/dev/fixtures/18-marko/.eslintrc.json diff --git a/test/dev/fixtures/18-marko/.gitignore b/packages/now-cli/test/dev/fixtures/18-marko/.gitignore similarity index 100% rename from test/dev/fixtures/18-marko/.gitignore rename to packages/now-cli/test/dev/fixtures/18-marko/.gitignore diff --git a/test/dev/fixtures/18-marko/.nowignore b/packages/now-cli/test/dev/fixtures/18-marko/.nowignore similarity index 100% rename from test/dev/fixtures/18-marko/.nowignore rename to packages/now-cli/test/dev/fixtures/18-marko/.nowignore diff --git a/test/dev/fixtures/18-marko/.prettierignore b/packages/now-cli/test/dev/fixtures/18-marko/.prettierignore similarity index 100% rename from test/dev/fixtures/18-marko/.prettierignore rename to packages/now-cli/test/dev/fixtures/18-marko/.prettierignore diff --git a/test/dev/fixtures/18-marko/README.md b/packages/now-cli/test/dev/fixtures/18-marko/README.md similarity index 100% rename from test/dev/fixtures/18-marko/README.md rename to packages/now-cli/test/dev/fixtures/18-marko/README.md diff --git a/test/dev/fixtures/18-marko/package.json b/packages/now-cli/test/dev/fixtures/18-marko/package.json similarity index 100% rename from test/dev/fixtures/18-marko/package.json rename to packages/now-cli/test/dev/fixtures/18-marko/package.json diff --git a/test/dev/fixtures/18-marko/project.js b/packages/now-cli/test/dev/fixtures/18-marko/project.js similarity index 100% rename from test/dev/fixtures/18-marko/project.js rename to packages/now-cli/test/dev/fixtures/18-marko/project.js diff --git a/test/dev/fixtures/18-marko/server.js b/packages/now-cli/test/dev/fixtures/18-marko/server.js similarity index 100% rename from test/dev/fixtures/18-marko/server.js rename to packages/now-cli/test/dev/fixtures/18-marko/server.js diff --git a/test/dev/fixtures/18-marko/src/components/click-count/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/components/click-count/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/components/click-count/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/components/click-count/index.marko diff --git a/test/dev/fixtures/18-marko/src/components/site-layout/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/components/site-layout/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/index.marko diff --git a/test/dev/fixtures/18-marko/src/components/site-layout/logo.png b/packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/logo.png similarity index 100% rename from test/dev/fixtures/18-marko/src/components/site-layout/logo.png rename to packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/logo.png diff --git a/test/dev/fixtures/18-marko/src/components/site-layout/style.css b/packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/style.css similarity index 100% rename from test/dev/fixtures/18-marko/src/components/site-layout/style.css rename to packages/now-cli/test/dev/fixtures/18-marko/src/components/site-layout/style.css diff --git a/test/dev/fixtures/18-marko/src/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/index.marko diff --git a/test/dev/fixtures/18-marko/src/routes/hello/components/stop-watch/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/components/stop-watch/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/routes/hello/components/stop-watch/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/components/stop-watch/index.marko diff --git a/test/dev/fixtures/18-marko/src/routes/hello/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/routes/hello/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/index.marko diff --git a/test/dev/fixtures/18-marko/src/routes/hello/route.js b/packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/route.js similarity index 100% rename from test/dev/fixtures/18-marko/src/routes/hello/route.js rename to packages/now-cli/test/dev/fixtures/18-marko/src/routes/hello/route.js diff --git a/test/dev/fixtures/18-marko/src/routes/layouts/index.marko b/packages/now-cli/test/dev/fixtures/18-marko/src/routes/layouts/index.marko similarity index 100% rename from test/dev/fixtures/18-marko/src/routes/layouts/index.marko rename to packages/now-cli/test/dev/fixtures/18-marko/src/routes/layouts/index.marko diff --git a/test/dev/fixtures/19-mithril/.gitignore b/packages/now-cli/test/dev/fixtures/19-mithril/.gitignore similarity index 100% rename from test/dev/fixtures/19-mithril/.gitignore rename to packages/now-cli/test/dev/fixtures/19-mithril/.gitignore diff --git a/test/dev/fixtures/19-mithril/.nowignore b/packages/now-cli/test/dev/fixtures/19-mithril/.nowignore similarity index 100% rename from test/dev/fixtures/19-mithril/.nowignore rename to packages/now-cli/test/dev/fixtures/19-mithril/.nowignore diff --git a/test/dev/fixtures/19-mithril/README.md b/packages/now-cli/test/dev/fixtures/19-mithril/README.md similarity index 100% rename from test/dev/fixtures/19-mithril/README.md rename to packages/now-cli/test/dev/fixtures/19-mithril/README.md diff --git a/test/dev/fixtures/19-mithril/package.json b/packages/now-cli/test/dev/fixtures/19-mithril/package.json similarity index 100% rename from test/dev/fixtures/19-mithril/package.json rename to packages/now-cli/test/dev/fixtures/19-mithril/package.json diff --git a/test/dev/fixtures/19-mithril/public/index.html b/packages/now-cli/test/dev/fixtures/19-mithril/public/index.html similarity index 100% rename from test/dev/fixtures/19-mithril/public/index.html rename to packages/now-cli/test/dev/fixtures/19-mithril/public/index.html diff --git a/test/dev/fixtures/19-mithril/public/styles.css b/packages/now-cli/test/dev/fixtures/19-mithril/public/styles.css similarity index 100% rename from test/dev/fixtures/19-mithril/public/styles.css rename to packages/now-cli/test/dev/fixtures/19-mithril/public/styles.css diff --git a/test/dev/fixtures/19-mithril/src/index.js b/packages/now-cli/test/dev/fixtures/19-mithril/src/index.js similarity index 100% rename from test/dev/fixtures/19-mithril/src/index.js rename to packages/now-cli/test/dev/fixtures/19-mithril/src/index.js diff --git a/test/dev/fixtures/20-riot/.babelrc b/packages/now-cli/test/dev/fixtures/20-riot/.babelrc similarity index 100% rename from test/dev/fixtures/20-riot/.babelrc rename to packages/now-cli/test/dev/fixtures/20-riot/.babelrc diff --git a/test/dev/fixtures/20-riot/.gitignore b/packages/now-cli/test/dev/fixtures/20-riot/.gitignore similarity index 100% rename from test/dev/fixtures/20-riot/.gitignore rename to packages/now-cli/test/dev/fixtures/20-riot/.gitignore diff --git a/test/dev/fixtures/20-riot/.nowignore b/packages/now-cli/test/dev/fixtures/20-riot/.nowignore similarity index 100% rename from test/dev/fixtures/20-riot/.nowignore rename to packages/now-cli/test/dev/fixtures/20-riot/.nowignore diff --git a/test/dev/fixtures/20-riot/README.md b/packages/now-cli/test/dev/fixtures/20-riot/README.md similarity index 100% rename from test/dev/fixtures/20-riot/README.md rename to packages/now-cli/test/dev/fixtures/20-riot/README.md diff --git a/test/dev/fixtures/20-riot/package.json b/packages/now-cli/test/dev/fixtures/20-riot/package.json similarity index 100% rename from test/dev/fixtures/20-riot/package.json rename to packages/now-cli/test/dev/fixtures/20-riot/package.json diff --git a/test/dev/fixtures/20-riot/public/index.html b/packages/now-cli/test/dev/fixtures/20-riot/public/index.html similarity index 100% rename from test/dev/fixtures/20-riot/public/index.html rename to packages/now-cli/test/dev/fixtures/20-riot/public/index.html diff --git a/test/dev/fixtures/20-riot/public/styles.css b/packages/now-cli/test/dev/fixtures/20-riot/public/styles.css similarity index 100% rename from test/dev/fixtures/20-riot/public/styles.css rename to packages/now-cli/test/dev/fixtures/20-riot/public/styles.css diff --git a/test/dev/fixtures/20-riot/src/logs.riot b/packages/now-cli/test/dev/fixtures/20-riot/src/logs.riot similarity index 100% rename from test/dev/fixtures/20-riot/src/logs.riot rename to packages/now-cli/test/dev/fixtures/20-riot/src/logs.riot diff --git a/test/dev/fixtures/20-riot/src/main.js b/packages/now-cli/test/dev/fixtures/20-riot/src/main.js similarity index 100% rename from test/dev/fixtures/20-riot/src/main.js rename to packages/now-cli/test/dev/fixtures/20-riot/src/main.js diff --git a/test/dev/fixtures/20-riot/src/random.riot b/packages/now-cli/test/dev/fixtures/20-riot/src/random.riot similarity index 100% rename from test/dev/fixtures/20-riot/src/random.riot rename to packages/now-cli/test/dev/fixtures/20-riot/src/random.riot diff --git a/test/dev/fixtures/20-riot/webpack.config.js b/packages/now-cli/test/dev/fixtures/20-riot/webpack.config.js similarity index 100% rename from test/dev/fixtures/20-riot/webpack.config.js rename to packages/now-cli/test/dev/fixtures/20-riot/webpack.config.js diff --git a/test/dev/fixtures/21-charge/.gitignore b/packages/now-cli/test/dev/fixtures/21-charge/.gitignore similarity index 100% rename from test/dev/fixtures/21-charge/.gitignore rename to packages/now-cli/test/dev/fixtures/21-charge/.gitignore diff --git a/test/dev/fixtures/21-charge/.nowignore b/packages/now-cli/test/dev/fixtures/21-charge/.nowignore similarity index 100% rename from test/dev/fixtures/21-charge/.nowignore rename to packages/now-cli/test/dev/fixtures/21-charge/.nowignore diff --git a/test/dev/fixtures/21-charge/README.md b/packages/now-cli/test/dev/fixtures/21-charge/README.md similarity index 100% rename from test/dev/fixtures/21-charge/README.md rename to packages/now-cli/test/dev/fixtures/21-charge/README.md diff --git a/test/dev/fixtures/21-charge/package.json b/packages/now-cli/test/dev/fixtures/21-charge/package.json similarity index 100% rename from test/dev/fixtures/21-charge/package.json rename to packages/now-cli/test/dev/fixtures/21-charge/package.json diff --git a/test/dev/fixtures/21-charge/source/index.html.jsx b/packages/now-cli/test/dev/fixtures/21-charge/source/index.html.jsx similarity index 100% rename from test/dev/fixtures/21-charge/source/index.html.jsx rename to packages/now-cli/test/dev/fixtures/21-charge/source/index.html.jsx diff --git a/test/dev/fixtures/21-charge/source/layout.html.jsx b/packages/now-cli/test/dev/fixtures/21-charge/source/layout.html.jsx similarity index 100% rename from test/dev/fixtures/21-charge/source/layout.html.jsx rename to packages/now-cli/test/dev/fixtures/21-charge/source/layout.html.jsx diff --git a/test/dev/fixtures/21-charge/source/pages/about.html.mdx b/packages/now-cli/test/dev/fixtures/21-charge/source/pages/about.html.mdx similarity index 100% rename from test/dev/fixtures/21-charge/source/pages/about.html.mdx rename to packages/now-cli/test/dev/fixtures/21-charge/source/pages/about.html.mdx diff --git a/test/dev/fixtures/22-brunch/.gitignore b/packages/now-cli/test/dev/fixtures/22-brunch/.gitignore similarity index 100% rename from test/dev/fixtures/22-brunch/.gitignore rename to packages/now-cli/test/dev/fixtures/22-brunch/.gitignore diff --git a/test/dev/fixtures/22-brunch/.nowignore b/packages/now-cli/test/dev/fixtures/22-brunch/.nowignore similarity index 100% rename from test/dev/fixtures/22-brunch/.nowignore rename to packages/now-cli/test/dev/fixtures/22-brunch/.nowignore diff --git a/test/dev/fixtures/22-brunch/README.md b/packages/now-cli/test/dev/fixtures/22-brunch/README.md similarity index 100% rename from test/dev/fixtures/22-brunch/README.md rename to packages/now-cli/test/dev/fixtures/22-brunch/README.md diff --git a/test/dev/fixtures/22-brunch/app/assets/index.html b/packages/now-cli/test/dev/fixtures/22-brunch/app/assets/index.html similarity index 100% rename from test/dev/fixtures/22-brunch/app/assets/index.html rename to packages/now-cli/test/dev/fixtures/22-brunch/app/assets/index.html diff --git a/test/dev/fixtures/22-brunch/app/initialize.js b/packages/now-cli/test/dev/fixtures/22-brunch/app/initialize.js similarity index 100% rename from test/dev/fixtures/22-brunch/app/initialize.js rename to packages/now-cli/test/dev/fixtures/22-brunch/app/initialize.js diff --git a/test/dev/fixtures/22-brunch/app/styles.css b/packages/now-cli/test/dev/fixtures/22-brunch/app/styles.css similarity index 100% rename from test/dev/fixtures/22-brunch/app/styles.css rename to packages/now-cli/test/dev/fixtures/22-brunch/app/styles.css diff --git a/test/dev/fixtures/22-brunch/brunch-config.js b/packages/now-cli/test/dev/fixtures/22-brunch/brunch-config.js similarity index 100% rename from test/dev/fixtures/22-brunch/brunch-config.js rename to packages/now-cli/test/dev/fixtures/22-brunch/brunch-config.js diff --git a/test/dev/fixtures/22-brunch/package.json b/packages/now-cli/test/dev/fixtures/22-brunch/package.json similarity index 100% rename from test/dev/fixtures/22-brunch/package.json rename to packages/now-cli/test/dev/fixtures/22-brunch/package.json diff --git a/test/dev/fixtures/23-docusaurus/.dockerignore b/packages/now-cli/test/dev/fixtures/23-docusaurus/.dockerignore similarity index 100% rename from test/dev/fixtures/23-docusaurus/.dockerignore rename to packages/now-cli/test/dev/fixtures/23-docusaurus/.dockerignore diff --git a/test/dev/fixtures/23-docusaurus/.gitignore b/packages/now-cli/test/dev/fixtures/23-docusaurus/.gitignore similarity index 100% rename from test/dev/fixtures/23-docusaurus/.gitignore rename to packages/now-cli/test/dev/fixtures/23-docusaurus/.gitignore diff --git a/test/dev/fixtures/23-docusaurus/.nowignore b/packages/now-cli/test/dev/fixtures/23-docusaurus/.nowignore similarity index 100% rename from test/dev/fixtures/23-docusaurus/.nowignore rename to packages/now-cli/test/dev/fixtures/23-docusaurus/.nowignore diff --git a/test/dev/fixtures/23-docusaurus/README.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/README.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/README.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/README.md diff --git a/test/dev/fixtures/23-docusaurus/blog/2016-03-11-blog-post.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2016-03-11-blog-post.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/blog/2016-03-11-blog-post.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2016-03-11-blog-post.md diff --git a/test/dev/fixtures/23-docusaurus/blog/2017-04-10-blog-post-two.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-04-10-blog-post-two.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/blog/2017-04-10-blog-post-two.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-04-10-blog-post-two.md diff --git a/test/dev/fixtures/23-docusaurus/blog/2017-09-25-testing-rss.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-09-25-testing-rss.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/blog/2017-09-25-testing-rss.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-09-25-testing-rss.md diff --git a/test/dev/fixtures/23-docusaurus/blog/2017-09-26-adding-rss.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-09-26-adding-rss.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/blog/2017-09-26-adding-rss.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-09-26-adding-rss.md diff --git a/test/dev/fixtures/23-docusaurus/blog/2017-10-24-new-version-1.0.0.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-10-24-new-version-1.0.0.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/blog/2017-10-24-new-version-1.0.0.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/blog/2017-10-24-new-version-1.0.0.md diff --git a/test/dev/fixtures/23-docusaurus/core/Footer.js b/packages/now-cli/test/dev/fixtures/23-docusaurus/core/Footer.js similarity index 100% rename from test/dev/fixtures/23-docusaurus/core/Footer.js rename to packages/now-cli/test/dev/fixtures/23-docusaurus/core/Footer.js diff --git a/test/dev/fixtures/23-docusaurus/docs/doc1.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc1.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/docs/doc1.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc1.md diff --git a/test/dev/fixtures/23-docusaurus/docs/doc2.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc2.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/docs/doc2.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc2.md diff --git a/test/dev/fixtures/23-docusaurus/docs/doc3.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc3.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/docs/doc3.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/docs/doc3.md diff --git a/test/dev/fixtures/23-docusaurus/docs/exampledoc4.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/docs/exampledoc4.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/docs/exampledoc4.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/docs/exampledoc4.md diff --git a/test/dev/fixtures/23-docusaurus/docs/exampledoc5.md b/packages/now-cli/test/dev/fixtures/23-docusaurus/docs/exampledoc5.md similarity index 100% rename from test/dev/fixtures/23-docusaurus/docs/exampledoc5.md rename to packages/now-cli/test/dev/fixtures/23-docusaurus/docs/exampledoc5.md diff --git a/test/dev/fixtures/23-docusaurus/package.json b/packages/now-cli/test/dev/fixtures/23-docusaurus/package.json similarity index 100% rename from test/dev/fixtures/23-docusaurus/package.json rename to packages/now-cli/test/dev/fixtures/23-docusaurus/package.json diff --git a/test/dev/fixtures/23-docusaurus/pages/en/help.js b/packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/help.js similarity index 100% rename from test/dev/fixtures/23-docusaurus/pages/en/help.js rename to packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/help.js diff --git a/test/dev/fixtures/23-docusaurus/pages/en/index.js b/packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/index.js similarity index 100% rename from test/dev/fixtures/23-docusaurus/pages/en/index.js rename to packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/index.js diff --git a/test/dev/fixtures/23-docusaurus/pages/en/users.js b/packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/users.js similarity index 100% rename from test/dev/fixtures/23-docusaurus/pages/en/users.js rename to packages/now-cli/test/dev/fixtures/23-docusaurus/pages/en/users.js diff --git a/test/dev/fixtures/23-docusaurus/sidebars.json b/packages/now-cli/test/dev/fixtures/23-docusaurus/sidebars.json similarity index 100% rename from test/dev/fixtures/23-docusaurus/sidebars.json rename to packages/now-cli/test/dev/fixtures/23-docusaurus/sidebars.json diff --git a/test/dev/fixtures/23-docusaurus/siteConfig.js b/packages/now-cli/test/dev/fixtures/23-docusaurus/siteConfig.js similarity index 100% rename from test/dev/fixtures/23-docusaurus/siteConfig.js rename to packages/now-cli/test/dev/fixtures/23-docusaurus/siteConfig.js diff --git a/test/dev/fixtures/23-docusaurus/static/css/custom.css b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/css/custom.css similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/css/custom.css rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/css/custom.css diff --git a/test/dev/fixtures/23-docusaurus/static/img/favicon.ico b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/favicon.ico similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/favicon.ico rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/favicon.ico diff --git a/test/dev/fixtures/23-docusaurus/static/img/oss_logo.png b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/oss_logo.png similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/oss_logo.png rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/oss_logo.png diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_code_review.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_code_review.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_code_review.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_code_review.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_monitor.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_monitor.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_monitor.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_monitor.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_note_list.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_note_list.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_note_list.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_note_list.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_online.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_online.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_online.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_online.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_open_source.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_open_source.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_open_source.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_open_source.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_operating_system.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_operating_system.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_operating_system.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_operating_system.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_react.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_react.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_react.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_react.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_tweetstorm.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_tweetstorm.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_tweetstorm.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_tweetstorm.svg diff --git a/test/dev/fixtures/23-docusaurus/static/img/undraw_youtube_tutorial.svg b/packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_youtube_tutorial.svg similarity index 100% rename from test/dev/fixtures/23-docusaurus/static/img/undraw_youtube_tutorial.svg rename to packages/now-cli/test/dev/fixtures/23-docusaurus/static/img/undraw_youtube_tutorial.svg diff --git a/test/dev/fixtures/24-ember/.editorconfig b/packages/now-cli/test/dev/fixtures/24-ember/.editorconfig similarity index 100% rename from test/dev/fixtures/24-ember/.editorconfig rename to packages/now-cli/test/dev/fixtures/24-ember/.editorconfig diff --git a/test/dev/fixtures/24-ember/.ember-cli b/packages/now-cli/test/dev/fixtures/24-ember/.ember-cli similarity index 100% rename from test/dev/fixtures/24-ember/.ember-cli rename to packages/now-cli/test/dev/fixtures/24-ember/.ember-cli diff --git a/test/dev/fixtures/24-ember/.eslintignore b/packages/now-cli/test/dev/fixtures/24-ember/.eslintignore similarity index 100% rename from test/dev/fixtures/24-ember/.eslintignore rename to packages/now-cli/test/dev/fixtures/24-ember/.eslintignore diff --git a/test/dev/fixtures/24-ember/.eslintrc.js b/packages/now-cli/test/dev/fixtures/24-ember/.eslintrc.js similarity index 100% rename from test/dev/fixtures/24-ember/.eslintrc.js rename to packages/now-cli/test/dev/fixtures/24-ember/.eslintrc.js diff --git a/test/dev/fixtures/24-ember/.gitignore b/packages/now-cli/test/dev/fixtures/24-ember/.gitignore similarity index 100% rename from test/dev/fixtures/24-ember/.gitignore rename to packages/now-cli/test/dev/fixtures/24-ember/.gitignore diff --git a/test/dev/fixtures/24-ember/.template-lintrc.js b/packages/now-cli/test/dev/fixtures/24-ember/.template-lintrc.js similarity index 100% rename from test/dev/fixtures/24-ember/.template-lintrc.js rename to packages/now-cli/test/dev/fixtures/24-ember/.template-lintrc.js diff --git a/test/dev/fixtures/24-ember/.travis.yml b/packages/now-cli/test/dev/fixtures/24-ember/.travis.yml similarity index 100% rename from test/dev/fixtures/24-ember/.travis.yml rename to packages/now-cli/test/dev/fixtures/24-ember/.travis.yml diff --git a/test/dev/fixtures/24-ember/.watchmanconfig b/packages/now-cli/test/dev/fixtures/24-ember/.watchmanconfig similarity index 100% rename from test/dev/fixtures/24-ember/.watchmanconfig rename to packages/now-cli/test/dev/fixtures/24-ember/.watchmanconfig diff --git a/test/dev/fixtures/24-ember/README.md b/packages/now-cli/test/dev/fixtures/24-ember/README.md similarity index 100% rename from test/dev/fixtures/24-ember/README.md rename to packages/now-cli/test/dev/fixtures/24-ember/README.md diff --git a/test/dev/fixtures/24-ember/app/app.js b/packages/now-cli/test/dev/fixtures/24-ember/app/app.js similarity index 100% rename from test/dev/fixtures/24-ember/app/app.js rename to packages/now-cli/test/dev/fixtures/24-ember/app/app.js diff --git a/test/dev/fixtures/24-ember/app/components/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/components/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/components/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/components/.gitkeep diff --git a/test/dev/fixtures/24-ember/app/controllers/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/controllers/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/controllers/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/controllers/.gitkeep diff --git a/test/dev/fixtures/24-ember/app/helpers/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/helpers/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/helpers/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/helpers/.gitkeep diff --git a/test/dev/fixtures/24-ember/app/index.html b/packages/now-cli/test/dev/fixtures/24-ember/app/index.html similarity index 100% rename from test/dev/fixtures/24-ember/app/index.html rename to packages/now-cli/test/dev/fixtures/24-ember/app/index.html diff --git a/test/dev/fixtures/24-ember/app/models/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/models/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/models/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/models/.gitkeep diff --git a/test/dev/fixtures/24-ember/app/resolver.js b/packages/now-cli/test/dev/fixtures/24-ember/app/resolver.js similarity index 100% rename from test/dev/fixtures/24-ember/app/resolver.js rename to packages/now-cli/test/dev/fixtures/24-ember/app/resolver.js diff --git a/test/dev/fixtures/24-ember/app/router.js b/packages/now-cli/test/dev/fixtures/24-ember/app/router.js similarity index 100% rename from test/dev/fixtures/24-ember/app/router.js rename to packages/now-cli/test/dev/fixtures/24-ember/app/router.js diff --git a/test/dev/fixtures/24-ember/app/routes/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/routes/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/routes/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/routes/.gitkeep diff --git a/test/dev/fixtures/24-ember/app/styles/app.css b/packages/now-cli/test/dev/fixtures/24-ember/app/styles/app.css similarity index 100% rename from test/dev/fixtures/24-ember/app/styles/app.css rename to packages/now-cli/test/dev/fixtures/24-ember/app/styles/app.css diff --git a/test/dev/fixtures/24-ember/app/templates/application.hbs b/packages/now-cli/test/dev/fixtures/24-ember/app/templates/application.hbs similarity index 100% rename from test/dev/fixtures/24-ember/app/templates/application.hbs rename to packages/now-cli/test/dev/fixtures/24-ember/app/templates/application.hbs diff --git a/test/dev/fixtures/24-ember/app/templates/components/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/app/templates/components/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/app/templates/components/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/app/templates/components/.gitkeep diff --git a/test/dev/fixtures/24-ember/config/environment.js b/packages/now-cli/test/dev/fixtures/24-ember/config/environment.js similarity index 100% rename from test/dev/fixtures/24-ember/config/environment.js rename to packages/now-cli/test/dev/fixtures/24-ember/config/environment.js diff --git a/test/dev/fixtures/24-ember/config/optional-features.json b/packages/now-cli/test/dev/fixtures/24-ember/config/optional-features.json similarity index 100% rename from test/dev/fixtures/24-ember/config/optional-features.json rename to packages/now-cli/test/dev/fixtures/24-ember/config/optional-features.json diff --git a/test/dev/fixtures/24-ember/config/targets.js b/packages/now-cli/test/dev/fixtures/24-ember/config/targets.js similarity index 100% rename from test/dev/fixtures/24-ember/config/targets.js rename to packages/now-cli/test/dev/fixtures/24-ember/config/targets.js diff --git a/test/dev/fixtures/24-ember/ember-cli-build.js b/packages/now-cli/test/dev/fixtures/24-ember/ember-cli-build.js similarity index 100% rename from test/dev/fixtures/24-ember/ember-cli-build.js rename to packages/now-cli/test/dev/fixtures/24-ember/ember-cli-build.js diff --git a/test/dev/fixtures/24-ember/package.json b/packages/now-cli/test/dev/fixtures/24-ember/package.json similarity index 100% rename from test/dev/fixtures/24-ember/package.json rename to packages/now-cli/test/dev/fixtures/24-ember/package.json diff --git a/test/dev/fixtures/24-ember/public/robots.txt b/packages/now-cli/test/dev/fixtures/24-ember/public/robots.txt similarity index 100% rename from test/dev/fixtures/24-ember/public/robots.txt rename to packages/now-cli/test/dev/fixtures/24-ember/public/robots.txt diff --git a/test/dev/fixtures/24-ember/testem.js b/packages/now-cli/test/dev/fixtures/24-ember/testem.js similarity index 100% rename from test/dev/fixtures/24-ember/testem.js rename to packages/now-cli/test/dev/fixtures/24-ember/testem.js diff --git a/test/dev/fixtures/24-ember/tests/helpers/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/tests/helpers/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/tests/helpers/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/tests/helpers/.gitkeep diff --git a/test/dev/fixtures/24-ember/tests/index.html b/packages/now-cli/test/dev/fixtures/24-ember/tests/index.html similarity index 100% rename from test/dev/fixtures/24-ember/tests/index.html rename to packages/now-cli/test/dev/fixtures/24-ember/tests/index.html diff --git a/test/dev/fixtures/24-ember/tests/integration/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/tests/integration/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/tests/integration/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/tests/integration/.gitkeep diff --git a/test/dev/fixtures/24-ember/tests/test-helper.js b/packages/now-cli/test/dev/fixtures/24-ember/tests/test-helper.js similarity index 100% rename from test/dev/fixtures/24-ember/tests/test-helper.js rename to packages/now-cli/test/dev/fixtures/24-ember/tests/test-helper.js diff --git a/test/dev/fixtures/24-ember/tests/unit/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/tests/unit/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/tests/unit/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/tests/unit/.gitkeep diff --git a/test/dev/fixtures/24-ember/vendor/.gitkeep b/packages/now-cli/test/dev/fixtures/24-ember/vendor/.gitkeep similarity index 100% rename from test/dev/fixtures/24-ember/vendor/.gitkeep rename to packages/now-cli/test/dev/fixtures/24-ember/vendor/.gitkeep diff --git a/test/dev/fixtures/empty/.gitignore b/packages/now-cli/test/dev/fixtures/empty/.gitignore similarity index 100% rename from test/dev/fixtures/empty/.gitignore rename to packages/now-cli/test/dev/fixtures/empty/.gitignore diff --git a/test/dev/fixtures/handle-filesystem-missing/.gitignore b/packages/now-cli/test/dev/fixtures/handle-filesystem-missing/.gitignore similarity index 100% rename from test/dev/fixtures/handle-filesystem-missing/.gitignore rename to packages/now-cli/test/dev/fixtures/handle-filesystem-missing/.gitignore diff --git a/test/dev/fixtures/handle-filesystem-missing/now.json b/packages/now-cli/test/dev/fixtures/handle-filesystem-missing/now.json similarity index 100% rename from test/dev/fixtures/handle-filesystem-missing/now.json rename to packages/now-cli/test/dev/fixtures/handle-filesystem-missing/now.json diff --git a/test/dev/fixtures/handle-filesystem-missing/package.json b/packages/now-cli/test/dev/fixtures/handle-filesystem-missing/package.json similarity index 100% rename from test/dev/fixtures/handle-filesystem-missing/package.json rename to packages/now-cli/test/dev/fixtures/handle-filesystem-missing/package.json diff --git a/test/dev/fixtures/no-build-matches/now.json b/packages/now-cli/test/dev/fixtures/no-build-matches/now.json similarity index 100% rename from test/dev/fixtures/no-build-matches/now.json rename to packages/now-cli/test/dev/fixtures/no-build-matches/now.json diff --git a/test/dev/fixtures/temporary-directory-listing/.gitignore b/packages/now-cli/test/dev/fixtures/temporary-directory-listing/.gitignore similarity index 100% rename from test/dev/fixtures/temporary-directory-listing/.gitignore rename to packages/now-cli/test/dev/fixtures/temporary-directory-listing/.gitignore diff --git a/test/dev/fixtures/temporary-directory-listing/.nowignore b/packages/now-cli/test/dev/fixtures/temporary-directory-listing/.nowignore similarity index 100% rename from test/dev/fixtures/temporary-directory-listing/.nowignore rename to packages/now-cli/test/dev/fixtures/temporary-directory-listing/.nowignore diff --git a/test/dev/fixtures/trigger-static-build/index.txt b/packages/now-cli/test/dev/fixtures/trigger-static-build/index.txt similarity index 100% rename from test/dev/fixtures/trigger-static-build/index.txt rename to packages/now-cli/test/dev/fixtures/trigger-static-build/index.txt diff --git a/test/dev/integration.js b/packages/now-cli/test/dev/integration.js similarity index 100% rename from test/dev/integration.js rename to packages/now-cli/test/dev/integration.js diff --git a/packages/now-cli/test/fixtures/integration/build-env-arg/Dockerfile b/packages/now-cli/test/fixtures/integration/build-env-arg/Dockerfile new file mode 100644 index 000000000..25f946e4f --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/build-env-arg/Dockerfile @@ -0,0 +1,6 @@ + +FROM alpine +ARG NONCE +RUN mkdir /public +RUN echo $NONCE > /public/index.html + \ No newline at end of file diff --git a/packages/now-cli/test/fixtures/integration/build-env-arg/now.json b/packages/now-cli/test/fixtures/integration/build-env-arg/now.json new file mode 100644 index 000000000..0891df7a5 --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/build-env-arg/now.json @@ -0,0 +1 @@ +{"version":1,"type":"static"} \ No newline at end of file diff --git a/packages/now-cli/test/fixtures/integration/build-env/Dockerfile b/packages/now-cli/test/fixtures/integration/build-env/Dockerfile new file mode 100644 index 000000000..687a1a90d --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/build-env/Dockerfile @@ -0,0 +1,6 @@ + +FROM alpine +ARG FOO +RUN mkdir /public +RUN echo $FOO > /public/index.html + \ No newline at end of file diff --git a/packages/now-cli/test/fixtures/integration/build-env/now.json b/packages/now-cli/test/fixtures/integration/build-env/now.json new file mode 100644 index 000000000..f58c4fca3 --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/build-env/now.json @@ -0,0 +1 @@ +{"version":1,"type":"static","build":{"env":{"FOO":"bar"}}} \ No newline at end of file diff --git a/packages/now-cli/test/fixtures/integration/builds-no-list/now.json b/packages/now-cli/test/fixtures/integration/builds-no-list/now.json new file mode 100644 index 000000000..d1a1f5c7f --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/builds-no-list/now.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "routes": [ + { + "src": "/(.*)", + "status": 301, + "headers": { + "Location": "https://google.com" + } + } + ] +} \ No newline at end of file diff --git a/packages/now-cli/test/fixtures/integration/builds-wrong/index.html b/packages/now-cli/test/fixtures/integration/builds-wrong/index.html new file mode 100644 index 000000000..7f4f7c411 --- /dev/null +++ b/packages/now-cli/test/fixtures/integration/builds-wrong/index.html @@ -0,0 +1 @@ +test + Post message for now-builders-ci-bot-255 right here: +