mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-11 12:57:46 +00:00
Compare commits
56 Commits
@now/pytho
...
@now/lambd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7c47fa587 | ||
|
|
f3bcefe822 | ||
|
|
7a481c9515 | ||
|
|
af275c60bf | ||
|
|
ded377dfc2 | ||
|
|
0daaa1cf6a | ||
|
|
6e928d1a68 | ||
|
|
791c26fdfe | ||
|
|
c14451c2c5 | ||
|
|
846b229511 | ||
|
|
d832658226 | ||
|
|
2df09c7742 | ||
|
|
e55b84b646 | ||
|
|
265df1491e | ||
|
|
f46c0dc747 | ||
|
|
1443e5435b | ||
|
|
b4fa4d35db | ||
|
|
1f565c2570 | ||
|
|
a2d95ae8ee | ||
|
|
fe15cc1b2c | ||
|
|
e8a9c49949 | ||
|
|
f9233b2e24 | ||
|
|
bfa0c05e5d | ||
|
|
6caba97183 | ||
|
|
5d35de8908 | ||
|
|
551a29dd13 | ||
|
|
f63f48e1e9 | ||
|
|
7d7f0adfb3 | ||
|
|
5538e97bb8 | ||
|
|
f8c260353c | ||
|
|
9123356d23 | ||
|
|
d85eee5571 | ||
|
|
0f59d568e5 | ||
|
|
2d69514a37 | ||
|
|
7b690c742b | ||
|
|
fecbad7016 | ||
|
|
c8fce90612 | ||
|
|
04803712af | ||
|
|
8a3913c5b5 | ||
|
|
8eb66c8c23 | ||
|
|
24e10396c8 | ||
|
|
740118488c | ||
|
|
2cf6769b93 | ||
|
|
4353614ae3 | ||
|
|
92f1515271 | ||
|
|
3c24ce4116 | ||
|
|
863b8c8fe5 | ||
|
|
3e52eda3af | ||
|
|
334aca3222 | ||
|
|
5cfc350b91 | ||
|
|
eb1ae073bb | ||
|
|
3d5f67c620 | ||
|
|
8d7d4858e9 | ||
|
|
24b304e5de | ||
|
|
065143ed09 | ||
|
|
efb7b637a5 |
@@ -6,22 +6,64 @@ jobs:
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- run: yarn install
|
||||
- run: yarn bootstrap
|
||||
publish-canary:
|
||||
- run:
|
||||
name: Updating apt-get list
|
||||
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 install
|
||||
- run:
|
||||
name: Bootstrapping
|
||||
command: yarn bootstrap
|
||||
- run:
|
||||
name: Linting
|
||||
command: yarn lint
|
||||
- run:
|
||||
name: Tests
|
||||
command: yarn test
|
||||
# publish-canary:
|
||||
# docker:
|
||||
# - image: circleci/node:10
|
||||
# working_directory: ~/repo
|
||||
# steps:
|
||||
# - checkout
|
||||
# - run:
|
||||
# name: Updating apt-get list
|
||||
# command: sudo apt-get update
|
||||
# - run:
|
||||
# name: Installing the latest version of Go
|
||||
# command: sudo apt-get install golang-go
|
||||
# - run: yarn install
|
||||
# - run: yarn bootstrap
|
||||
# - run:
|
||||
# name: Saving Authentication Information
|
||||
# command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
|
||||
# - run:
|
||||
# name: Publishing to Canary Channel
|
||||
# command: yarn run lerna publish from-git --npm-tag canary --yes
|
||||
publish-stable:
|
||||
docker:
|
||||
- image: circleci/node:10
|
||||
working_directory: ~/repo
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Updating apt-get list
|
||||
command: sudo apt-get update
|
||||
- run:
|
||||
name: Installing the latest version of Go
|
||||
command: sudo apt-get install golang-go
|
||||
- run: yarn install
|
||||
- run: yarn bootstrap
|
||||
- run:
|
||||
name: Saving Authentication Information
|
||||
command: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
|
||||
- run:
|
||||
name: Publishing to Canary Channel
|
||||
command: yarn run lerna publish from-git --npm-tag canary --yes
|
||||
name: Publishing to Stable Channel
|
||||
command: yarn run lerna publish from-git --yes
|
||||
workflows:
|
||||
version: 2
|
||||
unscheduled:
|
||||
@@ -30,19 +72,17 @@ workflows:
|
||||
filters:
|
||||
tags:
|
||||
only: /.*/
|
||||
- publish-canary:
|
||||
- publish-stable:
|
||||
requires:
|
||||
- build
|
||||
filters:
|
||||
tags:
|
||||
only: /^.*canary.*($|\b)/
|
||||
only: /^.*(\d+\.)(\d+\.)(\*|\d+)$/
|
||||
branches:
|
||||
ignore: /.*/
|
||||
# - publish-stable:
|
||||
# - publish-canary:
|
||||
# requires:
|
||||
# - build
|
||||
# filters:
|
||||
# tags:
|
||||
# only: /^(\d+\.)?(\d+\.)?(\*|\d+)$/
|
||||
# branches:
|
||||
# ignore: /.*/
|
||||
# only: /^.*canary.*($|\b)/
|
||||
|
||||
3
.eslintignore
Normal file
3
.eslintignore
Normal file
@@ -0,0 +1,3 @@
|
||||
/tmp/*
|
||||
/node_modules/*
|
||||
/**/node_modules/*
|
||||
24
.eslintrc
Normal file
24
.eslintrc
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"extends": ["prettier", "airbnb-base"],
|
||||
"rules": {
|
||||
"no-console": 0,
|
||||
"import/no-unresolved": 0,
|
||||
"import/no-dynamic-require": 0,
|
||||
"global-require": 0
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["test/**"],
|
||||
"rules": {
|
||||
"import/no-extraneous-dependencies": 0
|
||||
},
|
||||
"globals": {
|
||||
"describe": true,
|
||||
"it": true,
|
||||
"test": true,
|
||||
"expect": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
node_modules
|
||||
tmp
|
||||
|
||||
16
README.md
16
README.md
@@ -3,3 +3,19 @@
|
||||
This is the full list of official Builders provided by the ZEIT team.
|
||||
|
||||
More details here: http://zeit.co/docs
|
||||
|
||||
### Publishing to npm
|
||||
|
||||
Run the following command to publish modified builders to npm:
|
||||
|
||||
For the stable channel use:
|
||||
|
||||
```
|
||||
yarn publish-stable
|
||||
```
|
||||
|
||||
For the canary channel use:
|
||||
|
||||
```
|
||||
yarn publish-canary
|
||||
```
|
||||
|
||||
5
jest.config.js
Normal file
5
jest.config.js
Normal file
@@ -0,0 +1,5 @@
|
||||
module.exports = {
|
||||
testEnvironment: 'node',
|
||||
rootDir: 'test',
|
||||
collectCoverageFrom: ['packages/**/*.{js,jsx}', '!**/node_modules/**'],
|
||||
};
|
||||
29
package.json
29
package.json
@@ -11,6 +11,33 @@
|
||||
"scripts": {
|
||||
"lerna": "lerna",
|
||||
"bootstrap": "lerna bootstrap",
|
||||
"publish-canary": "lerna version prerelease --preid canary"
|
||||
"publish-stable": "lerna version",
|
||||
"publish-canary": "lerna version prerelease --preid canary",
|
||||
"lint": "tsc && eslint .",
|
||||
"test": "jest --runInBand",
|
||||
"lint-staged": "lint-staged"
|
||||
},
|
||||
"pre-commit": "lint-staged",
|
||||
"lint-staged": {
|
||||
"*.js": [
|
||||
"prettier --write --single-quote",
|
||||
"eslint --fix",
|
||||
"git add"
|
||||
]
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "^5.0.4",
|
||||
"@types/glob": "^7.1.1",
|
||||
"@types/multistream": "^2.1.1",
|
||||
"@types/node": "^10.12.8",
|
||||
"eslint": "^5.9.0",
|
||||
"eslint-config-airbnb-base": "^13.1.0",
|
||||
"eslint-config-prettier": "^3.1.0",
|
||||
"eslint-plugin-import": "^2.14.0",
|
||||
"jest": "^23.6.0",
|
||||
"lint-staged": "^8.0.4",
|
||||
"pre-commit": "^1.2.2",
|
||||
"prettier": "^1.15.2",
|
||||
"typescript": "^3.1.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ const assert = require('assert');
|
||||
const intoStream = require('into-stream');
|
||||
|
||||
class FileBlob {
|
||||
constructor ({ mode = 0o100644, data }) {
|
||||
constructor({ mode = 0o100644, data }) {
|
||||
assert(typeof mode === 'number');
|
||||
assert(typeof data === 'string' || Buffer.isBuffer(data));
|
||||
this.type = 'FileBlob';
|
||||
@@ -10,14 +10,14 @@ class FileBlob {
|
||||
this.data = data;
|
||||
}
|
||||
|
||||
static async fromStream ({ mode = 0o100644, stream }) {
|
||||
static async fromStream({ mode = 0o100644, stream }) {
|
||||
assert(typeof mode === 'number');
|
||||
assert(typeof stream.pipe === 'function'); // is-stream
|
||||
const chunks = [];
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
|
||||
stream.on('error', (error) => reject(error));
|
||||
stream.on('data', chunk => chunks.push(Buffer.from(chunk)));
|
||||
stream.on('error', error => reject(error));
|
||||
stream.on('end', () => resolve());
|
||||
});
|
||||
|
||||
@@ -25,7 +25,7 @@ class FileBlob {
|
||||
return new FileBlob({ mode, data });
|
||||
}
|
||||
|
||||
toStream () {
|
||||
toStream() {
|
||||
return intoStream(this.data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,39 @@
|
||||
const assert = require('assert');
|
||||
const fs = require('fs-extra');
|
||||
const MultiStream = require('multistream');
|
||||
const multiStream = require('multistream');
|
||||
const path = require('path');
|
||||
const Sema = require('async-sema');
|
||||
|
||||
/** @typedef {{[filePath: string]: FileFsRef}} FsFiles */
|
||||
|
||||
const semaToPreventEMFILE = new Sema(30);
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @argument {Object} options
|
||||
* @argument {number} [options.mode=0o100644]
|
||||
* @argument {string} options.fsPath
|
||||
*/
|
||||
class FileFsRef {
|
||||
constructor ({ mode = 0o100644, fsPath }) {
|
||||
constructor({ mode = 0o100644, fsPath }) {
|
||||
assert(typeof mode === 'number');
|
||||
assert(typeof fsPath === 'string');
|
||||
/** @type {string} */
|
||||
this.type = 'FileFsRef';
|
||||
/** @type {number} */
|
||||
this.mode = mode;
|
||||
/** @type {string} */
|
||||
this.fsPath = fsPath;
|
||||
}
|
||||
|
||||
static async fromStream ({ mode = 0o100644, stream, fsPath }) {
|
||||
/**
|
||||
* @argument {Object} options
|
||||
* @argument {number} [options.mode=0o100644]
|
||||
* @argument {NodeJS.ReadableStream} options.stream
|
||||
* @argument {string} options.fsPath
|
||||
* @returns {Promise<FileFsRef>}
|
||||
*/
|
||||
static async fromStream({ mode = 0o100644, stream, fsPath }) {
|
||||
assert(typeof mode === 'number');
|
||||
assert(typeof stream.pipe === 'function'); // is-stream
|
||||
assert(typeof fsPath === 'string');
|
||||
@@ -24,36 +42,45 @@ class FileFsRef {
|
||||
await new Promise((resolve, reject) => {
|
||||
const dest = fs.createWriteStream(fsPath);
|
||||
stream.pipe(dest);
|
||||
stream.on('error', (error) => reject(error));
|
||||
dest.on('finish', () => resolve());
|
||||
dest.on('error', (error) => reject(error));
|
||||
stream.on('error', reject);
|
||||
dest.on('finish', resolve);
|
||||
dest.on('error', reject);
|
||||
});
|
||||
|
||||
await fs.chmod(fsPath, mode.toString(8).slice(-3));
|
||||
return new FileFsRef({ mode, fsPath });
|
||||
}
|
||||
|
||||
async toStreamAsync () {
|
||||
/**
|
||||
* @returns {Promise<NodeJS.ReadableStream>}
|
||||
*/
|
||||
async toStreamAsync() {
|
||||
await semaToPreventEMFILE.acquire();
|
||||
const release = () => semaToPreventEMFILE.release();
|
||||
const stream = fs.createReadStream(this.fsPath);
|
||||
stream.on('end', release);
|
||||
stream.on('close', release);
|
||||
stream.on('error', release);
|
||||
return stream;
|
||||
}
|
||||
|
||||
toStream () {
|
||||
/**
|
||||
* @returns {NodeJS.ReadableStream}
|
||||
*/
|
||||
toStream() {
|
||||
let flag;
|
||||
|
||||
return new MultiStream((cb) => {
|
||||
if (flag) return cb();
|
||||
// eslint-disable-next-line consistent-return
|
||||
return multiStream((cb) => {
|
||||
if (flag) return cb(null, null);
|
||||
flag = true;
|
||||
|
||||
this.toStreamAsync().then((stream) => {
|
||||
cb(undefined, stream);
|
||||
}).catch((error) => {
|
||||
cb(error);
|
||||
});
|
||||
this.toStreamAsync()
|
||||
.then((stream) => {
|
||||
cb(null, stream);
|
||||
})
|
||||
.catch((error) => {
|
||||
cb(error, null);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +1,43 @@
|
||||
const assert = require('assert');
|
||||
const fetch = require('node-fetch');
|
||||
const MultiStream = require('multistream');
|
||||
const multiStream = require('multistream');
|
||||
const retry = require('async-retry');
|
||||
const Sema = require('async-sema');
|
||||
|
||||
/** @typedef {{[filePath: string]: FileRef}} Files */
|
||||
|
||||
const semaToDownloadFromS3 = new Sema(10);
|
||||
|
||||
class BailableError extends Error {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
/** @type {boolean} */
|
||||
this.bail = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* @argument {Object} options
|
||||
* @argument {number} [options.mode=0o100644]
|
||||
* @argument {string} options.digest
|
||||
*/
|
||||
class FileRef {
|
||||
constructor ({ mode = 0o100644, digest }) {
|
||||
constructor({ mode = 0o100644, digest }) {
|
||||
assert(typeof mode === 'number');
|
||||
assert(typeof digest === 'string');
|
||||
/** @type {string} */
|
||||
this.type = 'FileRef';
|
||||
/** @type {number} */
|
||||
this.mode = mode;
|
||||
/** @type {string} */
|
||||
this.digest = digest;
|
||||
}
|
||||
|
||||
async toStreamAsync () {
|
||||
/**
|
||||
* @returns {Promise<NodeJS.ReadableStream>}
|
||||
*/
|
||||
async toStreamAsync() {
|
||||
let url;
|
||||
// sha:24be087eef9fac01d61b30a725c1a10d7b45a256
|
||||
const digestParts = this.digest.split(':');
|
||||
@@ -29,33 +51,44 @@ class FileRef {
|
||||
await semaToDownloadFromS3.acquire();
|
||||
console.time(`downloading ${url}`);
|
||||
try {
|
||||
return await retry(async () => {
|
||||
const resp = await fetch(url);
|
||||
if (!resp.ok) {
|
||||
const error = new Error(`${resp.status} ${resp.statusText}`);
|
||||
if (resp.status === 403) error.bail = true;
|
||||
throw error;
|
||||
}
|
||||
return resp.body;
|
||||
}, { factor: 1, retries: 3 });
|
||||
return await retry(
|
||||
async () => {
|
||||
const resp = await fetch(url);
|
||||
if (!resp.ok) {
|
||||
const error = new BailableError(
|
||||
`${resp.status} ${resp.statusText}`,
|
||||
);
|
||||
if (resp.status === 403) error.bail = true;
|
||||
throw error;
|
||||
}
|
||||
return resp.body;
|
||||
},
|
||||
{ factor: 1, retries: 3 },
|
||||
);
|
||||
} finally {
|
||||
console.timeEnd(`downloading ${url}`);
|
||||
semaToDownloadFromS3.release();
|
||||
}
|
||||
}
|
||||
|
||||
toStream () {
|
||||
/**
|
||||
* @returns {NodeJS.ReadableStream}
|
||||
*/
|
||||
toStream() {
|
||||
let flag;
|
||||
|
||||
return new MultiStream((cb) => {
|
||||
if (flag) return cb();
|
||||
// eslint-disable-next-line consistent-return
|
||||
return multiStream((cb) => {
|
||||
if (flag) return cb(null, null);
|
||||
flag = true;
|
||||
|
||||
this.toStreamAsync().then((stream) => {
|
||||
cb(undefined, stream);
|
||||
}).catch((error) => {
|
||||
cb(error);
|
||||
});
|
||||
this.toStreamAsync()
|
||||
.then((stream) => {
|
||||
cb(null, stream);
|
||||
})
|
||||
.catch((error) => {
|
||||
cb(error, null);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,38 @@
|
||||
const FileFsRef = require('../file-fs-ref.js');
|
||||
const path = require('path');
|
||||
const FileFsRef = require('../file-fs-ref.js');
|
||||
|
||||
async function downloadFile (file, fsPath) {
|
||||
/** @typedef {import('../file-ref')} FileRef */
|
||||
/** @typedef {import('../file-fs-ref')} FileFsRef */
|
||||
/** @typedef {{[filePath: string]: FileRef|FileFsRef}} Files */
|
||||
/** @typedef {{[filePath: string]: FileFsRef}|{}} DownloadedFiles */
|
||||
|
||||
/**
|
||||
* @param {FileRef|FileFsRef} file
|
||||
* @param {string} fsPath
|
||||
* @returns {Promise<FileFsRef>}
|
||||
*/
|
||||
async function downloadFile(file, fsPath) {
|
||||
const { mode } = file;
|
||||
const stream = file.toStream();
|
||||
return await FileFsRef.fromStream({ mode, stream, fsPath });
|
||||
return FileFsRef.fromStream({ mode, stream, fsPath });
|
||||
}
|
||||
|
||||
module.exports = async function download (files, basePath) {
|
||||
/**
|
||||
* Download files to disk
|
||||
* @argument {Files} files
|
||||
* @argument {string} basePath
|
||||
* @returns {Promise<DownloadedFiles>}
|
||||
*/
|
||||
module.exports = async function download(files, basePath) {
|
||||
const files2 = {};
|
||||
|
||||
await Promise.all(Object.keys(files).map(async (name) => {
|
||||
const file = files[name];
|
||||
const fsPath = path.join(basePath, name);
|
||||
files2[name] = await downloadFile(file, fsPath);
|
||||
}));
|
||||
await Promise.all(
|
||||
Object.keys(files).map(async (name) => {
|
||||
const file = files[name];
|
||||
const fsPath = path.join(basePath, name);
|
||||
files2[name] = await downloadFile(file, fsPath);
|
||||
}),
|
||||
);
|
||||
|
||||
return files2;
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@ const fs = require('fs-extra');
|
||||
const dev = !process.env.AWS_EXECUTION_ENV;
|
||||
const TMP_PATH = dev ? path.join(process.cwd(), 'tmp') : '/tmp';
|
||||
|
||||
module.exports = async function getWritableDirectory () {
|
||||
module.exports = async function getWritableDirectory() {
|
||||
const name = Math.floor(Math.random() * 0x7fffffff).toString(16);
|
||||
const directory = path.join(TMP_PATH, name);
|
||||
await fs.mkdirp(directory);
|
||||
|
||||
@@ -1,41 +1,67 @@
|
||||
const assert = require('assert');
|
||||
const FileFsRef = require('../file-fs-ref.js');
|
||||
const path = require('path');
|
||||
const vanillaGlob = require('glob');
|
||||
const FileFsRef = require('../file-fs-ref.js');
|
||||
|
||||
module.exports = function glob (pattern, opts = {}, mountpoint) {
|
||||
/** @typedef {import('fs').Stats} Stats */
|
||||
/** @typedef {import('glob').IOptions} GlobOptions */
|
||||
/** @typedef {import('../file-fs-ref').FsFiles|{}} GlobFiles */
|
||||
|
||||
/**
|
||||
* @argument {string} pattern
|
||||
* @argument {GlobOptions|string} opts
|
||||
* @argument {string} [mountpoint]
|
||||
* @returns {Promise<GlobFiles>}
|
||||
*/
|
||||
module.exports = function glob(pattern, opts = {}, mountpoint) {
|
||||
return new Promise((resolve, reject) => {
|
||||
/** @type {GlobOptions} */
|
||||
let options;
|
||||
if (typeof opts === 'string') {
|
||||
opts = { cwd: opts };
|
||||
options = { cwd: opts };
|
||||
} else {
|
||||
options = opts;
|
||||
}
|
||||
|
||||
if (!opts.cwd) {
|
||||
throw new Error('Second argument (basePath) must be specified for names of resulting files');
|
||||
if (!options.cwd) {
|
||||
throw new Error(
|
||||
'Second argument (basePath) must be specified for names of resulting files',
|
||||
);
|
||||
}
|
||||
|
||||
if (!path.isAbsolute(opts.cwd)) {
|
||||
throw new Error(`basePath/cwd must be an absolute path (${opts.cwd})`);
|
||||
if (!path.isAbsolute(options.cwd)) {
|
||||
throw new Error(`basePath/cwd must be an absolute path (${options.cwd})`);
|
||||
}
|
||||
|
||||
opts.statCache = {};
|
||||
opts.stat = true;
|
||||
opts.dot = true;
|
||||
options.statCache = {};
|
||||
options.stat = true;
|
||||
options.dot = true;
|
||||
|
||||
vanillaGlob(pattern, opts, (error, files) => {
|
||||
// eslint-disable-next-line consistent-return
|
||||
vanillaGlob(pattern, options, (error, files) => {
|
||||
if (error) return reject(error);
|
||||
|
||||
resolve(files.reduce((files2, relativePath) => {
|
||||
const fsPath = path.join(opts.cwd, relativePath);
|
||||
const stat = opts.statCache[fsPath];
|
||||
assert(stat, `statCache does not contain value for ${relativePath} (resolved to ${fsPath})`);
|
||||
if (stat.isFile()) {
|
||||
let finalPath = relativePath;
|
||||
if (mountpoint) finalPath = path.join(mountpoint, finalPath);
|
||||
files2[finalPath] = new FileFsRef({ mode: stat.mode, fsPath });
|
||||
}
|
||||
resolve(
|
||||
files.reduce((files2, relativePath) => {
|
||||
const fsPath = path.join(options.cwd, relativePath);
|
||||
/** @type {Stats|any} */
|
||||
const stat = options.statCache[fsPath];
|
||||
assert(
|
||||
stat,
|
||||
`statCache does not contain value for ${relativePath} (resolved to ${fsPath})`,
|
||||
);
|
||||
if (stat && stat.isFile()) {
|
||||
let finalPath = relativePath;
|
||||
if (mountpoint) finalPath = path.join(mountpoint, finalPath);
|
||||
return {
|
||||
...files2,
|
||||
[finalPath]: new FileFsRef({ mode: stat.mode, fsPath }),
|
||||
};
|
||||
}
|
||||
|
||||
return files2;
|
||||
}, {}));
|
||||
return files2;
|
||||
}, {}),
|
||||
);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,9 +1,25 @@
|
||||
module.exports = function rename (files, delegate) {
|
||||
const files2 = {};
|
||||
/** @typedef { import('@now/build-utils/file-ref') } FileRef */
|
||||
/** @typedef { import('@now/build-utils/file-fs-ref') } FileFsRef */
|
||||
/** @typedef {{[filePath: string]: FileRef|FileFsRef}} Files */
|
||||
|
||||
for (const name in files) {
|
||||
files2[delegate(name)] = files[name];
|
||||
}
|
||||
/**
|
||||
* @callback delegate
|
||||
* @argument {string} name
|
||||
* @returns {string}
|
||||
*/
|
||||
|
||||
return files2;
|
||||
/**
|
||||
* Rename files using delegate function
|
||||
* @argument {Files} files
|
||||
* @argument {delegate} delegate
|
||||
* @returns {Files}
|
||||
*/
|
||||
module.exports = function rename(files, delegate) {
|
||||
return Object.keys(files).reduce(
|
||||
(newFiles, name) => ({
|
||||
...newFiles,
|
||||
[delegate(name)]: files[name],
|
||||
}),
|
||||
{},
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2,48 +2,68 @@ const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
const { spawn } = require('child_process');
|
||||
|
||||
async function runShellScript (fsPath) {
|
||||
function spawnAsync(command, args, cwd) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(command, args, { stdio: 'inherit', cwd });
|
||||
child.on('error', reject);
|
||||
child.on('close', (code, signal) => (code !== 0
|
||||
? reject(new Error(`Exited with ${code || signal}`))
|
||||
: resolve()));
|
||||
});
|
||||
}
|
||||
|
||||
async function runShellScript(fsPath) {
|
||||
const destPath = path.dirname(fsPath);
|
||||
await spawnAsync('./' + path.basename(fsPath), [], destPath);
|
||||
await spawnAsync(`./${path.basename(fsPath)}`, [], destPath);
|
||||
return true;
|
||||
}
|
||||
|
||||
async function shouldUseNpm (destPath) {
|
||||
async function shouldUseNpm(destPath) {
|
||||
let currentDestPath = destPath;
|
||||
// eslint-disable-next-line no-constant-condition
|
||||
while (true) {
|
||||
if (await fs.exists(path.join(destPath, 'package.json'))) {
|
||||
if (await fs.exists(path.join(destPath, 'package-lock.json'))) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
if (await fs.exists(path.join(currentDestPath, 'package.json'))) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
if (await fs.exists(path.join(currentDestPath, 'package-lock.json'))) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const newDestPath = path.dirname(destPath);
|
||||
if (destPath === newDestPath) break;
|
||||
destPath = newDestPath;
|
||||
const newDestPath = path.dirname(currentDestPath);
|
||||
if (currentDestPath === newDestPath) break;
|
||||
currentDestPath = newDestPath;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
async function runNpmInstall (destPath, args = []) {
|
||||
async function runNpmInstall(destPath, args = []) {
|
||||
let commandArgs = args;
|
||||
console.log(`installing to ${destPath}`);
|
||||
if (await shouldUseNpm(destPath)) {
|
||||
args = args.filter((a) => a !== '--prefer-offline');
|
||||
await spawnAsync('npm', [ 'install' ].concat(args), destPath);
|
||||
commandArgs = args.filter(a => a !== '--prefer-offline');
|
||||
await spawnAsync('npm', ['install'].concat(commandArgs), destPath);
|
||||
await spawnAsync('npm', ['cache', 'clean', '--force'], destPath);
|
||||
} else {
|
||||
await spawnAsync('yarn', [ '--cwd', destPath ].concat(args), destPath);
|
||||
await spawnAsync('yarn', ['--cwd', destPath].concat(commandArgs), destPath);
|
||||
await spawnAsync('yarn', ['cache', 'clean'], destPath);
|
||||
}
|
||||
}
|
||||
|
||||
async function runPackageJsonScript (destPath, scriptName) {
|
||||
async function runPackageJsonScript(destPath, scriptName) {
|
||||
try {
|
||||
if (await shouldUseNpm(destPath)) {
|
||||
console.log(`running "npm run ${scriptName}"`);
|
||||
await spawnAsync('npm', [ 'run', scriptName ], destPath);
|
||||
await spawnAsync('npm', ['run', scriptName], destPath);
|
||||
} else {
|
||||
console.log(`running "yarn run ${scriptName}"`);
|
||||
await spawnAsync('yarn', [ '--cwd', destPath, 'run', scriptName ], destPath);
|
||||
await spawnAsync(
|
||||
'yarn',
|
||||
['--cwd', destPath, 'run', scriptName],
|
||||
destPath,
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error.message);
|
||||
@@ -53,19 +73,8 @@ async function runPackageJsonScript (destPath, scriptName) {
|
||||
return true;
|
||||
}
|
||||
|
||||
function spawnAsync (command, args, cwd) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(command, args, { stdio: 'inherit', cwd });
|
||||
child.on('error', reject);
|
||||
child.on('close', (code, signal) => {
|
||||
if (code !== 0) return reject(new Error(`Exited with ${code || signal}`));
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
runShellScript,
|
||||
runNpmInstall,
|
||||
runPackageJsonScript
|
||||
runPackageJsonScript,
|
||||
};
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
const streamToBuffer = require('fast-stream-to-buffer');
|
||||
const fastStreamToBuffer = require('fast-stream-to-buffer');
|
||||
const { promisify } = require('util');
|
||||
|
||||
module.exports = async function (stream) {
|
||||
return await new Promise((resolve, reject) => {
|
||||
streamToBuffer(stream, function (error, buffer) {
|
||||
if (error) return reject(error);
|
||||
resolve(buffer);
|
||||
});
|
||||
});
|
||||
};
|
||||
module.exports = promisify(fastStreamToBuffer);
|
||||
|
||||
@@ -3,7 +3,9 @@ const { ZipFile } = require('yazl');
|
||||
const streamToBuffer = require('./fs/stream-to-buffer.js');
|
||||
|
||||
class Lambda {
|
||||
constructor ({ zipBuffer, handler, runtime, environment }) {
|
||||
constructor({
|
||||
zipBuffer, handler, runtime, environment,
|
||||
}) {
|
||||
this.type = 'Lambda';
|
||||
this.zipBuffer = zipBuffer;
|
||||
this.handler = handler;
|
||||
@@ -14,26 +16,34 @@ class Lambda {
|
||||
|
||||
const mtime = new Date(1540000000000);
|
||||
|
||||
async function createLambda ({ files, handler, runtime, environment }) {
|
||||
assert(typeof files === 'object');
|
||||
assert(typeof handler === 'string');
|
||||
assert(typeof runtime === 'string');
|
||||
if (environment === undefined) environment = {};
|
||||
assert(typeof environment === 'object');
|
||||
async function createLambda({
|
||||
files, handler, runtime, environment = {},
|
||||
}) {
|
||||
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');
|
||||
const zipFile = new ZipFile();
|
||||
|
||||
for (const name of Object.keys(files).sort()) {
|
||||
const file = files[name];
|
||||
const stream = file.toStream();
|
||||
zipFile.addReadStream(stream, name, { mode: file.mode, mtime });
|
||||
}
|
||||
Object.keys(files)
|
||||
.sort()
|
||||
.forEach((name) => {
|
||||
const file = files[name];
|
||||
const stream = file.toStream();
|
||||
zipFile.addReadStream(stream, name, { mode: file.mode, mtime });
|
||||
});
|
||||
|
||||
zipFile.end();
|
||||
const zipBuffer = await streamToBuffer(zipFile.outputStream);
|
||||
return new Lambda({ zipBuffer, handler, runtime, environment });
|
||||
return new Lambda({
|
||||
zipBuffer,
|
||||
handler,
|
||||
runtime,
|
||||
environment,
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
Lambda,
|
||||
createLambda
|
||||
createLambda,
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/build-utils",
|
||||
"version": "0.4.27-canary.1",
|
||||
"version": "0.4.29",
|
||||
"dependencies": {
|
||||
"async-retry": "1.2.3",
|
||||
"async-sema": "2.1.4",
|
||||
|
||||
32
packages/now-cgi/.editorconfig
Normal file
32
packages/now-cgi/.editorconfig
Normal file
@@ -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
|
||||
2
packages/now-cgi/.gitignore
vendored
Normal file
2
packages/now-cgi/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
node_modules
|
||||
handler
|
||||
4
packages/now-cgi/build.sh
Executable file
4
packages/now-cgi/build.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
export GOOS=linux
|
||||
export GOARCH=amd64
|
||||
go build -o handler main.go
|
||||
42
packages/now-cgi/index.js
Normal file
42
packages/now-cgi/index.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const path = require('path');
|
||||
const { mkdirp, copyFile } = require('fs-extra');
|
||||
|
||||
const glob = require('@now/build-utils/fs/glob');
|
||||
const download = require('@now/build-utils/fs/download');
|
||||
const { createLambda } = require('@now/build-utils/lambda');
|
||||
const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory');
|
||||
|
||||
exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest;
|
||||
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
console.log('downloading files...');
|
||||
const srcDir = await getWritableDirectory();
|
||||
const outDir = await getWritableDirectory();
|
||||
|
||||
await download(files, srcDir);
|
||||
|
||||
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(srcDir, 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,
|
||||
};
|
||||
};
|
||||
152
packages/now-cgi/main.go
Normal file
152
packages/now-cgi/main.go
Normal file
@@ -0,0 +1,152 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/http/cgi"
|
||||
"path/filepath"
|
||||
"encoding/json"
|
||||
b64 "encoding/base64"
|
||||
"github.com/aws/aws-lambda-go/events"
|
||||
"github.com/aws/aws-lambda-go/lambda"
|
||||
)
|
||||
|
||||
type Request struct {
|
||||
Host string `json:"host"`
|
||||
Path string `json:"path"`
|
||||
Method string `json:"method"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
Encoding string `json:"encoding,omitempty"`
|
||||
Body string `json:"body"`
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
StatusCode int `json:"statusCode"`
|
||||
Headers map[string]string `json:"headers"`
|
||||
Encoding string `json:"encoding,omitemtpy"`
|
||||
Body string `json:"body"`
|
||||
}
|
||||
|
||||
type ResponseError struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
type ResponseErrorWrapper struct {
|
||||
Error ResponseError `json:"error"`
|
||||
}
|
||||
|
||||
type CgiHandler struct {
|
||||
http.Handler
|
||||
Dir string
|
||||
Script string
|
||||
}
|
||||
|
||||
func createErrorResponse(message string, code string, statusCode int) (Response, error) {
|
||||
obj := ResponseErrorWrapper{
|
||||
Error: ResponseError{
|
||||
Code: code,
|
||||
Message: message,
|
||||
},
|
||||
}
|
||||
|
||||
body, _ := json.Marshal(obj)
|
||||
|
||||
return Response{
|
||||
StatusCode: statusCode,
|
||||
Headers: map[string]string{
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
Body: string(body),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (h *CgiHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
cgih := cgi.Handler{
|
||||
Path: h.Script,
|
||||
Root: "/" + h.Script,
|
||||
Dir: h.Dir,
|
||||
Env: []string{"SERVER_PORT=443"},
|
||||
}
|
||||
cgih.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
func main() {
|
||||
l, err := net.Listen("tcp", ":0")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
workdir, _ := filepath.Abs(".")
|
||||
script := os.Getenv("SCRIPT_FILENAME")
|
||||
h := &CgiHandler{nil, workdir, script}
|
||||
|
||||
http.Handle("/", h)
|
||||
go http.Serve(l, nil)
|
||||
|
||||
handler := func(_req events.APIGatewayProxyRequest) (Response, error) {
|
||||
var req Request
|
||||
|
||||
err := json.Unmarshal([]byte(_req.Body), &req)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return createErrorResponse("Invalid payload", "bad_request", 400)
|
||||
}
|
||||
|
||||
if req.Encoding == "base64" {
|
||||
decoded, _ := b64.StdEncoding.DecodeString(req.Body)
|
||||
req.Body = string(decoded)
|
||||
}
|
||||
|
||||
url := "http://" + l.Addr().String() + req.Path
|
||||
|
||||
internalReq, err := http.NewRequest(req.Method, url, strings.NewReader(req.Body))
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return createErrorResponse("Bad gateway internal req failed", "bad_gateway", 502)
|
||||
}
|
||||
|
||||
for k, v := range req.Headers {
|
||||
internalReq.Header.Add(k, v)
|
||||
if strings.ToLower(k) == "host" {
|
||||
internalReq.Host = v
|
||||
}
|
||||
}
|
||||
|
||||
client := &http.Client{}
|
||||
internalRes, err := client.Do(internalReq)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
return createErrorResponse("Bad gateway internal req Do failed", "bad_gateway", 502)
|
||||
}
|
||||
defer internalRes.Body.Close()
|
||||
|
||||
resHeaders := make(map[string]string, len(internalRes.Header))
|
||||
for k, v := range internalRes.Header {
|
||||
// FIXME: support multiple values via concatenating with ','
|
||||
// see RFC 7230, section 3.2.2
|
||||
resHeaders[k] = v[0]
|
||||
}
|
||||
|
||||
bodyBytes, err := ioutil.ReadAll(internalRes.Body)
|
||||
if err != nil {
|
||||
return createErrorResponse("Bad gateway ReadAll bytes from response failed", "bad_gateway", 502)
|
||||
}
|
||||
|
||||
resBody := b64.StdEncoding.EncodeToString(bodyBytes)
|
||||
|
||||
return Response{
|
||||
StatusCode: internalRes.StatusCode,
|
||||
Headers: resHeaders,
|
||||
Encoding: "base64",
|
||||
Body: resBody,
|
||||
}, nil
|
||||
}
|
||||
|
||||
lambda.Start(handler)
|
||||
}
|
||||
22
packages/now-cgi/package.json
Normal file
22
packages/now-cgi/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@now/cgi",
|
||||
"version": "0.0.12",
|
||||
"scripts": {
|
||||
"test": "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"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
862
packages/now-cgi/yarn.lock
Normal file
862
packages/now-cgi/yarn.lock
Normal file
@@ -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"
|
||||
@@ -1,14 +1,14 @@
|
||||
const path = require('path')
|
||||
const path = require('path');
|
||||
|
||||
const fetch = require('node-fetch')
|
||||
const tar = require('tar')
|
||||
const fetch = require('node-fetch');
|
||||
const tar = require('tar');
|
||||
const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory.js');
|
||||
|
||||
const url = 'https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz'
|
||||
const url = 'https://dl.google.com/go/go1.11.1.linux-amd64.tar.gz';
|
||||
|
||||
module.exports = async () => {
|
||||
const res = await fetch(url)
|
||||
const dir = await getWritableDirectory()
|
||||
const res = await fetch(url);
|
||||
const dir = await getWritableDirectory();
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Failed to download: ${url}`);
|
||||
@@ -19,6 +19,5 @@ module.exports = async () => {
|
||||
.on('error', reject)
|
||||
.pipe(tar.extract({ cwd: dir, strip: 1 }))
|
||||
.on('finish', () => resolve(path.join(dir, 'bin', 'go')));
|
||||
})
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1,120 +1,136 @@
|
||||
const path = require("path")
|
||||
const { mkdirp, readFile, writeFile } = require('fs-extra')
|
||||
const path = require('path');
|
||||
const { mkdirp, readFile, writeFile } = require('fs-extra');
|
||||
|
||||
const execa = require('execa')
|
||||
const execa = require('execa');
|
||||
const { createLambda } = require('@now/build-utils/lambda.js');
|
||||
const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory.js');
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const downloadGit = require("lambda-git")
|
||||
const downloadGoBin = require("./download-go-bin")
|
||||
const downloadGit = require('lambda-git');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
|
||||
const goFilenames = new Set([
|
||||
'go.mod',
|
||||
'go.sum',
|
||||
'Gopkg.lock',
|
||||
'Gopkg.toml'
|
||||
]);
|
||||
const downloadGoBin = require('./download-go-bin');
|
||||
|
||||
// creates a `$GOPATH` direcotry tree, as per
|
||||
// `go help gopath`'s instructions.
|
||||
// without this, Go won't recognize the `$GOPATH`
|
||||
async function createGoPathTree(goPath) {
|
||||
await mkdirp(path.join(goPath, 'bin'))
|
||||
await mkdirp(path.join(goPath, 'pkg', 'linux_amd64'))
|
||||
await mkdirp(path.join(goPath, 'bin'));
|
||||
await mkdirp(path.join(goPath, 'pkg', 'linux_amd64'));
|
||||
}
|
||||
|
||||
exports.build = async ({files, entrypoint, config}) => {
|
||||
console.log('downloading files...')
|
||||
exports.config = {
|
||||
maxLambdaSize: '10mb',
|
||||
};
|
||||
|
||||
const gitPath = await getWritableDirectory()
|
||||
const goPath = await getWritableDirectory()
|
||||
const srcPath = path.join(goPath, 'src', 'lambda')
|
||||
const outDir = await getWritableDirectory()
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
console.log('downloading files...');
|
||||
|
||||
await createGoPathTree(goPath)
|
||||
const gitPath = await getWritableDirectory();
|
||||
const goPath = await getWritableDirectory();
|
||||
const srcPath = path.join(goPath, 'src', 'lambda');
|
||||
const outDir = await getWritableDirectory();
|
||||
|
||||
files = await download(files, srcPath)
|
||||
await createGoPathTree(goPath);
|
||||
|
||||
console.log('downloading go binary...')
|
||||
const goBin = await downloadGoBin()
|
||||
const downloadedFiles = await download(files, srcPath);
|
||||
|
||||
console.log('downloading git binary...')
|
||||
console.log('downloading go binary...');
|
||||
const goBin = await downloadGoBin();
|
||||
|
||||
console.log('downloading git binary...');
|
||||
// downloads a git binary that works on Amazon Linux and sets
|
||||
// `process.env.GIT_EXEC_PATH` so `go(1)` can see it
|
||||
await downloadGit({targetDirectory: gitPath})
|
||||
await downloadGit({ targetDirectory: gitPath });
|
||||
|
||||
const goEnv = {
|
||||
...process.env,
|
||||
GOOS: 'linux',
|
||||
GOARCH: 'amd64',
|
||||
GOPATH: goPath
|
||||
}
|
||||
GOPATH: goPath,
|
||||
};
|
||||
|
||||
console.log(`parsing AST for \"${entrypoint}\"`)
|
||||
let handlerFunctionName = ''
|
||||
console.log(`parsing AST for "${entrypoint}"`);
|
||||
let handlerFunctionName = '';
|
||||
try {
|
||||
handlerFunctionName = await execa.stdout(
|
||||
path.join(__dirname, 'bin', 'get-exported-function-name'),
|
||||
[files[entrypoint].fsPath]
|
||||
)
|
||||
[downloadedFiles[entrypoint].fsPath],
|
||||
);
|
||||
} catch (err) {
|
||||
console.log(`failed to parse AST for \"${entrypoint}\"`)
|
||||
throw err
|
||||
console.log(`failed to parse AST for "${entrypoint}"`);
|
||||
throw err;
|
||||
}
|
||||
|
||||
if (handlerFunctionName === '') {
|
||||
const e = new Error(`Could not find an exported function on "${entrypoint}"`)
|
||||
console.log(e.message)
|
||||
throw e
|
||||
const e = new Error(
|
||||
`Could not find an exported function on "${entrypoint}"`,
|
||||
);
|
||||
console.log(e.message);
|
||||
throw e;
|
||||
}
|
||||
|
||||
console.log(`Found exported function "${handlerFunctionName}" on \"${entrypoint}\"`)
|
||||
console.log(
|
||||
`Found exported function "${handlerFunctionName}" on "${entrypoint}"`,
|
||||
);
|
||||
|
||||
const origianlMainGoContents = await readFile(path.join(__dirname, 'main.go'), 'utf8')
|
||||
const mainGoContents = origianlMainGoContents.replace('__NOW_HANDLER_FUNC_NAME', handlerFunctionName)
|
||||
const origianlMainGoContents = await readFile(
|
||||
path.join(__dirname, 'main.go'),
|
||||
'utf8',
|
||||
);
|
||||
const mainGoContents = origianlMainGoContents.replace(
|
||||
'__NOW_HANDLER_FUNC_NAME',
|
||||
handlerFunctionName,
|
||||
);
|
||||
// in order to allow the user to have `main.go`, we need our `main.go` to be called something else
|
||||
const mainGoFileName = 'main__now__go__.go'
|
||||
const mainGoFileName = 'main__now__go__.go';
|
||||
|
||||
// we need `main.go` in the same dir as the entrypoint,
|
||||
// otherwise `go build` will refuse to build
|
||||
const entrypointDirname = path.dirname(files[entrypoint].fsPath)
|
||||
const entrypointDirname = path.dirname(downloadedFiles[entrypoint].fsPath);
|
||||
|
||||
// Go doesn't like to build files in different directories,
|
||||
// so now we place `main.go` together with the user code
|
||||
await writeFile(path.join(entrypointDirname, mainGoFileName), mainGoContents)
|
||||
await writeFile(path.join(entrypointDirname, mainGoFileName), mainGoContents);
|
||||
|
||||
|
||||
console.log('installing dependencies')
|
||||
console.log('installing dependencies');
|
||||
// `go get` will look at `*.go` (note we set `cwd`), parse
|
||||
// the `import`s and download any packages that aren't part of the stdlib
|
||||
try {
|
||||
await execa(goBin, ['get'], {env: goEnv, cwd: entrypointDirname, stdio: 'inherit'});
|
||||
} catch (err) {
|
||||
console.log('failed to `go get`')
|
||||
throw err
|
||||
await execa(goBin, ['get'], {
|
||||
env: goEnv,
|
||||
cwd: entrypointDirname,
|
||||
stdio: 'inherit',
|
||||
});
|
||||
} catch (err) {
|
||||
console.log('failed to `go get`');
|
||||
throw err;
|
||||
}
|
||||
|
||||
console.log('running go build...')
|
||||
console.log('running go build...');
|
||||
try {
|
||||
await execa(goBin, [
|
||||
'build',
|
||||
'-o', path.join(outDir, 'handler'),
|
||||
path.join(entrypointDirname, mainGoFileName), files[entrypoint].fsPath
|
||||
], {env: goEnv, cwd: entrypointDirname, stdio: 'inherit'})
|
||||
} catch (err) {
|
||||
console.log('failed to `go build`')
|
||||
throw err
|
||||
await execa(
|
||||
goBin,
|
||||
[
|
||||
'build',
|
||||
'-o',
|
||||
path.join(outDir, 'handler'),
|
||||
path.join(entrypointDirname, mainGoFileName),
|
||||
downloadedFiles[entrypoint].fsPath,
|
||||
],
|
||||
{ env: goEnv, cwd: entrypointDirname, stdio: 'inherit' },
|
||||
);
|
||||
} catch (err) {
|
||||
console.log('failed to `go build`');
|
||||
throw err;
|
||||
}
|
||||
|
||||
|
||||
const lambda = await createLambda({
|
||||
files: await glob('**', outDir),
|
||||
handler: 'handler',
|
||||
runtime: 'go1.x',
|
||||
environment: {}
|
||||
})
|
||||
environment: {},
|
||||
});
|
||||
|
||||
return {
|
||||
[entrypoint]: lambda
|
||||
}
|
||||
}
|
||||
[entrypoint]: lambda,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/go",
|
||||
"version": "0.2.7-canary.1",
|
||||
"version": "0.2.9",
|
||||
"scripts": {
|
||||
"test": "best -I test/*.js",
|
||||
"prepublish": "./build.sh"
|
||||
@@ -16,11 +16,14 @@
|
||||
"fs-extra": "^7.0.0",
|
||||
"lambda-git": "^0.1.2",
|
||||
"mkdirp-promise": "5.0.1",
|
||||
"now-fetch": "0.1.1",
|
||||
"node-fetch": "^2.2.1",
|
||||
"tar": "4.4.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@zeit/best": "0.4.3",
|
||||
"rmfr": "2.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,32 +2,30 @@ const FileBlob = require('@now/build-utils/file-blob.js');
|
||||
const { minify } = require('html-minifier');
|
||||
|
||||
const defaultOptions = {
|
||||
minifyCSS: true,
|
||||
minifyJS: true,
|
||||
removeComments: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeOptionalTags: true,
|
||||
removeRedundantAttributes: true,
|
||||
useShortDoctype: true,
|
||||
collapseWhitespace: true,
|
||||
collapseInlineTagWhitespace: true,
|
||||
collapseBooleanAttributes: true,
|
||||
caseSensitive: true
|
||||
minifyCSS: true,
|
||||
minifyJS: true,
|
||||
removeComments: true,
|
||||
removeAttributeQuotes: true,
|
||||
removeEmptyAttributes: true,
|
||||
removeOptionalTags: true,
|
||||
removeRedundantAttributes: true,
|
||||
useShortDoctype: true,
|
||||
collapseWhitespace: true,
|
||||
collapseInlineTagWhitespace: true,
|
||||
collapseBooleanAttributes: true,
|
||||
caseSensitive: true,
|
||||
};
|
||||
|
||||
exports.analyze = ({ files, entrypoint }) => {
|
||||
return files[entrypoint].digest;
|
||||
};
|
||||
exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest;
|
||||
|
||||
exports.build = async ({ files, entrypoint, config }) => {
|
||||
const stream = files[entrypoint].toStream();
|
||||
const options = Object.assign({}, defaultOptions, config || {});
|
||||
const { data } = await FileBlob.fromStream({ stream });
|
||||
const content = data.toString();
|
||||
const stream = files[entrypoint].toStream();
|
||||
const options = Object.assign({}, defaultOptions, config || {});
|
||||
const { data } = await FileBlob.fromStream({ stream });
|
||||
const content = data.toString();
|
||||
|
||||
const minified = minify(content, options);
|
||||
const result = new FileBlob({ data: minified });
|
||||
const minified = minify(content, options);
|
||||
const result = new FileBlob({ data: minified });
|
||||
|
||||
return { [entrypoint]: result };
|
||||
return { [entrypoint]: result };
|
||||
};
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{
|
||||
"name": "@now/html-minifier",
|
||||
"version": "1.0.3-canary.1",
|
||||
"version": "1.0.5",
|
||||
"dependencies": {
|
||||
"html-minifier": "3.5.21"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,24 +1,12 @@
|
||||
const { Lambda } = require('@now/build-utils/lambda.js');
|
||||
const path = require('path');
|
||||
const streamToBuffer = require('@now/build-utils/fs/stream-to-buffer.js');
|
||||
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
exports.build = async ({ files, entrypoint, config }) => {
|
||||
if (!files[entrypoint]) throw new Error('Entrypoint not found in files');
|
||||
|
||||
// handler=launcher.main!runtime=nodejs8.10!name.zip
|
||||
const config = path.basename(entrypoint).split('!').reduce((a, c) => {
|
||||
const [ k, v ] = c.split('=');
|
||||
if (v) a[k] = v;
|
||||
return a;
|
||||
}, {});
|
||||
|
||||
if (!config.handler) throw new Error('Handler not found in config');
|
||||
if (!config.runtime) throw new Error('Runtime not found in config');
|
||||
|
||||
const lambda = new Lambda({
|
||||
zipStream: files[entrypoint].toStream(), // TODO zipBuffer
|
||||
handler: config.handler,
|
||||
runtime: config.runtime
|
||||
});
|
||||
|
||||
const { handler, runtime } = config;
|
||||
if (!handler) throw new Error('Handler not found in config');
|
||||
if (!runtime) throw new Error('Runtime not found in config');
|
||||
const zipBuffer = await streamToBuffer(files[entrypoint].toStream());
|
||||
const lambda = new Lambda({ zipBuffer, handler, runtime });
|
||||
return { [entrypoint]: lambda };
|
||||
};
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"name": "@now/lambda",
|
||||
"version": "0.4.4-canary.1"
|
||||
"version": "0.4.6",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,37 +1,42 @@
|
||||
const FileBlob = require('@now/build-utils/file-blob.js');
|
||||
const unified = require('unified')
|
||||
const unifiedStream = require('unified-stream')
|
||||
const markdown = require('remark-parse')
|
||||
const remark2rehype = require('remark-rehype')
|
||||
const doc = require('rehype-document')
|
||||
const format = require('rehype-format')
|
||||
const html = require('rehype-stringify')
|
||||
const unified = require('unified');
|
||||
const unifiedStream = require('unified-stream');
|
||||
const markdown = require('remark-parse');
|
||||
const remark2rehype = require('remark-rehype');
|
||||
const doc = require('rehype-document');
|
||||
const format = require('rehype-format');
|
||||
const html = require('rehype-stringify');
|
||||
|
||||
exports.analyze = ({ files, entrypoint }) => {
|
||||
return files[entrypoint].digest;
|
||||
};
|
||||
exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest;
|
||||
|
||||
exports.build = async ({ files, entrypoint, config }) => {
|
||||
const stream = files[entrypoint].toStream();
|
||||
const options = config || {}
|
||||
const options = config || {};
|
||||
|
||||
const title = options.title || null
|
||||
const language = options.language || 'en'
|
||||
const meta = options.meta || null
|
||||
const css = options.css || null
|
||||
const title = options.title || null;
|
||||
const language = options.language || 'en';
|
||||
const meta = options.meta || null;
|
||||
const css = options.css || null;
|
||||
|
||||
const processor = unified()
|
||||
.use(markdown)
|
||||
.use(remark2rehype)
|
||||
.use(doc, { title, language, meta, css })
|
||||
.use(doc, {
|
||||
title,
|
||||
language,
|
||||
meta,
|
||||
css,
|
||||
})
|
||||
.use(format)
|
||||
.use(html);
|
||||
|
||||
const result = await FileBlob.fromStream({ stream: stream.pipe(unifiedStream(processor)) });
|
||||
const result = await FileBlob.fromStream({
|
||||
stream: stream.pipe(unifiedStream(processor)),
|
||||
});
|
||||
|
||||
console.log(result.data.toString())
|
||||
console.log(result.data.toString());
|
||||
|
||||
entrypoint = entrypoint.replace(/\.[^\.]+$/, '.html');
|
||||
const replacedEntrypoint = entrypoint.replace(/\.[^.]+$/, '.html');
|
||||
|
||||
return { [entrypoint]: result };
|
||||
return { [replacedEntrypoint]: result };
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/md",
|
||||
"version": "0.4.4-canary.1",
|
||||
"version": "0.4.6",
|
||||
"dependencies": {
|
||||
"rehype-document": "^2.2.0",
|
||||
"rehype-format": "^2.3.0",
|
||||
@@ -9,5 +9,8 @@
|
||||
"remark-rehype": "^3.0.1",
|
||||
"unified": "^7.0.0",
|
||||
"unified-stream": "^1.0.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,39 +6,43 @@ const glob = require('@now/build-utils/fs/glob.js');
|
||||
const path = require('path');
|
||||
const { runNpmInstall } = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
|
||||
exports.analyze = ({ files, entrypoint }) => {
|
||||
return files[entrypoint].digest;
|
||||
};
|
||||
exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest;
|
||||
|
||||
const writeFile = promisify(fs.writeFile);
|
||||
|
||||
exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
console.log('downloading user files...');
|
||||
files = await download(files, workPath);
|
||||
const downloadedFiles = await download(files, workPath);
|
||||
console.log('writing package.json...');
|
||||
const packageJson = { dependencies: { 'mdx-deck': '1.7.7' } };
|
||||
const packageJsonPath = path.join(workPath, 'package.json');
|
||||
await writeFile(packageJsonPath, JSON.stringify(packageJson));
|
||||
console.log('running npm install...');
|
||||
process.env.PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = '1'; // TODO opts argument for runNpmInstall
|
||||
await runNpmInstall(path.dirname(packageJsonPath), [ '--prod', '--prefer-offline' ]);
|
||||
await runNpmInstall(path.dirname(packageJsonPath), [
|
||||
'--prod',
|
||||
'--prefer-offline',
|
||||
]);
|
||||
console.log('building...');
|
||||
const outDir = await getWritableDirectory();
|
||||
const entrypointFsPath = files[entrypoint].fsPath;
|
||||
const entrypointFsPath = downloadedFiles[entrypoint].fsPath;
|
||||
const mountpoint = path.dirname(entrypoint);
|
||||
|
||||
const build = require(path.join(workPath, 'node_modules/mdx-deck/lib/build.js'));
|
||||
const build = require(path.join(
|
||||
workPath,
|
||||
'node_modules/mdx-deck/lib/build.js',
|
||||
));
|
||||
|
||||
await build({
|
||||
html: true,
|
||||
dirname: workPath,
|
||||
outDir,
|
||||
globals: {
|
||||
FILENAME: JSON.stringify(entrypointFsPath)
|
||||
}
|
||||
FILENAME: JSON.stringify(entrypointFsPath),
|
||||
},
|
||||
});
|
||||
|
||||
return await glob('**', outDir, mountpoint);
|
||||
return glob('**', outDir, mountpoint);
|
||||
};
|
||||
|
||||
exports.prepareCache = async ({ cachePath }) => {
|
||||
@@ -47,11 +51,11 @@ exports.prepareCache = async ({ cachePath }) => {
|
||||
const packageJsonPath = path.join(cachePath, 'package.json');
|
||||
await writeFile(packageJsonPath, JSON.stringify(packageJson));
|
||||
console.log('running npm install...');
|
||||
await runNpmInstall(path.dirname(packageJsonPath), [ '--prod' ]);
|
||||
await runNpmInstall(path.dirname(packageJsonPath), ['--prod']);
|
||||
|
||||
return {
|
||||
...await glob('node_modules/**', cachePath),
|
||||
...await glob('package-lock.json', cachePath),
|
||||
...await glob('yarn.lock', cachePath)
|
||||
...(await glob('node_modules/**', cachePath)),
|
||||
...(await glob('package-lock.json', cachePath)),
|
||||
...(await glob('yarn.lock', cachePath)),
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"name": "@now/mdx-deck",
|
||||
"version": "0.4.13-canary.1"
|
||||
"version": "0.4.15",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,161 +1,206 @@
|
||||
const { createLambda } = require('@now/build-utils/lambda.js');
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const FileFsRef = require('@now/build-utils/file-fs-ref.js');
|
||||
const FileBlob = require('@now/build-utils/file-blob');
|
||||
const path = require('path');
|
||||
const { readFile, writeFile, unlink } = require('fs.promised');
|
||||
const rename = require('@now/build-utils/fs/rename.js');
|
||||
const { runNpmInstall, runPackageJsonScript
|
||||
const {
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
const {
|
||||
excludeFiles,
|
||||
validateEntrypoint,
|
||||
includeOnlyEntryDirectory,
|
||||
moveEntryDirectoryToRoot,
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
} = require('./utils');
|
||||
|
||||
// Exclude certain files from the files object
|
||||
function excludeFiles(files, matchFn) {
|
||||
return Object.keys(files).reduce((newFiles, fileName) => {
|
||||
if(matchFn(fileName)) {
|
||||
return newFiles
|
||||
}
|
||||
newFiles[fileName] = files[fileName]
|
||||
return newFiles
|
||||
}, {})
|
||||
/** @typedef { import('@now/build-utils/file-ref').Files } Files */
|
||||
/** @typedef { import('@now/build-utils/fs/download').DownloadedFiles } DownloadedFiles */
|
||||
|
||||
/**
|
||||
* @typedef {Object} BuildParamsType
|
||||
* @property {Files} files - Files object
|
||||
* @property {string} entrypoint - Entrypoint specified for the builder
|
||||
* @property {string} workPath - Working directory for this build
|
||||
*/
|
||||
|
||||
/**
|
||||
* Read package.json from files
|
||||
* @param {DownloadedFiles} files
|
||||
*/
|
||||
async function readPackageJson(files) {
|
||||
if (!files['package.json']) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const packageJsonPath = files['package.json'].fsPath;
|
||||
return JSON.parse(await readFile(packageJsonPath, 'utf8'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Write package.json
|
||||
* @param {string} workPath
|
||||
* @param {Object} packageJson
|
||||
*/
|
||||
async function writePackageJson(workPath, packageJson) {
|
||||
await writeFile(
|
||||
path.join(workPath, 'package.json'),
|
||||
JSON.stringify(packageJson, null, 2),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write .npmrc with npm auth token
|
||||
* @param {string} workPath
|
||||
* @param {string} token
|
||||
*/
|
||||
async function writeNpmRc(workPath, token) {
|
||||
await writeFile(
|
||||
path.join(workPath, '.npmrc'),
|
||||
`//registry.npmjs.org/:_authToken=${token}`,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {BuildParamsType} buildParams
|
||||
* @returns {Promise<Files>}
|
||||
*/
|
||||
exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
if(!/package\.json$/.exec(entrypoint) && !/next\.config\.js$/.exec(entrypoint)) {
|
||||
throw new Error(`Specified "src" for "@now/next" has to be "package.json" or "next.config.js"`)
|
||||
}
|
||||
validateEntrypoint(entrypoint);
|
||||
|
||||
const entryDirectory = path.dirname(entrypoint)
|
||||
console.log('downloading user files...');
|
||||
const filesToDownload = excludeFiles(files, (file) => {
|
||||
// If the file is not in the entry directory
|
||||
if(entryDirectory !== '.' && !file.startsWith(entryDirectory)) {
|
||||
return true
|
||||
}
|
||||
const entryDirectory = path.dirname(entrypoint);
|
||||
const filesOnlyEntryDirectory = includeOnlyEntryDirectory(
|
||||
files,
|
||||
entryDirectory,
|
||||
);
|
||||
const filesWithEntryDirectoryRoot = moveEntryDirectoryToRoot(
|
||||
filesOnlyEntryDirectory,
|
||||
entryDirectory,
|
||||
);
|
||||
const filesWithoutLockfiles = excludeLockFiles(filesWithEntryDirectoryRoot);
|
||||
const filesWithoutStaticDirectory = excludeStaticDirectory(
|
||||
filesWithoutLockfiles,
|
||||
);
|
||||
let downloadedFiles = await download(filesWithoutStaticDirectory, workPath);
|
||||
|
||||
// Exclude static directory
|
||||
if(file.startsWith(path.join(entryDirectory, 'static'))) {
|
||||
return true
|
||||
}
|
||||
console.log('normalizing package.json');
|
||||
const packageJson = normalizePackageJson(readPackageJson(downloadedFiles));
|
||||
await writePackageJson(workPath, packageJson);
|
||||
|
||||
if(file === 'package-lock.json') {
|
||||
return true
|
||||
}
|
||||
|
||||
if(file === 'yarn.lock') {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
files = await download(rename(filesToDownload, (file) => {
|
||||
if(entryDirectory !== '.') {
|
||||
return file.replace(new RegExp(`^${entryDirectory}/`), '')
|
||||
}
|
||||
return file
|
||||
}), workPath);
|
||||
|
||||
let packageJson = {}
|
||||
if (files['package.json']) {
|
||||
console.log('found package.json, overwriting')
|
||||
const packageJsonPath = files['package.json'].fsPath
|
||||
packageJson = JSON.parse(await readFile(packageJsonPath, 'utf8'))
|
||||
if (process.env.NPM_AUTH_TOKEN) {
|
||||
console.log('found NPM_AUTH_TOKEN in environment, creating .npmrc');
|
||||
await writeNpmRc(workPath, process.env.NPM_AUTH_TOKEN);
|
||||
}
|
||||
|
||||
packageJson = {
|
||||
...packageJson,
|
||||
dependencies: {
|
||||
...packageJson.dependencies,
|
||||
'next-server': 'canary'
|
||||
},
|
||||
devDependencies: {
|
||||
...packageJson.devDependencies,
|
||||
'next': 'canary'
|
||||
},
|
||||
scripts: {
|
||||
...packageJson.scripts,
|
||||
'now-build': 'next build'
|
||||
}
|
||||
}
|
||||
|
||||
if(!packageJson.dependencies.react) {
|
||||
console.log('"react" not found in dependencies, adding to "package.json" "dependencies"')
|
||||
packageJson.dependencies['react'] = 'latest'
|
||||
}
|
||||
if(!packageJson.dependencies['react-dom']) {
|
||||
console.log('"react-dom" not found in dependencies, adding to "package.json" "dependencies"')
|
||||
packageJson.dependencies['react-dom'] = 'latest'
|
||||
}
|
||||
|
||||
// in case the user has `next` on their `dependencies`, we remove it
|
||||
delete packageJson.dependencies.next
|
||||
|
||||
console.log('>>>>>>', JSON.stringify(packageJson))
|
||||
await writeFile(path.join(workPath, 'package.json'), JSON.stringify(packageJson, null, 2))
|
||||
|
||||
if(process.env.NPM_AUTH_TOKEN) {
|
||||
console.log('found NPM_AUTH_TOKEN in environement, creating .npmrc')
|
||||
await writeFile(path.join(workPath, '.npmrc'), `//registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN}`)
|
||||
}
|
||||
files = await glob('**', workPath);
|
||||
downloadedFiles = await glob('**', workPath);
|
||||
|
||||
console.log('running npm install...');
|
||||
await runNpmInstall(workPath, [ '--prefer-offline' ]);
|
||||
await runNpmInstall(workPath, ['--prefer-offline']);
|
||||
console.log('running user script...');
|
||||
await runPackageJsonScript(workPath, 'now-build');
|
||||
console.log('running npm install --production...');
|
||||
await runNpmInstall(workPath, [ '--prefer-offline', '--production' ]);
|
||||
if(process.env.NPM_AUTH_TOKEN) {
|
||||
await unlink(path.join(workPath, '.npmrc'))
|
||||
await runNpmInstall(workPath, ['--prefer-offline', '--production']);
|
||||
if (process.env.NPM_AUTH_TOKEN) {
|
||||
await unlink(path.join(workPath, '.npmrc'));
|
||||
}
|
||||
files = await glob('**', workPath)
|
||||
|
||||
downloadedFiles = await glob('**', workPath);
|
||||
|
||||
console.log('preparing lambda files...');
|
||||
let buildId
|
||||
let buildId;
|
||||
try {
|
||||
buildId = await readFile(path.join(workPath, '.next', 'BUILD_ID'), 'utf8')
|
||||
} catch(err) {
|
||||
console.error(`BUILD_ID not found in ".next". The "package.json" "build" script did not run "next build"`)
|
||||
throw new Error('Missing BUILD_ID')
|
||||
buildId = await readFile(path.join(workPath, '.next', 'BUILD_ID'), 'utf8');
|
||||
} catch (err) {
|
||||
console.error(
|
||||
'BUILD_ID not found in ".next". The "package.json" "build" script did not run "next build"',
|
||||
);
|
||||
throw new Error('Missing BUILD_ID');
|
||||
}
|
||||
const dotNextRootFiles = await glob('.next/*', workPath)
|
||||
const dotNextServerRootFiles = await glob('.next/server/*', workPath)
|
||||
const nodeModules = excludeFiles(await glob('node_modules/**', workPath), (file) => file.startsWith('node_modules/.cache'))
|
||||
const dotNextRootFiles = await glob('.next/*', workPath);
|
||||
const dotNextServerRootFiles = await glob('.next/server/*', workPath);
|
||||
const nodeModules = excludeFiles(
|
||||
await glob('node_modules/**', workPath),
|
||||
file => file.startsWith('node_modules/.cache'),
|
||||
);
|
||||
const launcherFiles = {
|
||||
'now__launcher.js': new FileFsRef({ fsPath: path.join(__dirname, 'launcher.js') }),
|
||||
'now__bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') })
|
||||
'now__bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') }),
|
||||
};
|
||||
const nextFiles = {...nodeModules, ...dotNextRootFiles, ...dotNextServerRootFiles, ...launcherFiles}
|
||||
if(files['next.config.js']) {
|
||||
nextFiles['next.config.js'] = files['next.config.js']
|
||||
const nextFiles = {
|
||||
...nodeModules,
|
||||
...dotNextRootFiles,
|
||||
...dotNextServerRootFiles,
|
||||
...launcherFiles,
|
||||
};
|
||||
if (downloadedFiles['next.config.js']) {
|
||||
nextFiles['next.config.js'] = downloadedFiles['next.config.js'];
|
||||
}
|
||||
const pages = await glob('**/*.js', path.join(workPath, '.next', 'server', 'static', buildId, 'pages'))
|
||||
const pages = await glob(
|
||||
'**/*.js',
|
||||
path.join(workPath, '.next', 'server', 'static', buildId, 'pages'),
|
||||
);
|
||||
const launcherPath = path.join(__dirname, 'launcher.js');
|
||||
const launcherData = await readFile(launcherPath, 'utf8');
|
||||
|
||||
const lambdas = {}
|
||||
for(const page in pages) {
|
||||
// These default pages don't have to be handled a rendering, they'd always 404
|
||||
if(['_app.js', '_error.js', '_document.js'].includes(page)) {
|
||||
continue
|
||||
}
|
||||
const lambdas = {};
|
||||
await Promise.all(
|
||||
Object.keys(pages).map(async (page) => {
|
||||
// These default pages don't have to be handled as they'd always 404
|
||||
if (['_app.js', '_error.js', '_document.js'].includes(page)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const pageFiles = {
|
||||
[`.next/server/static/${buildId}/pages/_document.js`]: files[`.next/server/static/${buildId}/pages/_document.js`],
|
||||
[`.next/server/static/${buildId}/pages/_app.js`]: files[`.next/server/static/${buildId}/pages/_app.js`],
|
||||
[`.next/server/static/${buildId}/pages/_error.js`]: files[`.next/server/static/${buildId}/pages/_error.js`],
|
||||
[`.next/server/static/${buildId}/pages/${page}`]: files[`.next/server/static/${buildId}/pages/${page}`]
|
||||
}
|
||||
const pathname = page.replace(/\.js$/, '');
|
||||
const launcher = launcherData.replace(
|
||||
'PATHNAME_PLACEHOLDER',
|
||||
`/${pathname.replace(/(^|\/)index$/, '')}`,
|
||||
);
|
||||
|
||||
lambdas[path.join(entryDirectory, page.replace(/\.js$/, ''))] = await createLambda({
|
||||
files: {...nextFiles, ...pageFiles},
|
||||
handler: 'now__launcher.launcher',
|
||||
runtime: 'nodejs8.10'
|
||||
})
|
||||
}
|
||||
const pageFiles = {
|
||||
[`.next/server/static/${buildId}/pages/_document.js`]: downloadedFiles[
|
||||
`.next/server/static/${buildId}/pages/_document.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/_app.js`]: downloadedFiles[
|
||||
`.next/server/static/${buildId}/pages/_app.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/_error.js`]: downloadedFiles[
|
||||
`.next/server/static/${buildId}/pages/_error.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/${page}`]: downloadedFiles[
|
||||
`.next/server/static/${buildId}/pages/${page}`
|
||||
],
|
||||
};
|
||||
|
||||
const nextStaticFiles = await glob('**', path.join(workPath, '.next', 'static'))
|
||||
const staticFiles = {}
|
||||
for(const staticFile in nextStaticFiles) {
|
||||
staticFiles[path.join(entryDirectory, '_next/static/' + staticFile)] = nextStaticFiles[staticFile]
|
||||
}
|
||||
console.log(`Creating lambda for page: "${page}"...`);
|
||||
lambdas[path.join(entryDirectory, pathname)] = await createLambda({
|
||||
files: {
|
||||
...nextFiles,
|
||||
...pageFiles,
|
||||
'now__launcher.js': new FileBlob({ data: launcher }),
|
||||
},
|
||||
handler: 'now__launcher.launcher',
|
||||
runtime: 'nodejs8.10',
|
||||
});
|
||||
console.log(`Created lambda for page: "${page}"`);
|
||||
}),
|
||||
);
|
||||
|
||||
const nextStaticFiles = await glob(
|
||||
'**',
|
||||
path.join(workPath, '.next', 'static'),
|
||||
);
|
||||
const staticFiles = Object.keys(nextStaticFiles).reduce(
|
||||
(mappedFiles, file) => ({
|
||||
...mappedFiles,
|
||||
[path.join(entryDirectory, `_next/static/${file}`)]: nextStaticFiles[file],
|
||||
}),
|
||||
{},
|
||||
);
|
||||
|
||||
return { ...lambdas, ...staticFiles };
|
||||
};
|
||||
@@ -163,20 +208,22 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
exports.prepareCache = async ({ files, cachePath, workPath }) => {
|
||||
console.log('downloading user files...');
|
||||
await download(files, cachePath);
|
||||
await download(await glob('.next/**', workPath), cachePath)
|
||||
await download(await glob('node_modules/**', workPath), cachePath)
|
||||
await download(await glob('.next/**', workPath), cachePath);
|
||||
await download(await glob('node_modules/**', workPath), cachePath);
|
||||
|
||||
console.log('.next folder contents', await glob('.next/**', cachePath))
|
||||
console.log('.cache folder contents', await glob('node_modules/.cache/**', cachePath))
|
||||
console.log('.next folder contents', await glob('.next/**', cachePath));
|
||||
console.log(
|
||||
'.cache folder contents',
|
||||
await glob('node_modules/.cache/**', cachePath),
|
||||
);
|
||||
|
||||
console.log('running npm install...');
|
||||
await runNpmInstall(cachePath);
|
||||
|
||||
|
||||
return {
|
||||
...await glob('.next/records.json', cachePath),
|
||||
...await glob('.next/server/records.json', cachePath),
|
||||
...await glob('node_modules/**', cachePath),
|
||||
...await glob('yarn.lock', cachePath)
|
||||
...(await glob('.next/records.json', cachePath)),
|
||||
...(await glob('.next/server/records.json', cachePath)),
|
||||
...(await glob('node_modules/**', cachePath)),
|
||||
...(await glob('yarn.lock', cachePath)),
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,15 +1,19 @@
|
||||
const { Bridge } = require('./now__bridge.js');
|
||||
const { Server } = require('http');
|
||||
const next = require('next-server')
|
||||
const next = require('next-server');
|
||||
const url = require('url');
|
||||
const { Bridge } = require('./now__bridge.js');
|
||||
|
||||
const bridge = new Bridge();
|
||||
bridge.port = 3000;
|
||||
|
||||
process.env.NODE_ENV = 'production';
|
||||
|
||||
const app = next({})
|
||||
const handler = app.getRequestHandler()
|
||||
const app = next({});
|
||||
|
||||
const server = new Server(handler);
|
||||
const server = new Server((req, res) => {
|
||||
const parsedUrl = url.parse(req.url, true);
|
||||
app.render(req, res, 'PATHNAME_PLACEHOLDER', parsedUrl.query, parsedUrl);
|
||||
});
|
||||
server.listen(bridge.port);
|
||||
|
||||
exports.launcher = bridge.launcher;
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
{
|
||||
"name": "@now/next",
|
||||
"version": "0.0.74-canary.1",
|
||||
"version": "0.0.78",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "0.1.4",
|
||||
"execa": "^1.0.0",
|
||||
"fs.promised": "^3.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
151
packages/now-next/utils.js
Normal file
151
packages/now-next/utils.js
Normal file
@@ -0,0 +1,151 @@
|
||||
const rename = require('@now/build-utils/fs/rename.js');
|
||||
|
||||
/** @typedef { import('@now/build-utils/file-ref') } FileRef */
|
||||
/** @typedef { import('@now/build-utils/file-fs-ref') } FileFsRef */
|
||||
/** @typedef {{[filePath: string]: FileRef|FileFsRef}} Files */
|
||||
|
||||
/**
|
||||
* Validate if the entrypoint is allowed to be used
|
||||
* @param {string} entrypoint
|
||||
* @throws {Error}
|
||||
*/
|
||||
function validateEntrypoint(entrypoint) {
|
||||
if (
|
||||
!/package\.json$/.exec(entrypoint)
|
||||
&& !/next\.config\.js$/.exec(entrypoint)
|
||||
) {
|
||||
throw new Error(
|
||||
'Specified "src" for "@now/next" has to be "package.json" or "next.config.js"',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This callback type is called `requestCallback` and is displayed as a global symbol.
|
||||
*
|
||||
* @callback matcher
|
||||
* @param {string} filePath
|
||||
* @returns {boolean}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Exclude certain files from the files object
|
||||
* @param {Files} files
|
||||
* @param {matcher} matcher
|
||||
* @returns {Files}
|
||||
*/
|
||||
function excludeFiles(files, matcher) {
|
||||
return Object.keys(files).reduce((newFiles, filePath) => {
|
||||
if (matcher(filePath)) {
|
||||
return newFiles;
|
||||
}
|
||||
return {
|
||||
...newFiles,
|
||||
[filePath]: files[filePath],
|
||||
};
|
||||
}, {});
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Files object holding only the entrypoint files
|
||||
* @param {Files} files
|
||||
* @param {string} entryDirectory
|
||||
* @returns {Files}
|
||||
*/
|
||||
function includeOnlyEntryDirectory(files, entryDirectory) {
|
||||
if (entryDirectory === '.') {
|
||||
return files;
|
||||
}
|
||||
|
||||
function matcher(filePath) {
|
||||
return !filePath.startsWith(entryDirectory);
|
||||
}
|
||||
|
||||
return excludeFiles(files, matcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves all files under the entry directory to the root directory
|
||||
* @param {Files} files
|
||||
* @param {string} entryDirectory
|
||||
* @returns {Files}
|
||||
*/
|
||||
function moveEntryDirectoryToRoot(files, entryDirectory) {
|
||||
if (entryDirectory === '.') {
|
||||
return files;
|
||||
}
|
||||
|
||||
function delegate(filePath) {
|
||||
return filePath.replace(new RegExp(`^${entryDirectory}/`), '');
|
||||
}
|
||||
|
||||
return rename(files, delegate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude package manager lockfiles from files
|
||||
* @param {Files} files
|
||||
* @returns {Files}
|
||||
*/
|
||||
function excludeLockFiles(files) {
|
||||
const newFiles = files;
|
||||
if (newFiles['package-lock.json']) {
|
||||
delete newFiles['package-lock.json'];
|
||||
}
|
||||
if (newFiles['yarn.lock']) {
|
||||
delete newFiles['yarn.lock'];
|
||||
}
|
||||
return files;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude the static directory from files
|
||||
* @param {Files} files
|
||||
* @returns {Files}
|
||||
*/
|
||||
function excludeStaticDirectory(files) {
|
||||
function matcher(filePath) {
|
||||
return filePath.startsWith('static');
|
||||
}
|
||||
|
||||
return excludeFiles(files, matcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforce specific package.json configuration for smallest possible lambda
|
||||
* @param {Object} defaultPackageJson
|
||||
*/
|
||||
function normalizePackageJson(defaultPackageJson = {}) {
|
||||
return {
|
||||
...defaultPackageJson,
|
||||
dependencies: {
|
||||
// react and react-dom can be overwritten
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
...defaultPackageJson.dependencies,
|
||||
// next-server is forced to canary
|
||||
'next-server': 'canary',
|
||||
next: undefined,
|
||||
},
|
||||
devDependencies: {
|
||||
...defaultPackageJson.devDependencies,
|
||||
// next is forced to canary
|
||||
next: 'canary',
|
||||
'next-server': undefined,
|
||||
},
|
||||
scripts: {
|
||||
...defaultPackageJson.scripts,
|
||||
'now-build': 'next build',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
excludeFiles,
|
||||
validateEntrypoint,
|
||||
includeOnlyEntryDirectory,
|
||||
moveEntryDirectoryToRoot,
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
};
|
||||
@@ -1,12 +1,52 @@
|
||||
const assert = require('assert');
|
||||
const http = require('http');
|
||||
|
||||
function normalizeEvent(event) {
|
||||
if (event.Action === 'Invoke') {
|
||||
const invokeEvent = JSON.parse(event.body);
|
||||
|
||||
const {
|
||||
method, path, headers, encoding,
|
||||
} = invokeEvent;
|
||||
|
||||
let { body } = invokeEvent;
|
||||
|
||||
if (body) {
|
||||
if (encoding === 'base64') {
|
||||
body = Buffer.from(body, encoding);
|
||||
} else if (encoding === undefined) {
|
||||
body = Buffer.from(body);
|
||||
} else {
|
||||
throw new Error(`Unsupported encoding: ${encoding}`);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
method,
|
||||
path,
|
||||
headers,
|
||||
body,
|
||||
};
|
||||
}
|
||||
|
||||
const {
|
||||
httpMethod: method, path, headers, body,
|
||||
} = event;
|
||||
|
||||
return {
|
||||
method,
|
||||
path,
|
||||
headers,
|
||||
body,
|
||||
};
|
||||
}
|
||||
|
||||
class Bridge {
|
||||
constructor () {
|
||||
constructor() {
|
||||
this.launcher = this.launcher.bind(this);
|
||||
}
|
||||
|
||||
launcher (event) {
|
||||
launcher(event) {
|
||||
// eslint-disable-next-line consistent-return
|
||||
return new Promise((resolve, reject) => {
|
||||
if (this.userError) {
|
||||
console.error('Error while initializing entrypoint:', this.userError);
|
||||
@@ -17,45 +57,32 @@ class Bridge {
|
||||
return resolve({ statusCode: 504, body: '' });
|
||||
}
|
||||
|
||||
let method, path, headers, body;
|
||||
|
||||
if (event.Action === 'Invoke') {
|
||||
event = JSON.parse(event.body);
|
||||
method = event.method;
|
||||
path = event.path;
|
||||
headers = event.headers;
|
||||
if (event.body) {
|
||||
assert(event.encoding === 'base64', JSON.stringify(event)); // do we support anything else?
|
||||
body = Buffer.from(event.body, event.encoding);
|
||||
}
|
||||
} else {
|
||||
method = event.httpMethod;
|
||||
path = event.path;
|
||||
headers = event.headers;
|
||||
body = event.body;
|
||||
}
|
||||
const {
|
||||
method, path, headers, body,
|
||||
} = normalizeEvent(event);
|
||||
|
||||
const opts = {
|
||||
hostname: '127.0.0.1',
|
||||
port: this.port,
|
||||
path,
|
||||
method,
|
||||
headers
|
||||
headers,
|
||||
};
|
||||
|
||||
const req = http.request(opts, (resp) => {
|
||||
const req = http.request(opts, (res) => {
|
||||
const response = res;
|
||||
const respBodyChunks = [];
|
||||
resp.on('data', (chunk) => respBodyChunks.push(Buffer.from(chunk)));
|
||||
resp.on('error', (error) => reject(error));
|
||||
resp.on('end', () => {
|
||||
delete resp.headers.connection;
|
||||
delete resp.headers['content-length'];
|
||||
response.on('data', chunk => respBodyChunks.push(Buffer.from(chunk)));
|
||||
response.on('error', error => reject(error));
|
||||
response.on('end', () => {
|
||||
delete response.headers.connection;
|
||||
delete response.headers['content-length'];
|
||||
|
||||
resolve({
|
||||
statusCode: resp.statusCode,
|
||||
headers: resp.headers,
|
||||
statusCode: response.statusCode,
|
||||
headers: response.headers,
|
||||
body: Buffer.concat(respBodyChunks).toString('base64'),
|
||||
encoding: 'base64'
|
||||
encoding: 'base64',
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -67,5 +94,5 @@ class Bridge {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
Bridge
|
||||
Bridge,
|
||||
};
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
const path = require('path');
|
||||
|
||||
module.exports = path.join(__dirname, 'bridge.js');
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"name": "@now/node-bridge",
|
||||
"version": "0.1.6-canary.1"
|
||||
"version": "0.1.8",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,23 +2,27 @@ const { createLambda } = require('@now/build-utils/lambda.js');
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const FileBlob = require('@now/build-utils/file-blob.js');
|
||||
const FileFsRef = require('@now/build-utils/file-fs-ref.js');
|
||||
const fs = require('fs');
|
||||
const fs = require('fs-extra');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
const path = require('path');
|
||||
const { promisify } = require('util');
|
||||
const { runNpmInstall, runPackageJsonScript
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
const {
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
|
||||
const fsp = {
|
||||
readFile: promisify(fs.readFile)
|
||||
readFile: promisify(fs.readFile),
|
||||
};
|
||||
|
||||
async function commonForTwo ({ files, entrypoint, workPath, cachePath }) {
|
||||
async function commonForTwo({
|
||||
files, entrypoint, workPath, cachePath,
|
||||
}) {
|
||||
const xPath = workPath || cachePath;
|
||||
const preferOfflineArgument = workPath ? [ '--prefer-offline' ] : [];
|
||||
const preferOfflineArgument = workPath ? ['--prefer-offline'] : [];
|
||||
|
||||
const xUserPath = path.join(xPath, 'user');
|
||||
const xRollupPath = path.join(xPath, 'rollup');
|
||||
const xNccPath = path.join(xPath, 'ncc');
|
||||
|
||||
console.log('downloading user files...');
|
||||
const filesOnDisk = await download(files, xUserPath);
|
||||
@@ -27,36 +31,46 @@ async function commonForTwo ({ files, entrypoint, workPath, cachePath }) {
|
||||
const entrypointFsDirname = path.join(xUserPath, path.dirname(entrypoint));
|
||||
await runNpmInstall(entrypointFsDirname, preferOfflineArgument);
|
||||
|
||||
console.log('writing rollup package.json...');
|
||||
await download({
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'builtins': '2.0.0',
|
||||
'rollup': '0.67.0',
|
||||
'rollup-plugin-commonjs': '9.2.0',
|
||||
'rollup-plugin-json': '3.1.0',
|
||||
'rollup-plugin-node-resolve': '3.4.0',
|
||||
'rollup-plugin-terser': '3.0.0'
|
||||
}
|
||||
})
|
||||
})
|
||||
}, xRollupPath);
|
||||
console.log('writing ncc package.json...');
|
||||
await download(
|
||||
{
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'@zeit/ncc': '0.1.4-webpack',
|
||||
},
|
||||
}),
|
||||
}),
|
||||
},
|
||||
xNccPath,
|
||||
);
|
||||
|
||||
console.log('running npm install for rollup...');
|
||||
await runNpmInstall(xRollupPath, preferOfflineArgument);
|
||||
return [ filesOnDisk, xRollupPath, entrypointFsDirname ];
|
||||
console.log('running npm install for ncc...');
|
||||
await runNpmInstall(xNccPath, preferOfflineArgument);
|
||||
return [filesOnDisk, xNccPath, entrypointFsDirname];
|
||||
}
|
||||
|
||||
async function compile(workNccPath, input) {
|
||||
const ncc = require(path.join(workNccPath, 'node_modules/@zeit/ncc'));
|
||||
return ncc(input);
|
||||
}
|
||||
|
||||
exports.config = {
|
||||
maxLambdaSize: '15mb',
|
||||
};
|
||||
|
||||
exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
const [ filesOnDisk, workRollupPath, entrypointFsDirname ] =
|
||||
await commonForTwo({ files, entrypoint, workPath });
|
||||
const [filesOnDisk, workNccPath, entrypointFsDirname] = await commonForTwo({
|
||||
files,
|
||||
entrypoint,
|
||||
workPath,
|
||||
});
|
||||
|
||||
console.log('running user script...');
|
||||
await runPackageJsonScript(entrypointFsDirname, 'now-build');
|
||||
|
||||
console.log('compiling entrypoint with rollup...');
|
||||
const data = await compile(workRollupPath, filesOnDisk[entrypoint].fsPath);
|
||||
console.log('compiling entrypoint with ncc...');
|
||||
const data = await compile(workNccPath, filesOnDisk[entrypoint].fsPath);
|
||||
const blob = new FileBlob({ data });
|
||||
|
||||
console.log('preparing lambda files...');
|
||||
@@ -65,70 +79,40 @@ exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
const launcherPath = path.join(__dirname, 'launcher.js');
|
||||
let launcherData = await fsp.readFile(launcherPath, 'utf8');
|
||||
|
||||
launcherData = launcherData.replace('// PLACEHOLDER', [
|
||||
'process.chdir("./user");',
|
||||
`require("./${path.join('user', entrypoint)}");`
|
||||
].join(' '));
|
||||
launcherData = launcherData.replace(
|
||||
'// PLACEHOLDER',
|
||||
[
|
||||
'process.chdir("./user");',
|
||||
`require("./${path.join('user', entrypoint)}");`,
|
||||
].join(' '),
|
||||
);
|
||||
|
||||
const launcherFiles = {
|
||||
'launcher.js': new FileBlob({ data: launcherData }),
|
||||
'bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') })
|
||||
'bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') }),
|
||||
};
|
||||
|
||||
const lambda = await createLambda({
|
||||
files: { ...compiledFiles, ...launcherFiles },
|
||||
handler: 'launcher.launcher',
|
||||
runtime: 'nodejs8.10'
|
||||
runtime: 'nodejs8.10',
|
||||
});
|
||||
|
||||
return { [entrypoint]: lambda };
|
||||
};
|
||||
|
||||
exports.prepareCache = async ({ files, entrypoint, cachePath }) => {
|
||||
exports.prepareCache = async ({
|
||||
files, entrypoint, workPath, cachePath,
|
||||
}) => {
|
||||
await fs.remove(workPath);
|
||||
await commonForTwo({ files, entrypoint, cachePath });
|
||||
|
||||
return {
|
||||
...await glob('user/node_modules/**', cachePath),
|
||||
...await glob('user/package-lock.json', cachePath),
|
||||
...await glob('user/yarn.lock', cachePath),
|
||||
...await glob('rollup/node_modules/**', cachePath),
|
||||
...await glob('rollup/package-lock.json', cachePath),
|
||||
...await glob('rollup/yarn.lock', cachePath)
|
||||
...(await glob('user/node_modules/**', cachePath)),
|
||||
...(await glob('user/package-lock.json', cachePath)),
|
||||
...(await glob('user/yarn.lock', cachePath)),
|
||||
...(await glob('ncc/node_modules/**', cachePath)),
|
||||
...(await glob('ncc/package-lock.json', cachePath)),
|
||||
...(await glob('ncc/yarn.lock', cachePath)),
|
||||
};
|
||||
};
|
||||
|
||||
async function compile (workRollupPath, input) {
|
||||
const rollup = require(path.join(workRollupPath, 'node_modules/rollup'));
|
||||
const nodeResolve = require(path.join(workRollupPath, 'node_modules/rollup-plugin-node-resolve'));
|
||||
const commonjs = require(path.join(workRollupPath, 'node_modules/rollup-plugin-commonjs'));
|
||||
const json = require(path.join(workRollupPath, 'node_modules/rollup-plugin-json'));
|
||||
const { terser } = require(path.join(workRollupPath, 'node_modules/rollup-plugin-terser'));
|
||||
const builtins = require(path.join(workRollupPath, 'node_modules/builtins'))();
|
||||
|
||||
const bundle = await rollup.rollup({
|
||||
input,
|
||||
plugins: [
|
||||
nodeResolve({
|
||||
module: false,
|
||||
jsnext: false,
|
||||
browser: false,
|
||||
preferBuiltins: true
|
||||
}),
|
||||
json(),
|
||||
commonjs(),
|
||||
terser()
|
||||
],
|
||||
onwarn: function (error) {
|
||||
if (/external dependency/.test(error.message)) {
|
||||
const mod = error.message.split('\'')[1];
|
||||
// ignore rollup warnings about known node.js modules
|
||||
if (builtins.indexOf(mod) > -1) return;
|
||||
}
|
||||
console.error(error.message);
|
||||
}
|
||||
});
|
||||
|
||||
return (await bundle.generate({
|
||||
format: 'cjs'
|
||||
})).code;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
const { Bridge } = require('./bridge.js');
|
||||
const { Server } = require('http');
|
||||
const { Bridge } = require('./bridge.js');
|
||||
|
||||
const bridge = new Bridge();
|
||||
|
||||
const saveListen = Server.prototype.listen;
|
||||
Server.prototype.listen = function (...args) {
|
||||
this.on('listening', function () {
|
||||
Server.prototype.listen = function listen(...args) {
|
||||
this.on('listening', function listening() {
|
||||
bridge.port = this.address().port;
|
||||
});
|
||||
saveListen.apply(this, args);
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
{
|
||||
"name": "@now/node-server",
|
||||
"version": "0.4.21-canary.1",
|
||||
"version": "0.4.23",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "^0.1.6-canary.1"
|
||||
"@now/node-bridge": "^0.1.8",
|
||||
"fs-extra": "7.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,133 +2,136 @@ const { createLambda } = require('@now/build-utils/lambda.js');
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const FileBlob = require('@now/build-utils/file-blob.js');
|
||||
const FileFsRef = require('@now/build-utils/file-fs-ref.js');
|
||||
const fsExtra = require('fs-extra');
|
||||
const fs = require('fs');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
const path = require('path');
|
||||
const { promisify } = require('util');
|
||||
const { runNpmInstall, runPackageJsonScript
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
const {
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
|
||||
const fsp = {
|
||||
readFile: promisify(fs.readFile)
|
||||
};
|
||||
const readFile = promisify(fs.readFile);
|
||||
|
||||
async function commonForTwo ({ files, entrypoint, workPath, cachePath }) {
|
||||
const xPath = workPath || cachePath;
|
||||
const preferOfflineArgument = workPath ? [ '--prefer-offline' ] : [];
|
||||
/** @typedef { import('@now/build-utils/file-ref') } FileRef */
|
||||
/** @typedef {{[filePath: string]: FileRef}} Files */
|
||||
|
||||
const xUserPath = path.join(xPath, 'user');
|
||||
const xRollupPath = path.join(xPath, 'rollup');
|
||||
/**
|
||||
* @typedef {Object} BuildParamsType
|
||||
* @property {Files} files - Files object
|
||||
* @property {string} entrypoint - Entrypoint specified for the builder
|
||||
* @property {string} workPath - Working directory for this build
|
||||
*/
|
||||
|
||||
/**
|
||||
* @param {BuildParamsType} buildParams
|
||||
* @param {Object} [options]
|
||||
* @param {string[]} [options.npmArguments]
|
||||
*/
|
||||
async function downloadInstallAndBundle(
|
||||
{ files, entrypoint, workPath },
|
||||
{ npmArguments = [] } = {},
|
||||
) {
|
||||
const userPath = path.join(workPath, 'user');
|
||||
const nccPath = path.join(workPath, 'ncc');
|
||||
|
||||
console.log('downloading user files...');
|
||||
const filesOnDisk = await download(files, xUserPath);
|
||||
const filesOnDisk = await download(files, userPath);
|
||||
|
||||
console.log('running npm install for user...');
|
||||
const entrypointFsDirname = path.join(xUserPath, path.dirname(entrypoint));
|
||||
await runNpmInstall(entrypointFsDirname, preferOfflineArgument);
|
||||
const entrypointFsDirname = path.join(userPath, path.dirname(entrypoint));
|
||||
await runNpmInstall(entrypointFsDirname, npmArguments);
|
||||
|
||||
console.log('writing rollup package.json...');
|
||||
await download({
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'builtins': '2.0.0',
|
||||
'rollup': '0.67.0',
|
||||
'rollup-plugin-commonjs': '9.2.0',
|
||||
'rollup-plugin-json': '3.1.0',
|
||||
'rollup-plugin-node-resolve': '3.4.0',
|
||||
'rollup-plugin-terser': '3.0.0'
|
||||
}
|
||||
})
|
||||
})
|
||||
}, xRollupPath);
|
||||
console.log('writing ncc package.json...');
|
||||
await download(
|
||||
{
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'@zeit/ncc': '0.1.4-webpack',
|
||||
},
|
||||
}),
|
||||
}),
|
||||
},
|
||||
nccPath,
|
||||
);
|
||||
|
||||
console.log('running npm install for rollup...');
|
||||
await runNpmInstall(xRollupPath, preferOfflineArgument);
|
||||
return [ filesOnDisk, xRollupPath, entrypointFsDirname ];
|
||||
console.log('running npm install for ncc...');
|
||||
await runNpmInstall(nccPath, npmArguments);
|
||||
return [filesOnDisk, nccPath, entrypointFsDirname];
|
||||
}
|
||||
|
||||
async function compile(workNccPath, input) {
|
||||
const ncc = require(path.join(workNccPath, 'node_modules/@zeit/ncc'));
|
||||
return ncc(input);
|
||||
}
|
||||
|
||||
exports.config = {
|
||||
maxLambdaSize: '5mb',
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {BuildParamsType} buildParams
|
||||
* @returns {Promise<Files>}
|
||||
*/
|
||||
exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
const [ filesOnDisk, workRollupPath, entrypointFsDirname ] =
|
||||
await commonForTwo({ files, entrypoint, workPath });
|
||||
const [
|
||||
filesOnDisk,
|
||||
workNccPath,
|
||||
entrypointFsDirname,
|
||||
] = await downloadInstallAndBundle(
|
||||
{ files, entrypoint, workPath },
|
||||
{ npmArguments: ['--prefer-offline'] },
|
||||
);
|
||||
|
||||
console.log('running user script...');
|
||||
await runPackageJsonScript(entrypointFsDirname, 'now-build');
|
||||
|
||||
console.log('compiling entrypoint with rollup...');
|
||||
const data = await compile(workRollupPath, filesOnDisk[entrypoint].fsPath);
|
||||
console.log('compiling entrypoint with ncc...');
|
||||
const data = await compile(workNccPath, filesOnDisk[entrypoint].fsPath);
|
||||
const blob = new FileBlob({ data });
|
||||
|
||||
console.log('preparing lambda files...');
|
||||
// move all user code to 'user' subdirectory
|
||||
const compiledFiles = { [path.join('user', entrypoint)]: blob };
|
||||
const launcherPath = path.join(__dirname, 'launcher.js');
|
||||
let launcherData = await fsp.readFile(launcherPath, 'utf8');
|
||||
let launcherData = await readFile(launcherPath, 'utf8');
|
||||
|
||||
launcherData = launcherData.replace('// PLACEHOLDER', [
|
||||
'process.chdir("./user");',
|
||||
`listener = require("./${path.join('user', entrypoint)}");`
|
||||
].join(' '));
|
||||
launcherData = launcherData.replace(
|
||||
'// PLACEHOLDER',
|
||||
[
|
||||
'process.chdir("./user");',
|
||||
`listener = require("./${path.join('user', entrypoint)}");`,
|
||||
].join(' '),
|
||||
);
|
||||
|
||||
const launcherFiles = {
|
||||
'launcher.js': new FileBlob({ data: launcherData }),
|
||||
'bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') })
|
||||
'bridge.js': new FileFsRef({ fsPath: require('@now/node-bridge') }),
|
||||
};
|
||||
|
||||
const lambda = await createLambda({
|
||||
files: { ...compiledFiles, ...launcherFiles },
|
||||
handler: 'launcher.launcher',
|
||||
runtime: 'nodejs8.10'
|
||||
runtime: 'nodejs8.10',
|
||||
});
|
||||
|
||||
return { [entrypoint]: lambda };
|
||||
};
|
||||
|
||||
exports.prepareCache = async ({ files, entrypoint, cachePath }) => {
|
||||
await commonForTwo({ files, entrypoint, cachePath });
|
||||
exports.prepareCache = async ({
|
||||
files, entrypoint, workPath, cachePath,
|
||||
}) => {
|
||||
await fsExtra.remove(workPath);
|
||||
await downloadInstallAndBundle({ files, entrypoint, workPath: cachePath });
|
||||
|
||||
return {
|
||||
...await glob('user/node_modules/**', cachePath),
|
||||
...await glob('user/package-lock.json', cachePath),
|
||||
...await glob('user/yarn.lock', cachePath),
|
||||
...await glob('rollup/node_modules/**', cachePath),
|
||||
...await glob('rollup/package-lock.json', cachePath),
|
||||
...await glob('rollup/yarn.lock', cachePath)
|
||||
...(await glob('user/node_modules/**', cachePath)),
|
||||
...(await glob('user/package-lock.json', cachePath)),
|
||||
...(await glob('user/yarn.lock', cachePath)),
|
||||
...(await glob('ncc/node_modules/**', cachePath)),
|
||||
...(await glob('ncc/package-lock.json', cachePath)),
|
||||
...(await glob('ncc/yarn.lock', cachePath)),
|
||||
};
|
||||
};
|
||||
|
||||
async function compile (workRollupPath, input) {
|
||||
const rollup = require(path.join(workRollupPath, 'node_modules/rollup'));
|
||||
const nodeResolve = require(path.join(workRollupPath, 'node_modules/rollup-plugin-node-resolve'));
|
||||
const commonjs = require(path.join(workRollupPath, 'node_modules/rollup-plugin-commonjs'));
|
||||
const json = require(path.join(workRollupPath, 'node_modules/rollup-plugin-json'));
|
||||
const { terser } = require(path.join(workRollupPath, 'node_modules/rollup-plugin-terser'));
|
||||
const builtins = require(path.join(workRollupPath, 'node_modules/builtins'))();
|
||||
|
||||
const bundle = await rollup.rollup({
|
||||
input,
|
||||
plugins: [
|
||||
nodeResolve({
|
||||
module: false,
|
||||
jsnext: false,
|
||||
browser: false,
|
||||
preferBuiltins: true
|
||||
}),
|
||||
json(),
|
||||
commonjs(),
|
||||
terser()
|
||||
],
|
||||
onwarn: function (error) {
|
||||
if (/external dependency/.test(error.message)) {
|
||||
const mod = error.message.split('\'')[1];
|
||||
// ignore rollup warnings about known node.js modules
|
||||
if (builtins.indexOf(mod) > -1) return;
|
||||
}
|
||||
console.error(error.message);
|
||||
}
|
||||
});
|
||||
|
||||
return (await bundle.generate({
|
||||
format: 'cjs'
|
||||
})).code;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
const { Bridge } = require('./bridge.js');
|
||||
const { Server } = require('http');
|
||||
const { Bridge } = require('./bridge.js');
|
||||
|
||||
const bridge = new Bridge();
|
||||
bridge.port = 3000;
|
||||
let listener;
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
{
|
||||
"name": "@now/node",
|
||||
"version": "0.4.23-canary.1",
|
||||
"version": "0.4.25",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "^0.1.6-canary.1"
|
||||
"@now/node-bridge": "^0.1.8",
|
||||
"fs-extra": "7.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,14 @@ const FileBlob = require('@now/build-utils/file-blob.js');
|
||||
const OptiPng = require('optipng');
|
||||
const pipe = require('multipipe');
|
||||
|
||||
exports.analyze = ({ files, entrypoint }) => {
|
||||
return files[entrypoint].digest;
|
||||
};
|
||||
exports.analyze = ({ files, entrypoint }) => files[entrypoint].digest;
|
||||
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
const optimizer = new OptiPng([ '-o9' ]);
|
||||
const stream = pipe(files[entrypoint].toStream(), optimizer);
|
||||
const optimizer = new OptiPng(['-o9']);
|
||||
const stream = pipe(
|
||||
files[entrypoint].toStream(),
|
||||
optimizer,
|
||||
);
|
||||
const result = await FileBlob.fromStream({ stream });
|
||||
return { [entrypoint]: result };
|
||||
};
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
{
|
||||
"name": "@now/optipng",
|
||||
"version": "0.4.4-canary.1",
|
||||
"version": "0.4.6",
|
||||
"dependencies": {
|
||||
"multipipe": "2.0.3",
|
||||
"optipng": "1.1.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,13 @@ const glob = require('@now/build-utils/fs/glob.js');
|
||||
const path = require('path');
|
||||
const rename = require('@now/build-utils/fs/rename.js');
|
||||
|
||||
exports.config = {
|
||||
maxLambdaSize: '10mb',
|
||||
};
|
||||
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
// move all user code to 'user' subdirectory
|
||||
const userFiles = rename(files, (name) => path.join('user', name));
|
||||
const userFiles = rename(files, name => path.join('user', name));
|
||||
const launcherFiles = await glob('**', path.join(__dirname, 'dist'));
|
||||
const zipFiles = { ...userFiles, ...launcherFiles };
|
||||
|
||||
@@ -15,8 +19,8 @@ exports.build = async ({ files, entrypoint }) => {
|
||||
runtime: 'go1.x',
|
||||
environment: {
|
||||
SCRIPT_NAME: path.join('/', entrypoint),
|
||||
NOW_PHP_SCRIPT: path.join('user', entrypoint)
|
||||
}
|
||||
NOW_PHP_SCRIPT: path.join('user', entrypoint),
|
||||
},
|
||||
});
|
||||
|
||||
return { [entrypoint]: lambda };
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"name": "@now/php",
|
||||
"version": "0.4.8-canary.1"
|
||||
"version": "0.4.10",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,33 +1,34 @@
|
||||
const path = require('path')
|
||||
const fetch = require('node-fetch')
|
||||
const execa = require('execa')
|
||||
const { createWriteStream } = require('fs')
|
||||
const path = require('path');
|
||||
const fetch = require('node-fetch');
|
||||
const execa = require('execa');
|
||||
const { createWriteStream } = require('fs');
|
||||
|
||||
const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory.js');
|
||||
const url = 'https://bootstrap.pypa.io/get-pip.py'
|
||||
|
||||
const url = 'https://bootstrap.pypa.io/get-pip.py';
|
||||
|
||||
// downloads `get-pip.py` and returns its absolute path
|
||||
async function downloadGetPipScript() {
|
||||
console.log('downloading "get-pip.py"...')
|
||||
const res = await fetch(url)
|
||||
console.log('downloading "get-pip.py"...');
|
||||
const res = await fetch(url);
|
||||
|
||||
if (!res.ok || res.status !== 200) {
|
||||
throw new Error(`Could not download "get-pip.py" from "${url}"`)
|
||||
}
|
||||
|
||||
const dir = await getWritableDirectory()
|
||||
const filePath = path.join(dir, 'get-pip.py')
|
||||
const writeStream = createWriteStream(filePath)
|
||||
|
||||
throw new Error(`Could not download "get-pip.py" from "${url}"`);
|
||||
}
|
||||
|
||||
const dir = await getWritableDirectory();
|
||||
const filePath = path.join(dir, 'get-pip.py');
|
||||
const writeStream = createWriteStream(filePath);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
res.body
|
||||
.on('error', reject)
|
||||
.pipe(writeStream)
|
||||
.on('finish', () => resolve(filePath))
|
||||
})
|
||||
.on('finish', () => resolve(filePath));
|
||||
});
|
||||
}
|
||||
|
||||
// downloads and installs `pip` (respecting
|
||||
// downloads and installs `pip` (respecting
|
||||
// process.env.PYTHONUSERBASE), and returns
|
||||
// the absolute path to it
|
||||
async function downloadAndInstallPip() {
|
||||
@@ -36,19 +37,21 @@ async function downloadAndInstallPip() {
|
||||
// installed to. `--user` will assume `~` if this
|
||||
// is not set, and `~` is not writeable on AWS Lambda.
|
||||
// let's refuse to proceed
|
||||
throw new Error('Could not install "pip": "PYTHONUSERBASE" env var is not set')
|
||||
throw new Error(
|
||||
'Could not install "pip": "PYTHONUSERBASE" env var is not set',
|
||||
);
|
||||
}
|
||||
const getPipFilePath = await downloadGetPipScript()
|
||||
const getPipFilePath = await downloadGetPipScript();
|
||||
|
||||
console.log('runing "python get-pip.py"...')
|
||||
console.log('runing "python get-pip.py"...');
|
||||
try {
|
||||
await execa('python3', [getPipFilePath, '--user'], {stdio: 'inherit'})
|
||||
await execa('python3', [getPipFilePath, '--user'], { stdio: 'inherit' });
|
||||
} catch (err) {
|
||||
console.log('could not install pip')
|
||||
throw err
|
||||
console.log('could not install pip');
|
||||
throw err;
|
||||
}
|
||||
|
||||
return path.join(process.env.PYTHONUSERBASE, 'bin', 'pip')
|
||||
return path.join(process.env.PYTHONUSERBASE, 'bin', 'pip');
|
||||
}
|
||||
|
||||
module.exports = downloadAndInstallPip
|
||||
module.exports = downloadAndInstallPip;
|
||||
|
||||
@@ -1,77 +1,84 @@
|
||||
const path = require('path')
|
||||
const execa = require('execa')
|
||||
const { readFile, writeFile } = require('fs.promised')
|
||||
const path = require('path');
|
||||
const execa = require('execa');
|
||||
const { readFile, writeFile } = require('fs.promised');
|
||||
const getWritableDirectory = require('@now/build-utils/fs/get-writable-directory.js');
|
||||
const download = require('@now/build-utils/fs/download.js')
|
||||
const downloadAndInstallPip = require('./download-and-install-pip')
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
const { createLambda } = require('@now/build-utils/lambda.js');
|
||||
const downloadAndInstallPip = require('./download-and-install-pip');
|
||||
|
||||
async function pipInstall(pipPath, srcDir, ...args) {
|
||||
console.log(`running "pip install -t ${srcDir} ${args.join(' ')}"...`)
|
||||
console.log(`running "pip install -t ${srcDir} ${args.join(' ')}"...`);
|
||||
try {
|
||||
await execa(
|
||||
pipPath,
|
||||
[
|
||||
'install',
|
||||
'-t', srcDir,
|
||||
...args
|
||||
],
|
||||
{stdio: 'inherit'}
|
||||
)
|
||||
await execa(pipPath, ['install', '-t', srcDir, ...args], {
|
||||
stdio: 'inherit',
|
||||
});
|
||||
} catch (err) {
|
||||
console.log(`failed to run "pip install -t ${srcDir} ${args.join(' ')}"`)
|
||||
throw err
|
||||
console.log(`failed to run "pip install -t ${srcDir} ${args.join(' ')}"`);
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
|
||||
exports.build = async ({ files, entrypoint, config }) => {
|
||||
console.log('downloading files...')
|
||||
exports.config = {
|
||||
maxLambdaSize: '5mb',
|
||||
};
|
||||
|
||||
const srcDir = await getWritableDirectory()
|
||||
exports.build = async ({ files, entrypoint }) => {
|
||||
console.log('downloading files...');
|
||||
|
||||
const srcDir = await getWritableDirectory();
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
files = await download(files, srcDir);
|
||||
|
||||
files = await download(files, srcDir)
|
||||
|
||||
// this is where `pip` will be installed to
|
||||
// we need it to be under `/tmp`
|
||||
const pyUserBase = await getWritableDirectory()
|
||||
process.env.PYTHONUSERBASE = pyUserBase
|
||||
const pyUserBase = await getWritableDirectory();
|
||||
process.env.PYTHONUSERBASE = pyUserBase;
|
||||
|
||||
const pipPath = await downloadAndInstallPip()
|
||||
const pipPath = await downloadAndInstallPip();
|
||||
|
||||
await pipInstall(pipPath, srcDir, 'requests')
|
||||
await pipInstall(pipPath, srcDir, 'requests');
|
||||
|
||||
if (files['requirements.txt']) {
|
||||
console.log('found "requirements.txt"')
|
||||
console.log('found "requirements.txt"');
|
||||
|
||||
const requirementsTxtPath = files['requirements.txt'].fsPath
|
||||
await pipInstall(pipPath, srcDir, '-r', requirementsTxtPath)
|
||||
const requirementsTxtPath = files['requirements.txt'].fsPath;
|
||||
await pipInstall(pipPath, srcDir, '-r', requirementsTxtPath);
|
||||
}
|
||||
|
||||
const originalNowHandlerPyContents = await readFile(path.join(__dirname, 'now_handler.py'), 'utf8')
|
||||
const originalNowHandlerPyContents = await readFile(
|
||||
path.join(__dirname, 'now_handler.py'),
|
||||
'utf8',
|
||||
);
|
||||
// will be used on `from $here import handler`
|
||||
// for example, `from api.users import handler`
|
||||
console.log('entrypoint is', entrypoint)
|
||||
const userHandlerFilePath = entrypoint.replace(/\//g, '.').replace(/\.py$/, '')
|
||||
console.log('entrypoint is', entrypoint);
|
||||
const userHandlerFilePath = entrypoint
|
||||
.replace(/\//g, '.')
|
||||
.replace(/\.py$/, '');
|
||||
const nowHandlerPyContents = originalNowHandlerPyContents.replace(
|
||||
'__NOW_HANDLER_FILENAME',
|
||||
userHandlerFilePath
|
||||
)
|
||||
userHandlerFilePath,
|
||||
);
|
||||
|
||||
// in order to allow the user to have `server.py`, we need our `server.py` to be called
|
||||
// somethig else
|
||||
const nowHandlerPyFilename = 'now__handler__python'
|
||||
const nowHandlerPyFilename = 'now__handler__python';
|
||||
|
||||
await writeFile(path.join(srcDir, nowHandlerPyFilename + '.py'), nowHandlerPyContents)
|
||||
await writeFile(
|
||||
path.join(srcDir, `${nowHandlerPyFilename}.py`),
|
||||
nowHandlerPyContents,
|
||||
);
|
||||
|
||||
const lambda = await createLambda({
|
||||
files: await glob('**', srcDir),
|
||||
handler: nowHandlerPyFilename + '.now_handler',
|
||||
handler: `${nowHandlerPyFilename}.now_handler`,
|
||||
runtime: 'python3.6',
|
||||
environment: {}
|
||||
})
|
||||
environment: {},
|
||||
});
|
||||
|
||||
return {
|
||||
[entrypoint]: lambda
|
||||
}
|
||||
}
|
||||
[entrypoint]: lambda,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
{
|
||||
"name": "@now/python",
|
||||
"version": "0.0.37-canary.1",
|
||||
"version": "0.0.39",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"execa": "^1.0.0",
|
||||
"fs.promised": "^3.0.0",
|
||||
"node-fetch": "^2.2.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,29 +1,37 @@
|
||||
const download = require('@now/build-utils/fs/download.js');
|
||||
const glob = require('@now/build-utils/fs/glob.js');
|
||||
const path = require('path');
|
||||
const { runNpmInstall, runPackageJsonScript,
|
||||
runShellScript } = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
const {
|
||||
runNpmInstall,
|
||||
runPackageJsonScript,
|
||||
runShellScript,
|
||||
} = require('@now/build-utils/fs/run-user-scripts.js');
|
||||
|
||||
exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
exports.build = async ({
|
||||
files, entrypoint, workPath, config,
|
||||
}) => {
|
||||
console.log('downloading user files...');
|
||||
await download(files, workPath);
|
||||
console.log('running user scripts...');
|
||||
const mountpoint = path.dirname(entrypoint);
|
||||
const entrypointFsDirname = path.join(workPath, mountpoint);
|
||||
const distPath = path.join(workPath, path.dirname(entrypoint), 'dist');
|
||||
const distPath = path.join(
|
||||
workPath,
|
||||
path.dirname(entrypoint),
|
||||
(config && config.distDir) || 'dist',
|
||||
);
|
||||
|
||||
if (path.basename(entrypoint) === 'package.json') {
|
||||
await runNpmInstall(entrypointFsDirname, [ '--prefer-offline' ]);
|
||||
await runNpmInstall(entrypointFsDirname, ['--prefer-offline']);
|
||||
if (await runPackageJsonScript(entrypointFsDirname, 'now-build')) {
|
||||
return await glob('**', distPath, mountpoint);
|
||||
} else {
|
||||
throw new Error(`An error running "now-build" script in "${entrypoint}"`);
|
||||
return glob('**', distPath, mountpoint);
|
||||
}
|
||||
throw new Error(`An error running "now-build" script in "${entrypoint}"`);
|
||||
}
|
||||
|
||||
if (path.extname(entrypoint) === '.sh') {
|
||||
await runShellScript(path.join(workPath, entrypoint));
|
||||
return await glob('**', distPath, mountpoint);
|
||||
return glob('**', distPath, mountpoint);
|
||||
}
|
||||
|
||||
return {};
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"name": "@now/static-build",
|
||||
"version": "0.4.12-canary.1"
|
||||
"version": "0.4.14",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
}
|
||||
}
|
||||
|
||||
23
test/integration/now-next/index.test.js
Normal file
23
test/integration/now-next/index.test.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/* global it, expect */
|
||||
const path = require('path');
|
||||
const runBuildLambda = require('../../lib/run-build-lambda');
|
||||
|
||||
const TWO_MINUTES = 120000;
|
||||
|
||||
it('Should build the standard example', async () => {
|
||||
const { buildResult } = await runBuildLambda(path.join(__dirname, 'standard'));
|
||||
expect(buildResult.index).toBeDefined();
|
||||
const filePaths = Object.keys(buildResult);
|
||||
const hasUnderScoreAppStaticFile = filePaths.some(filePath => filePath.match(/static.*\/pages\/_app\.js$/));
|
||||
const hasUnderScoreErrorStaticFile = filePaths.some(filePath => filePath.match(/static.*\/pages\/_error\.js$/));
|
||||
expect(hasUnderScoreAppStaticFile).toBeTruthy();
|
||||
expect(hasUnderScoreErrorStaticFile).toBeTruthy();
|
||||
}, TWO_MINUTES);
|
||||
|
||||
it('Should throw when package.json or next.config.js is not the "src"', async () => {
|
||||
try {
|
||||
await runBuildLambda(path.join(__dirname, 'no-package-json-and-next-config'));
|
||||
} catch (err) {
|
||||
expect(err.message).toMatch(/package\.json/);
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "pages/index.js", "use": "@now/next"}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
export default () => 'Index page';
|
||||
1
test/integration/now-next/standard/next.config.js
Normal file
1
test/integration/now-next/standard/next.config.js
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = {};
|
||||
6
test/integration/now-next/standard/now.json
Normal file
6
test/integration/now-next/standard/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "next.config.js", "use": "@now/next"}
|
||||
]
|
||||
}
|
||||
1
test/integration/now-next/standard/pages/index.js
Normal file
1
test/integration/now-next/standard/pages/index.js
Normal file
@@ -0,0 +1 @@
|
||||
export default () => 'Index page';
|
||||
6
test/integration/now-node/airtable/index.js
Normal file
6
test/integration/now-node/airtable/index.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const airtable = require('airtable');
|
||||
|
||||
module.exports = (req, res) => {
|
||||
res.end('Hello world');
|
||||
};
|
||||
6
test/integration/now-node/airtable/now.json
Normal file
6
test/integration/now-node/airtable/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "index.js", "use": "@now/node"}
|
||||
]
|
||||
}
|
||||
9
test/integration/now-node/airtable/package.json
Normal file
9
test/integration/now-node/airtable/package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "airtable",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"airtable": "^0.5.7"
|
||||
}
|
||||
}
|
||||
416
test/integration/now-node/airtable/yarn.lock
Normal file
416
test/integration/now-node/airtable/yarn.lock
Normal file
@@ -0,0 +1,416 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
airtable@^0.5.7:
|
||||
version "0.5.7"
|
||||
resolved "https://registry.yarnpkg.com/airtable/-/airtable-0.5.7.tgz#19df9893564166fc2719f8e43118dbc4d7b776f6"
|
||||
integrity sha512-xJiayyBTPgE0grEttU7ABdNzgvLAcmSz1l91aEea2bjqkxrVOViMPOyXilRZdVSUltPssgLMeeE+HOVVbh+Fwg==
|
||||
dependencies:
|
||||
async "1.5.2"
|
||||
lodash "4.17.10"
|
||||
request "2.88.0"
|
||||
xhr "2.3.3"
|
||||
|
||||
ajv@^6.5.5:
|
||||
version "6.5.5"
|
||||
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1"
|
||||
integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==
|
||||
dependencies:
|
||||
fast-deep-equal "^2.0.1"
|
||||
fast-json-stable-stringify "^2.0.0"
|
||||
json-schema-traverse "^0.4.1"
|
||||
uri-js "^4.2.2"
|
||||
|
||||
asn1@~0.2.3:
|
||||
version "0.2.4"
|
||||
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
|
||||
integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
|
||||
dependencies:
|
||||
safer-buffer "~2.1.0"
|
||||
|
||||
assert-plus@1.0.0, assert-plus@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
|
||||
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
|
||||
|
||||
async@1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
|
||||
integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
|
||||
|
||||
aws-sign2@~0.7.0:
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
|
||||
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
|
||||
|
||||
aws4@^1.8.0:
|
||||
version "1.8.0"
|
||||
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
|
||||
integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
|
||||
|
||||
bcrypt-pbkdf@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
|
||||
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
|
||||
dependencies:
|
||||
tweetnacl "^0.14.3"
|
||||
|
||||
caseless@~0.12.0:
|
||||
version "0.12.0"
|
||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
|
||||
|
||||
combined-stream@^1.0.6, combined-stream@~1.0.6:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
|
||||
integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
core-util-is@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
|
||||
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
|
||||
|
||||
dashdash@^1.12.0:
|
||||
version "1.14.1"
|
||||
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
|
||||
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
|
||||
|
||||
dom-walk@^0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
|
||||
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
|
||||
|
||||
ecc-jsbn@~0.1.1:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
|
||||
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
|
||||
dependencies:
|
||||
jsbn "~0.1.0"
|
||||
safer-buffer "^2.1.0"
|
||||
|
||||
extend@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
|
||||
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
|
||||
|
||||
extsprintf@1.3.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
|
||||
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
|
||||
|
||||
extsprintf@^1.2.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
|
||||
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
||||
|
||||
fast-deep-equal@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
|
||||
integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
|
||||
|
||||
fast-json-stable-stringify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
|
||||
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
|
||||
|
||||
for-each@^0.3.2:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
|
||||
integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
|
||||
dependencies:
|
||||
is-callable "^1.1.3"
|
||||
|
||||
forever-agent@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
|
||||
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
|
||||
|
||||
form-data@~2.3.2:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
|
||||
integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.6"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
getpass@^0.1.1:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
|
||||
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
|
||||
global@~4.3.0:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
|
||||
integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
|
||||
dependencies:
|
||||
min-document "^2.19.0"
|
||||
process "~0.5.1"
|
||||
|
||||
har-schema@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
|
||||
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
|
||||
|
||||
har-validator@~5.1.0:
|
||||
version "5.1.3"
|
||||
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
|
||||
integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
|
||||
dependencies:
|
||||
ajv "^6.5.5"
|
||||
har-schema "^2.0.0"
|
||||
|
||||
http-signature@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
is-callable@^1.1.3:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
|
||||
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
|
||||
|
||||
is-function@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
|
||||
integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
|
||||
|
||||
is-typedarray@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
|
||||
|
||||
isstream@~0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
|
||||
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
|
||||
|
||||
jsbn@~0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
|
||||
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
|
||||
|
||||
json-schema-traverse@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
|
||||
|
||||
json-schema@0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
|
||||
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
|
||||
|
||||
json-stringify-safe@~5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
|
||||
|
||||
jsprim@^1.2.2:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
|
||||
integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
|
||||
dependencies:
|
||||
assert-plus "1.0.0"
|
||||
extsprintf "1.3.0"
|
||||
json-schema "0.2.3"
|
||||
verror "1.10.0"
|
||||
|
||||
lodash@4.17.10:
|
||||
version "4.17.10"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
|
||||
integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==
|
||||
|
||||
mime-db@~1.37.0:
|
||||
version "1.37.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
|
||||
integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==
|
||||
|
||||
mime-types@^2.1.12, mime-types@~2.1.19:
|
||||
version "2.1.21"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
|
||||
integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==
|
||||
dependencies:
|
||||
mime-db "~1.37.0"
|
||||
|
||||
min-document@^2.19.0:
|
||||
version "2.19.0"
|
||||
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
|
||||
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
|
||||
dependencies:
|
||||
dom-walk "^0.1.0"
|
||||
|
||||
oauth-sign@~0.9.0:
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
|
||||
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
|
||||
|
||||
parse-headers@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.1.tgz#6ae83a7aa25a9d9b700acc28698cd1f1ed7e9536"
|
||||
integrity sha1-aug6eqJanZtwCswoaYzR8e1+lTY=
|
||||
dependencies:
|
||||
for-each "^0.3.2"
|
||||
trim "0.0.1"
|
||||
|
||||
performance-now@^2.1.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
|
||||
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
|
||||
|
||||
process@~0.5.1:
|
||||
version "0.5.2"
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
|
||||
integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
|
||||
|
||||
psl@^1.1.24:
|
||||
version "1.1.29"
|
||||
resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
|
||||
integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==
|
||||
|
||||
punycode@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
|
||||
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
|
||||
|
||||
punycode@^2.1.0:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
|
||||
|
||||
qs@~6.5.2:
|
||||
version "6.5.2"
|
||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
|
||||
|
||||
request@2.88.0:
|
||||
version "2.88.0"
|
||||
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
|
||||
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
|
||||
dependencies:
|
||||
aws-sign2 "~0.7.0"
|
||||
aws4 "^1.8.0"
|
||||
caseless "~0.12.0"
|
||||
combined-stream "~1.0.6"
|
||||
extend "~3.0.2"
|
||||
forever-agent "~0.6.1"
|
||||
form-data "~2.3.2"
|
||||
har-validator "~5.1.0"
|
||||
http-signature "~1.2.0"
|
||||
is-typedarray "~1.0.0"
|
||||
isstream "~0.1.2"
|
||||
json-stringify-safe "~5.0.1"
|
||||
mime-types "~2.1.19"
|
||||
oauth-sign "~0.9.0"
|
||||
performance-now "^2.1.0"
|
||||
qs "~6.5.2"
|
||||
safe-buffer "^5.1.2"
|
||||
tough-cookie "~2.4.3"
|
||||
tunnel-agent "^0.6.0"
|
||||
uuid "^3.3.2"
|
||||
|
||||
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
|
||||
safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.15.2"
|
||||
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629"
|
||||
integrity sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==
|
||||
dependencies:
|
||||
asn1 "~0.2.3"
|
||||
assert-plus "^1.0.0"
|
||||
bcrypt-pbkdf "^1.0.0"
|
||||
dashdash "^1.12.0"
|
||||
ecc-jsbn "~0.1.1"
|
||||
getpass "^0.1.1"
|
||||
jsbn "~0.1.0"
|
||||
safer-buffer "^2.0.2"
|
||||
tweetnacl "~0.14.0"
|
||||
|
||||
tough-cookie@~2.4.3:
|
||||
version "2.4.3"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
|
||||
integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
|
||||
dependencies:
|
||||
psl "^1.1.24"
|
||||
punycode "^1.4.1"
|
||||
|
||||
trim@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
|
||||
integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
|
||||
|
||||
tunnel-agent@^0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
|
||||
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
|
||||
dependencies:
|
||||
safe-buffer "^5.0.1"
|
||||
|
||||
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
|
||||
version "0.14.5"
|
||||
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
|
||||
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
|
||||
|
||||
uri-js@^4.2.2:
|
||||
version "4.2.2"
|
||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
|
||||
integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
|
||||
dependencies:
|
||||
punycode "^2.1.0"
|
||||
|
||||
uuid@^3.3.2:
|
||||
version "3.3.2"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
|
||||
integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
|
||||
|
||||
verror@1.10.0:
|
||||
version "1.10.0"
|
||||
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
|
||||
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
core-util-is "1.0.2"
|
||||
extsprintf "^1.2.0"
|
||||
|
||||
xhr@2.3.3:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.3.3.tgz#ad6b810e0917ce72b5ec704f5d41f1503b8e7524"
|
||||
integrity sha1-rWuBDgkXznK17HBPXUHxUDuOdSQ=
|
||||
dependencies:
|
||||
global "~4.3.0"
|
||||
is-function "^1.0.1"
|
||||
parse-headers "^2.0.0"
|
||||
xtend "^4.0.0"
|
||||
|
||||
xtend@^4.0.0:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
||||
6
test/integration/now-node/aws-sdk/index.js
Normal file
6
test/integration/now-node/aws-sdk/index.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const aws = require('aws-sdk');
|
||||
|
||||
module.exports = (req, res) => {
|
||||
res.end('Hello world');
|
||||
};
|
||||
6
test/integration/now-node/aws-sdk/now.json
Normal file
6
test/integration/now-node/aws-sdk/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "index.js", "use": "@now/node"}
|
||||
]
|
||||
}
|
||||
9
test/integration/now-node/aws-sdk/package.json
Normal file
9
test/integration/now-node/aws-sdk/package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "aws-sdk",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"aws-sdk": "^2.353.0"
|
||||
}
|
||||
}
|
||||
103
test/integration/now-node/aws-sdk/yarn.lock
Normal file
103
test/integration/now-node/aws-sdk/yarn.lock
Normal file
@@ -0,0 +1,103 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
aws-sdk@^2.353.0:
|
||||
version "2.353.0"
|
||||
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.353.0.tgz#3c809d2b02834d892a3f5c3f1171273b336e5692"
|
||||
integrity sha512-c5MwJhfcHwA2lC1Wq9csQvP9gz8dVGpZ64s5j9f/sWY6eZiDCQ6OWjxj+VJfpnCmfxyC/pdZO7JDGwems7dqIQ==
|
||||
dependencies:
|
||||
buffer "4.9.1"
|
||||
events "1.1.1"
|
||||
ieee754 "1.1.8"
|
||||
jmespath "0.15.0"
|
||||
querystring "0.2.0"
|
||||
sax "1.2.1"
|
||||
url "0.10.3"
|
||||
uuid "3.1.0"
|
||||
xml2js "0.4.19"
|
||||
|
||||
base64-js@^1.0.2:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
|
||||
integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
|
||||
|
||||
buffer@4.9.1:
|
||||
version "4.9.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
|
||||
integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=
|
||||
dependencies:
|
||||
base64-js "^1.0.2"
|
||||
ieee754 "^1.1.4"
|
||||
isarray "^1.0.0"
|
||||
|
||||
events@1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
|
||||
integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
|
||||
|
||||
ieee754@1.1.8:
|
||||
version "1.1.8"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
|
||||
integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=
|
||||
|
||||
ieee754@^1.1.4:
|
||||
version "1.1.12"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
|
||||
integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==
|
||||
|
||||
isarray@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
|
||||
|
||||
jmespath@0.15.0:
|
||||
version "0.15.0"
|
||||
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
|
||||
integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=
|
||||
|
||||
punycode@1.3.2:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
|
||||
integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
|
||||
|
||||
querystring@0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||
|
||||
sax@1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
|
||||
integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o=
|
||||
|
||||
sax@>=0.6.0:
|
||||
version "1.2.4"
|
||||
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
|
||||
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
|
||||
|
||||
url@0.10.3:
|
||||
version "0.10.3"
|
||||
resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
|
||||
integrity sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=
|
||||
dependencies:
|
||||
punycode "1.3.2"
|
||||
querystring "0.2.0"
|
||||
|
||||
uuid@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
|
||||
integrity sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==
|
||||
|
||||
xml2js@0.4.19:
|
||||
version "0.4.19"
|
||||
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
|
||||
integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
|
||||
dependencies:
|
||||
sax ">=0.6.0"
|
||||
xmlbuilder "~9.0.1"
|
||||
|
||||
xmlbuilder@~9.0.1:
|
||||
version "9.0.7"
|
||||
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
|
||||
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
|
||||
6
test/integration/now-node/axios/index.js
Normal file
6
test/integration/now-node/axios/index.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const axios = require('axios');
|
||||
|
||||
module.exports = (req, res) => {
|
||||
res.end('Hello world');
|
||||
};
|
||||
6
test/integration/now-node/axios/now.json
Normal file
6
test/integration/now-node/axios/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "index.js", "use": "@now/node"}
|
||||
]
|
||||
}
|
||||
9
test/integration/now-node/axios/package.json
Normal file
9
test/integration/now-node/axios/package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "axios",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "^0.18.0"
|
||||
}
|
||||
}
|
||||
35
test/integration/now-node/axios/yarn.lock
Normal file
35
test/integration/now-node/axios/yarn.lock
Normal file
@@ -0,0 +1,35 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
axios@^0.18.0:
|
||||
version "0.18.0"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.0.tgz#32d53e4851efdc0a11993b6cd000789d70c05102"
|
||||
integrity sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=
|
||||
dependencies:
|
||||
follow-redirects "^1.3.0"
|
||||
is-buffer "^1.1.5"
|
||||
|
||||
debug@=3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
follow-redirects@^1.3.0:
|
||||
version "1.5.9"
|
||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6"
|
||||
integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==
|
||||
dependencies:
|
||||
debug "=3.1.0"
|
||||
|
||||
is-buffer@^1.1.5:
|
||||
version "1.1.6"
|
||||
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
|
||||
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
45
test/integration/now-node/index.test.js
Normal file
45
test/integration/now-node/index.test.js
Normal file
@@ -0,0 +1,45 @@
|
||||
/* global it, expect */
|
||||
const path = require('path');
|
||||
const runBuildLambda = require('../../lib/run-build-lambda');
|
||||
|
||||
const TWO_MINUTES = 120000;
|
||||
|
||||
function runBuildForFolder(folder) {
|
||||
return runBuildLambda(path.join(__dirname, folder));
|
||||
}
|
||||
|
||||
it(
|
||||
'Should build the airtable folder',
|
||||
async () => {
|
||||
const { buildResult } = await runBuildForFolder('airtable');
|
||||
expect(buildResult['index.js']).toBeDefined();
|
||||
},
|
||||
TWO_MINUTES,
|
||||
);
|
||||
|
||||
it(
|
||||
'Should build the aws-sdk folder',
|
||||
async () => {
|
||||
const { buildResult } = await runBuildForFolder('aws-sdk');
|
||||
expect(buildResult['index.js']).toBeDefined();
|
||||
},
|
||||
TWO_MINUTES,
|
||||
);
|
||||
|
||||
it(
|
||||
'Should build the axios folder',
|
||||
async () => {
|
||||
const { buildResult } = await runBuildForFolder('axios');
|
||||
expect(buildResult['index.js']).toBeDefined();
|
||||
},
|
||||
TWO_MINUTES,
|
||||
);
|
||||
|
||||
it(
|
||||
'Should build the mongoose folder',
|
||||
async () => {
|
||||
const { buildResult } = await runBuildForFolder('mongoose');
|
||||
expect(buildResult['index.js']).toBeDefined();
|
||||
},
|
||||
TWO_MINUTES,
|
||||
);
|
||||
6
test/integration/now-node/mongoose/index.js
Normal file
6
test/integration/now-node/mongoose/index.js
Normal file
@@ -0,0 +1,6 @@
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const mongoose = require('mongoose');
|
||||
|
||||
module.exports = (req, res) => {
|
||||
res.end('Hello world');
|
||||
};
|
||||
6
test/integration/now-node/mongoose/now.json
Normal file
6
test/integration/now-node/mongoose/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "index.js", "use": "@now/node"}
|
||||
]
|
||||
}
|
||||
9
test/integration/now-node/mongoose/package.json
Normal file
9
test/integration/now-node/mongoose/package.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"name": "mongoose",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"mongoose": "^5.3.11"
|
||||
}
|
||||
}
|
||||
158
test/integration/now-node/mongoose/yarn.lock
Normal file
158
test/integration/now-node/mongoose/yarn.lock
Normal file
@@ -0,0 +1,158 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
async@2.6.1:
|
||||
version "2.6.1"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
|
||||
integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==
|
||||
dependencies:
|
||||
lodash "^4.17.10"
|
||||
|
||||
bluebird@3.5.1:
|
||||
version "3.5.1"
|
||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
|
||||
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
|
||||
|
||||
bson@^1.1.0, bson@~1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.0.tgz#bee57d1fb6a87713471af4e32bcae36de814b5b0"
|
||||
integrity sha512-9Aeai9TacfNtWXOYarkFJRW2CWo+dRon+fuLZYJmvLV3+MiUp0bEI6IAZfXEIg7/Pl/7IWlLaDnhzTsD81etQA==
|
||||
|
||||
debug@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
|
||||
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
|
||||
dependencies:
|
||||
ms "2.0.0"
|
||||
|
||||
kareem@2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.0.tgz#ef33c42e9024dce511eeaf440cd684f3af1fc769"
|
||||
integrity sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==
|
||||
|
||||
lodash.get@4.4.2:
|
||||
version "4.4.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
|
||||
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
|
||||
|
||||
lodash@^4.17.10:
|
||||
version "4.17.11"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
|
||||
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
|
||||
|
||||
memory-pager@^1.0.2:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.1.0.tgz#9308915e0e972849fefbae6f8bc95d6b350e7344"
|
||||
integrity sha512-Mf9OHV/Y7h6YWDxTzX/b4ZZ4oh9NSXblQL8dtPCOomOtZciEHxePR78+uHFLLlsk01A6jVHhHsQZZ/WcIPpnzg==
|
||||
|
||||
mongodb-core@3.1.7:
|
||||
version "3.1.7"
|
||||
resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-3.1.7.tgz#fe61853a6a6acbd2046c91794e5325ecad85428a"
|
||||
integrity sha512-YffpSrLmgFNmrvkGx+yX00KyBNk64C0BalfEn6vHHkXtcMUGXw8nxrMmhq5eXPLLlYeBpD/CsgNxE2Chf0o4zQ==
|
||||
dependencies:
|
||||
bson "^1.1.0"
|
||||
require_optional "^1.0.1"
|
||||
safe-buffer "^5.1.2"
|
||||
optionalDependencies:
|
||||
saslprep "^1.0.0"
|
||||
|
||||
mongodb@3.1.8:
|
||||
version "3.1.8"
|
||||
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.1.8.tgz#df8084fda2efdbaddd05dfd6a269891fc4cc72df"
|
||||
integrity sha512-yNKwYxQ6m00NV6+pMoWoheFTHSQVv1KkSrfOhRDYMILGWDYtUtQRqHrFqU75rmPIY8hMozVft8zdC4KYMWaM3Q==
|
||||
dependencies:
|
||||
mongodb-core "3.1.7"
|
||||
safe-buffer "^5.1.2"
|
||||
|
||||
mongoose-legacy-pluralize@1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4"
|
||||
integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==
|
||||
|
||||
mongoose@^5.3.11:
|
||||
version "5.3.11"
|
||||
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.3.11.tgz#ab71e070dabcb8b2aebff4702a09198a3f8a9401"
|
||||
integrity sha512-LrsatxtUfZAerAxyFiaw/8T8M4T9Ff9+6wFkJwfTVDz9skX+HVOs70QOzTDawz0k0Q0I6qt9xv/ZYQi2Paykgw==
|
||||
dependencies:
|
||||
async "2.6.1"
|
||||
bson "~1.1.0"
|
||||
kareem "2.3.0"
|
||||
lodash.get "4.4.2"
|
||||
mongodb "3.1.8"
|
||||
mongodb-core "3.1.7"
|
||||
mongoose-legacy-pluralize "1.0.2"
|
||||
mpath "0.5.1"
|
||||
mquery "3.2.0"
|
||||
ms "2.0.0"
|
||||
regexp-clone "0.0.1"
|
||||
safe-buffer "5.1.2"
|
||||
sliced "1.0.1"
|
||||
|
||||
mpath@0.5.1:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.5.1.tgz#17131501f1ff9e6e4fbc8ffa875aa7065b5775ab"
|
||||
integrity sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg==
|
||||
|
||||
mquery@3.2.0:
|
||||
version "3.2.0"
|
||||
resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.0.tgz#e276472abd5109686a15eb2a8e0761db813c81cc"
|
||||
integrity sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==
|
||||
dependencies:
|
||||
bluebird "3.5.1"
|
||||
debug "3.1.0"
|
||||
regexp-clone "0.0.1"
|
||||
safe-buffer "5.1.2"
|
||||
sliced "1.0.1"
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
|
||||
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
|
||||
|
||||
regexp-clone@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589"
|
||||
integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=
|
||||
|
||||
require_optional@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
|
||||
integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
|
||||
dependencies:
|
||||
resolve-from "^2.0.0"
|
||||
semver "^5.1.0"
|
||||
|
||||
resolve-from@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
|
||||
integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
|
||||
|
||||
safe-buffer@5.1.2, safe-buffer@^5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
|
||||
saslprep@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.2.tgz#da5ab936e6ea0bbae911ffec77534be370c9f52d"
|
||||
integrity sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==
|
||||
dependencies:
|
||||
sparse-bitfield "^3.0.3"
|
||||
|
||||
semver@^5.1.0:
|
||||
version "5.6.0"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
|
||||
integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
|
||||
|
||||
sliced@1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
|
||||
integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
|
||||
|
||||
sparse-bitfield@^3.0.3:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
|
||||
integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
|
||||
dependencies:
|
||||
memory-pager "^1.0.2"
|
||||
42
test/lib/run-build-lambda.js
Normal file
42
test/lib/run-build-lambda.js
Normal file
@@ -0,0 +1,42 @@
|
||||
/* global expect */
|
||||
const getWritableDirectory = require('../../packages/now-build-utils/fs/get-writable-directory.js');
|
||||
const glob = require('../../packages/now-build-utils/fs/glob.js');
|
||||
|
||||
function runAnalyze(wrapper, context) {
|
||||
if (wrapper.analyze) {
|
||||
return wrapper.analyze(context);
|
||||
}
|
||||
|
||||
return 'this-is-a-fake-analyze-result-from-default-analyze';
|
||||
}
|
||||
|
||||
async function runBuildLambda(inputPath) {
|
||||
const inputFiles = await glob('**', inputPath);
|
||||
const nowJsonRef = inputFiles['now.json'];
|
||||
expect(nowJsonRef).toBeDefined();
|
||||
const nowJson = require(nowJsonRef.fsPath);
|
||||
expect(nowJson.builds.length).toBe(1);
|
||||
const build = nowJson.builds[0];
|
||||
expect(build.src.includes('*')).toBeFalsy();
|
||||
const entrypoint = build.src.replace(/^\//, ''); // strip leftmost slash
|
||||
expect(inputFiles[entrypoint]).toBeDefined();
|
||||
inputFiles[entrypoint].digest = 'this-is-a-fake-digest-for-non-default-analyze';
|
||||
const wrapper = require(build.use);
|
||||
|
||||
const analyzeResult = runAnalyze(wrapper, {
|
||||
files: inputFiles,
|
||||
entrypoint,
|
||||
config: build.config,
|
||||
});
|
||||
console.log(analyzeResult);
|
||||
const workPath = await getWritableDirectory();
|
||||
const buildResult = await wrapper.build({
|
||||
files: inputFiles, entrypoint, config: build.config, workPath,
|
||||
});
|
||||
return {
|
||||
analyzeResult,
|
||||
buildResult,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = runBuildLambda;
|
||||
292
test/unit/now-next/utils.test.js
Normal file
292
test/unit/now-next/utils.test.js
Normal file
@@ -0,0 +1,292 @@
|
||||
const {
|
||||
excludeFiles,
|
||||
validateEntrypoint,
|
||||
includeOnlyEntryDirectory,
|
||||
moveEntryDirectoryToRoot,
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
} = require('@now/next/utils');
|
||||
const FileRef = require('@now/build-utils/file-ref');
|
||||
|
||||
describe('excludeFiles', () => {
|
||||
it('should exclude files', () => {
|
||||
const files = {
|
||||
'pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
};
|
||||
const result = excludeFiles(
|
||||
files,
|
||||
filePath => filePath === 'package-lock.json',
|
||||
);
|
||||
expect(result['pages/index.js']).toBeDefined();
|
||||
expect(result['package.json']).toBeDefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('validateEntrypoint', () => {
|
||||
it('should allow package.json', () => {
|
||||
expect(validateEntrypoint('package.json')).toBeUndefined();
|
||||
});
|
||||
it('should allow nested package.json', () => {
|
||||
expect(validateEntrypoint('frontend/package.json')).toBeUndefined();
|
||||
});
|
||||
it('should allow next.config.js', () => {
|
||||
expect(validateEntrypoint('next.config.js')).toBeUndefined();
|
||||
});
|
||||
it('should allow nested next.config.js', () => {
|
||||
expect(validateEntrypoint('frontend/next.config.js')).toBeUndefined();
|
||||
});
|
||||
it('should not allow pages/index.js', () => {
|
||||
expect(() => validateEntrypoint('pages/index.js')).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe('includeOnlyEntryDirectory', () => {
|
||||
it('should exclude files outside entry directory', () => {
|
||||
const entryDirectory = 'frontend';
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
};
|
||||
const result = includeOnlyEntryDirectory(files, entryDirectory);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['package.json']).toBeUndefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should handle entry directory being dot', () => {
|
||||
const entryDirectory = '.';
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
};
|
||||
const result = includeOnlyEntryDirectory(files, entryDirectory);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['package.json']).toBeDefined();
|
||||
expect(result['package-lock.json']).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('moveEntryDirectoryToRoot', () => {
|
||||
it('should move entrydirectory files to the root', () => {
|
||||
const entryDirectory = 'frontend';
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
};
|
||||
const result = moveEntryDirectoryToRoot(files, entryDirectory);
|
||||
expect(result['pages/index.js']).toBeDefined();
|
||||
});
|
||||
|
||||
it('should work with deep nested subdirectories', () => {
|
||||
const entryDirectory = 'frontend/my/app';
|
||||
const files = {
|
||||
'frontend/my/app/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
};
|
||||
const result = moveEntryDirectoryToRoot(files, entryDirectory);
|
||||
expect(result['pages/index.js']).toBeDefined();
|
||||
});
|
||||
|
||||
it('should do nothing when entry directory is dot', () => {
|
||||
const entryDirectory = '.';
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
};
|
||||
const result = moveEntryDirectoryToRoot(files, entryDirectory);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('excludeLockFiles', () => {
|
||||
it('should remove package-lock.json', () => {
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
};
|
||||
const result = excludeLockFiles(files);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should remove yarn.lock', () => {
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'yarn.lock': new FileRef({ digest: 'yarn-lock' }),
|
||||
};
|
||||
const result = excludeLockFiles(files);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['yarn.lock']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should remove both package-lock.json and yarn.lock', () => {
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'yarn.lock': new FileRef({ digest: 'yarn-lock' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
};
|
||||
const result = excludeLockFiles(files);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['yarn.lock']).toBeUndefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('excludeStaticDirectory', () => {
|
||||
it('should remove the /static directory files', () => {
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'yarn.lock': new FileRef({ digest: 'yarn-lock' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
'static/image.png': new FileRef({ digest: 'image' }),
|
||||
};
|
||||
const result = excludeStaticDirectory(files);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['yarn.lock']).toBeDefined();
|
||||
expect(result['package-lock.json']).toBeDefined();
|
||||
expect(result['static/image.png']).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should remove the nested /static directory files', () => {
|
||||
const files = {
|
||||
'frontend/pages/index.js': new FileRef({ digest: 'index' }),
|
||||
'package.json': new FileRef({ digest: 'package' }),
|
||||
'yarn.lock': new FileRef({ digest: 'yarn-lock' }),
|
||||
'package-lock.json': new FileRef({ digest: 'package-lock' }),
|
||||
'static/images/png/image.png': new FileRef({ digest: 'image' }),
|
||||
};
|
||||
const result = excludeStaticDirectory(files);
|
||||
expect(result['frontend/pages/index.js']).toBeDefined();
|
||||
expect(result['yarn.lock']).toBeDefined();
|
||||
expect(result['package-lock.json']).toBeDefined();
|
||||
expect(result['static/images/png/image.png']).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalizePackageJson', () => {
|
||||
it('should work without a package.json being supplied', () => {
|
||||
const result = normalizePackageJson();
|
||||
expect(result).toEqual({
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with a package.json being supplied', () => {
|
||||
const defaultPackage = {
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
};
|
||||
const result = normalizePackageJson(defaultPackage);
|
||||
expect(result).toEqual({
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should force next@canary to be a devDependency', () => {
|
||||
const defaultPackage = {
|
||||
dependencies: {
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
next: 'latest',
|
||||
},
|
||||
};
|
||||
const result = normalizePackageJson(defaultPackage);
|
||||
expect(result).toEqual({
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should force next-server@canary to be a dependency', () => {
|
||||
const defaultPackage = {
|
||||
dependencies: {
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
next: 'latest',
|
||||
},
|
||||
};
|
||||
const result = normalizePackageJson(defaultPackage);
|
||||
expect(result).toEqual({
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should force now-build script', () => {
|
||||
const defaultPackage = {
|
||||
dependencies: {
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
next: 'latest',
|
||||
},
|
||||
};
|
||||
const result = normalizePackageJson(defaultPackage);
|
||||
expect(result).toEqual({
|
||||
dependencies: {
|
||||
'next-server': 'canary',
|
||||
react: 'latest',
|
||||
'react-dom': 'latest',
|
||||
},
|
||||
devDependencies: {
|
||||
next: 'canary',
|
||||
},
|
||||
scripts: {
|
||||
'now-build': 'next build',
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"module": "commonjs",
|
||||
"lib": ["es2017"],
|
||||
"allowJs": true,
|
||||
"checkJs": true,
|
||||
"noEmit": true,
|
||||
"strict": false,
|
||||
"types": ["node"],
|
||||
"esModuleInterop": true
|
||||
},
|
||||
"include": [
|
||||
"./packages/now-node/index.js",
|
||||
"./packages/now-build-utils/file-ref.js",
|
||||
"./packages/now-build-utils/file-fs-ref.js",
|
||||
"./packages/now-build-utils/fs/rename.js",
|
||||
"./packages/now-build-utils/fs/download.js",
|
||||
"./packages/now-build-utils/fs/glob.js",
|
||||
"./packages/now-next"
|
||||
],
|
||||
"exclude": [
|
||||
"./packages/now-next/launcher.js"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user