mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-25 03:39:14 +00:00
Compare commits
22 Commits
@now/node@
...
@now/node@
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66bf4aa25a | ||
|
|
f328a53a3f | ||
|
|
168b4cf2bb | ||
|
|
a91e3da7d8 | ||
|
|
756c452203 | ||
|
|
80db1937f8 | ||
|
|
d9df4b0929 | ||
|
|
08c52ebbf2 | ||
|
|
fe8ead391a | ||
|
|
5d45f2df31 | ||
|
|
1385c1ca48 | ||
|
|
4c63009123 | ||
|
|
389c85cef5 | ||
|
|
227c239bbc | ||
|
|
b93736132a | ||
|
|
26849422ff | ||
|
|
31dd1ca491 | ||
|
|
04a1ce89b3 | ||
|
|
3e247fd16d | ||
|
|
9e127421ad | ||
|
|
337d0cb1ed | ||
|
|
ad3cdf46f4 |
@@ -19,3 +19,9 @@ For the canary channel use:
|
||||
```
|
||||
yarn publish-canary
|
||||
```
|
||||
|
||||
CircleCI will take care of publishing the updated packages to npm from there.
|
||||
|
||||
If for some reason CircleCI fails to publish the npm package, you may do so
|
||||
manually by running `npm publish` from the package directory. Make sure to
|
||||
include the `--tag canary` parameter if you are publishing a canary release!
|
||||
|
||||
83
packages/now-build-utils/fs/bootstrap-yarn.js
vendored
Normal file
83
packages/now-build-utils/fs/bootstrap-yarn.js
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
const MemoryFileSystem = require('memory-fs');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { spawnSync } = require('child_process');
|
||||
|
||||
const yarnPath = spawnSync('which', ['yarn'])
|
||||
.stdout.toString()
|
||||
.trim();
|
||||
|
||||
const cachePath = spawnSync(yarnPath, ['cache', 'dir'])
|
||||
.stdout.toString()
|
||||
.trim();
|
||||
|
||||
spawnSync(yarnPath, ['cache', 'clean']);
|
||||
const vfs = new MemoryFileSystem();
|
||||
|
||||
function isOutsideCachePath(filename) {
|
||||
const relative = path.relative(cachePath, filename);
|
||||
return relative.startsWith('..');
|
||||
}
|
||||
|
||||
const saveCreateWriteStream = fs.createWriteStream;
|
||||
fs.createWriteStream = (...args) => {
|
||||
const filename = args[0];
|
||||
if (isOutsideCachePath(filename)) {
|
||||
return saveCreateWriteStream.call(fs, ...args);
|
||||
}
|
||||
|
||||
vfs.mkdirpSync(path.dirname(filename));
|
||||
fs.writeFileSync(filename, Buffer.alloc(0));
|
||||
const stream = vfs.createWriteStream(...args);
|
||||
|
||||
stream.on('finish', () => {
|
||||
setTimeout(() => {
|
||||
stream.emit('close');
|
||||
});
|
||||
});
|
||||
|
||||
return stream;
|
||||
};
|
||||
|
||||
const saveReadFile = fs.readFile;
|
||||
fs.readFile = (...args) => {
|
||||
const filename = args[0];
|
||||
if (isOutsideCachePath(filename)) {
|
||||
return saveReadFile.call(fs, ...args);
|
||||
}
|
||||
|
||||
const callback = args[args.length - 1];
|
||||
return vfs.readFile(...args.slice(0, -1), (error, result) => {
|
||||
if (error) {
|
||||
saveReadFile.call(fs, ...args);
|
||||
return;
|
||||
}
|
||||
|
||||
callback(error, result);
|
||||
});
|
||||
};
|
||||
|
||||
const saveCopyFile = fs.copyFile;
|
||||
fs.copyFile = (...args) => {
|
||||
const src = args[0];
|
||||
if (isOutsideCachePath(src)) {
|
||||
return saveCopyFile.call(fs, ...args);
|
||||
}
|
||||
|
||||
const dest = args[1];
|
||||
const callback = args[args.length - 1];
|
||||
const buffer = vfs.readFileSync(src);
|
||||
return fs.writeFile(dest, buffer, callback);
|
||||
};
|
||||
|
||||
const saveWriteFile = fs.writeFile;
|
||||
fs.writeFile = (...args) => {
|
||||
const filename = args[0];
|
||||
if (isOutsideCachePath(filename)) {
|
||||
return saveWriteFile.call(fs, ...args);
|
||||
}
|
||||
|
||||
return vfs.writeFile(...args);
|
||||
};
|
||||
|
||||
require(yarnPath);
|
||||
@@ -63,6 +63,15 @@ async function runNpmInstall(destPath, args = []) {
|
||||
commandArgs = args.filter(a => a !== '--prefer-offline');
|
||||
await spawnAsync('npm', ['install'].concat(commandArgs), destPath);
|
||||
await spawnAsync('npm', ['cache', 'clean', '--force'], destPath);
|
||||
} else if (process.env.AWS_EXECUTION_ENV) {
|
||||
console.log('using memory-fs for yarn cache');
|
||||
await spawnAsync(
|
||||
'node',
|
||||
[path.join(__dirname, 'bootstrap-yarn.js'), '--cwd', destPath].concat(
|
||||
commandArgs,
|
||||
),
|
||||
destPath,
|
||||
);
|
||||
} else {
|
||||
await spawnAsync('yarn', ['--cwd', destPath].concat(commandArgs), destPath);
|
||||
await spawnAsync('yarn', ['cache', 'clean'], destPath);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/build-utils",
|
||||
"version": "0.4.30",
|
||||
"version": "0.4.31-canary.0",
|
||||
"dependencies": {
|
||||
"async-retry": "1.2.3",
|
||||
"async-sema": "2.1.4",
|
||||
@@ -8,6 +8,7 @@
|
||||
"fs-extra": "7.0.0",
|
||||
"glob": "7.1.3",
|
||||
"into-stream": "4.0.0",
|
||||
"memory-fs": "0.4.1",
|
||||
"multistream": "2.1.1",
|
||||
"node-fetch": "2.2.0",
|
||||
"yazl": "2.4.3"
|
||||
|
||||
@@ -43,11 +43,14 @@ for (const builder of buildersToTestWith) {
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const fixture of fs.readdirSync(fixturesPath2)) {
|
||||
// eslint-disable-next-line no-loop-func
|
||||
it(`should build ${builder}/${fixture}`, async () => {
|
||||
await expect(
|
||||
testDeployment({ buildUtilsUrl }, path.join(fixturesPath2, fixture)),
|
||||
).resolves.toBe(undefined);
|
||||
});
|
||||
// don't run all foreign fixtures, just some
|
||||
if (['01-cowsay', '03-env-vars'].includes(fixture)) {
|
||||
// eslint-disable-next-line no-loop-func
|
||||
it(`should build ${builder}/${fixture}`, async () => {
|
||||
await expect(
|
||||
testDeployment({ buildUtilsUrl }, path.join(fixturesPath2, fixture)),
|
||||
).resolves.toBe(undefined);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,12 +111,7 @@ func main() {
|
||||
for k, v := range internalRes.Header {
|
||||
// FIXME: support multiple values via concatenating with ','
|
||||
// see RFC 7230, section 3.2.2
|
||||
if strings.ToLower(k) == "x-now-response-encoding" {
|
||||
// we don't want to send this header down
|
||||
resEncoding = v[0]
|
||||
} else {
|
||||
resHeaders[k] = v[0]
|
||||
}
|
||||
resHeaders[k] = v[0]
|
||||
}
|
||||
|
||||
bodyBytes, err := ioutil.ReadAll(internalRes.Body)
|
||||
@@ -124,17 +119,12 @@ func main() {
|
||||
return createErrorResponse("Bad gateway", "bad_gateway", 502)
|
||||
}
|
||||
|
||||
var resBody string
|
||||
if resEncoding == "base64" {
|
||||
resBody = b64.StdEncoding.EncodeToString(bodyBytes)
|
||||
} else {
|
||||
resBody = string(bodyBytes)
|
||||
}
|
||||
resBody = b64.StdEncoding.EncodeToString(bodyBytes)
|
||||
|
||||
return Response{
|
||||
StatusCode: internalRes.StatusCode,
|
||||
Headers: resHeaders,
|
||||
Encoding: resEncoding,
|
||||
Encoding: "base64",
|
||||
Body: resBody,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/go",
|
||||
"version": "0.2.10",
|
||||
"version": "0.2.11-canary.0",
|
||||
"scripts": {
|
||||
"test": "best -I test/*.js",
|
||||
"prepublish": "./build.sh"
|
||||
|
||||
1
packages/now-md/.npmignore
Normal file
1
packages/now-md/.npmignore
Normal file
@@ -0,0 +1 @@
|
||||
/test
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/md",
|
||||
"version": "0.4.7",
|
||||
"version": "0.4.8-canary.0",
|
||||
"dependencies": {
|
||||
"rehype-document": "^2.2.0",
|
||||
"rehype-format": "^2.3.0",
|
||||
@@ -12,5 +12,8 @@
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "jest"
|
||||
}
|
||||
}
|
||||
|
||||
5
packages/now-md/test/fixtures/01-cowsay/index.md
vendored
Normal file
5
packages/now-md/test/fixtures/01-cowsay/index.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Testing Markdown
|
||||
|
||||
cow:RANDOMNESS_PLACEHOLDER
|
||||
|
||||
[Wow a link!](https://zeit.co)
|
||||
11
packages/now-md/test/fixtures/01-cowsay/now.json
vendored
Normal file
11
packages/now-md/test/fixtures/01-cowsay/now.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{ "src": "index.md", "use": "@now/md" },
|
||||
{ "src": "subdirectory/index.md", "use": "@now/md" }
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
5
packages/now-md/test/fixtures/01-cowsay/subdirectory/index.md
vendored
Normal file
5
packages/now-md/test/fixtures/01-cowsay/subdirectory/index.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Testing Markdown
|
||||
|
||||
yoda:RANDOMNESS_PLACEHOLDER
|
||||
|
||||
[Wow a link!](https://zeit.co)
|
||||
29
packages/now-md/test/test.js
Normal file
29
packages/now-md/test/test.js
Normal file
@@ -0,0 +1,29 @@
|
||||
/* global beforeAll, expect, it, jest */
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const {
|
||||
packAndDeploy,
|
||||
testDeployment,
|
||||
} = require('../../../test/lib/deployment/test-deployment.js');
|
||||
|
||||
jest.setTimeout(2 * 60 * 1000);
|
||||
let builderUrl;
|
||||
|
||||
beforeAll(async () => {
|
||||
const builderPath = path.resolve(__dirname, '..');
|
||||
builderUrl = await packAndDeploy(builderPath);
|
||||
console.log('builderUrl', builderUrl);
|
||||
});
|
||||
|
||||
const fixturesPath = path.resolve(__dirname, 'fixtures');
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const fixture of fs.readdirSync(fixturesPath)) {
|
||||
// eslint-disable-next-line no-loop-func
|
||||
it(`should build ${fixture}`, async () => {
|
||||
await expect(
|
||||
testDeployment({ builderUrl }, path.join(fixturesPath, fixture)),
|
||||
).resolves.toBe(undefined);
|
||||
});
|
||||
}
|
||||
1
packages/now-mdx-deck/.npmignore
Normal file
1
packages/now-mdx-deck/.npmignore
Normal file
@@ -0,0 +1 @@
|
||||
/test
|
||||
@@ -14,7 +14,7 @@ exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
console.log('downloading user files...');
|
||||
const downloadedFiles = await download(files, workPath);
|
||||
console.log('writing package.json...');
|
||||
const packageJson = { dependencies: { 'mdx-deck': '1.7.7' } };
|
||||
const packageJson = { dependencies: { 'mdx-deck': '1.7.15' } };
|
||||
const packageJsonPath = path.join(workPath, 'package.json');
|
||||
await writeFile(packageJsonPath, JSON.stringify(packageJson));
|
||||
console.log('running npm install...');
|
||||
@@ -47,7 +47,7 @@ exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
|
||||
exports.prepareCache = async ({ cachePath }) => {
|
||||
console.log('writing package.json...');
|
||||
const packageJson = { dependencies: { 'mdx-deck': '1.7.7' } };
|
||||
const packageJson = { dependencies: { 'mdx-deck': '1.7.15' } };
|
||||
const packageJsonPath = path.join(cachePath, 'package.json');
|
||||
await writeFile(packageJsonPath, JSON.stringify(packageJson));
|
||||
console.log('running npm install...');
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{
|
||||
"name": "@now/mdx-deck",
|
||||
"version": "0.4.16",
|
||||
"version": "0.4.17-canary.1",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "jest"
|
||||
}
|
||||
}
|
||||
|
||||
5
packages/now-mdx-deck/test/fixtures/01-cowsay/index.mdx
vendored
Normal file
5
packages/now-mdx-deck/test/fixtures/01-cowsay/index.mdx
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Testing Markdown
|
||||
---
|
||||
cow:RANDOMNESS_PLACEHOLDER
|
||||
---
|
||||
[Wow a link!](https://zeit.co)
|
||||
11
packages/now-mdx-deck/test/fixtures/01-cowsay/now.json
vendored
Normal file
11
packages/now-mdx-deck/test/fixtures/01-cowsay/now.json
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{ "src": "index.mdx", "use": "@now/mdx-deck" },
|
||||
{ "src": "subdirectory/index.mdx", "use": "@now/mdx-deck" }
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
5
packages/now-mdx-deck/test/fixtures/01-cowsay/subdirectory/index.mdx
vendored
Normal file
5
packages/now-mdx-deck/test/fixtures/01-cowsay/subdirectory/index.mdx
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
# Testing Markdown
|
||||
---
|
||||
yoda:RANDOMNESS_PLACEHOLDER
|
||||
---
|
||||
[Wow a link!](https://zeit.co)
|
||||
29
packages/now-mdx-deck/test/test.js
Normal file
29
packages/now-mdx-deck/test/test.js
Normal file
@@ -0,0 +1,29 @@
|
||||
/* global beforeAll, expect, it, jest */
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const {
|
||||
packAndDeploy,
|
||||
testDeployment,
|
||||
} = require('../../../test/lib/deployment/test-deployment.js');
|
||||
|
||||
jest.setTimeout(2 * 60 * 1000);
|
||||
let builderUrl;
|
||||
|
||||
beforeAll(async () => {
|
||||
const builderPath = path.resolve(__dirname, '..');
|
||||
builderUrl = await packAndDeploy(builderPath);
|
||||
console.log('builderUrl', builderUrl);
|
||||
});
|
||||
|
||||
const fixturesPath = path.resolve(__dirname, 'fixtures');
|
||||
|
||||
// eslint-disable-next-line no-restricted-syntax
|
||||
for (const fixture of fs.readdirSync(fixturesPath)) {
|
||||
// eslint-disable-next-line no-loop-func
|
||||
it(`should build ${fixture}`, async () => {
|
||||
await expect(
|
||||
testDeployment({ builderUrl }, path.join(fixturesPath, fixture)),
|
||||
).resolves.toBe(undefined);
|
||||
});
|
||||
}
|
||||
@@ -17,6 +17,7 @@ const {
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
onlyStaticDirectory,
|
||||
} = require('./utils');
|
||||
|
||||
/** @typedef { import('@now/build-utils/file-ref').Files } Files */
|
||||
@@ -91,7 +92,7 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
const filesWithoutStaticDirectory = excludeStaticDirectory(
|
||||
filesWithoutLockfiles,
|
||||
);
|
||||
let downloadedFiles = await download(filesWithoutStaticDirectory, workPath);
|
||||
const downloadedFiles = await download(filesWithoutStaticDirectory, workPath);
|
||||
|
||||
console.log('normalizing package.json');
|
||||
const packageJson = normalizePackageJson(
|
||||
@@ -105,8 +106,6 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
await writeNpmRc(workPath, process.env.NPM_AUTH_TOKEN);
|
||||
}
|
||||
|
||||
downloadedFiles = await glob('**', workPath);
|
||||
|
||||
console.log('running npm install...');
|
||||
await runNpmInstall(workPath, ['--prefer-offline']);
|
||||
console.log('running user script...');
|
||||
@@ -117,7 +116,7 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
await unlink(path.join(workPath, '.npmrc'));
|
||||
}
|
||||
|
||||
downloadedFiles = await glob('**', workPath);
|
||||
const filesAfterBuild = await glob('**', workPath);
|
||||
|
||||
console.log('preparing lambda files...');
|
||||
let buildId;
|
||||
@@ -144,8 +143,8 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
...dotNextServerRootFiles,
|
||||
...launcherFiles,
|
||||
};
|
||||
if (downloadedFiles['next.config.js']) {
|
||||
nextFiles['next.config.js'] = downloadedFiles['next.config.js'];
|
||||
if (filesAfterBuild['next.config.js']) {
|
||||
nextFiles['next.config.js'] = filesAfterBuild['next.config.js'];
|
||||
}
|
||||
const pages = await glob(
|
||||
'**/*.js',
|
||||
@@ -169,16 +168,16 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
);
|
||||
|
||||
const pageFiles = {
|
||||
[`.next/server/static/${buildId}/pages/_document.js`]: downloadedFiles[
|
||||
[`.next/server/static/${buildId}/pages/_document.js`]: filesAfterBuild[
|
||||
`.next/server/static/${buildId}/pages/_document.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/_app.js`]: downloadedFiles[
|
||||
[`.next/server/static/${buildId}/pages/_app.js`]: filesAfterBuild[
|
||||
`.next/server/static/${buildId}/pages/_app.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/_error.js`]: downloadedFiles[
|
||||
[`.next/server/static/${buildId}/pages/_error.js`]: filesAfterBuild[
|
||||
`.next/server/static/${buildId}/pages/_error.js`
|
||||
],
|
||||
[`.next/server/static/${buildId}/pages/${page}`]: downloadedFiles[
|
||||
[`.next/server/static/${buildId}/pages/${page}`]: filesAfterBuild[
|
||||
`.next/server/static/${buildId}/pages/${page}`
|
||||
],
|
||||
};
|
||||
@@ -209,12 +208,36 @@ exports.build = async ({ files, workPath, entrypoint }) => {
|
||||
{},
|
||||
);
|
||||
|
||||
return { ...lambdas, ...staticFiles };
|
||||
const nextStaticDirectory = onlyStaticDirectory(filesWithoutLockfiles);
|
||||
const staticDirectoryFiles = Object.keys(nextStaticDirectory).reduce(
|
||||
(mappedFiles, file) => ({
|
||||
...mappedFiles,
|
||||
[path.join(entryDirectory, file)]: nextStaticDirectory[file],
|
||||
}),
|
||||
{},
|
||||
);
|
||||
|
||||
return { ...lambdas, ...staticFiles, ...staticDirectoryFiles };
|
||||
};
|
||||
|
||||
exports.prepareCache = async ({ files, cachePath, workPath }) => {
|
||||
exports.prepareCache = async ({
|
||||
files, entrypoint, cachePath, workPath,
|
||||
}) => {
|
||||
console.log('downloading user files...');
|
||||
await download(files, cachePath);
|
||||
const entryDirectory = path.dirname(entrypoint);
|
||||
const filesOnlyEntryDirectory = includeOnlyEntryDirectory(
|
||||
files,
|
||||
entryDirectory,
|
||||
);
|
||||
const filesWithEntryDirectoryRoot = moveEntryDirectoryToRoot(
|
||||
filesOnlyEntryDirectory,
|
||||
entryDirectory,
|
||||
);
|
||||
const filesWithoutLockfiles = excludeLockFiles(filesWithEntryDirectoryRoot);
|
||||
const filesWithoutStaticDirectory = excludeStaticDirectory(
|
||||
filesWithoutLockfiles,
|
||||
);
|
||||
await download(filesWithoutStaticDirectory, workPath);
|
||||
await download(await glob('.next/**', workPath), cachePath);
|
||||
await download(await glob('node_modules/**', workPath), cachePath);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/next",
|
||||
"version": "0.0.80",
|
||||
"version": "0.0.81-canary.1",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "0.1.4",
|
||||
"execa": "^1.0.0",
|
||||
|
||||
@@ -111,6 +111,19 @@ function excludeStaticDirectory(files) {
|
||||
return excludeFiles(files, matcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude the static directory from files
|
||||
* @param {Files} files
|
||||
* @returns {Files}
|
||||
*/
|
||||
function onlyStaticDirectory(files) {
|
||||
function matcher(filePath) {
|
||||
return !filePath.startsWith('static');
|
||||
}
|
||||
|
||||
return excludeFiles(files, matcher);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enforce specific package.json configuration for smallest possible lambda
|
||||
* @param {{dependencies?: any, devDependencies?: any, scripts?: any}} defaultPackageJson
|
||||
@@ -164,4 +177,5 @@ module.exports = {
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
onlyStaticDirectory,
|
||||
};
|
||||
|
||||
@@ -47,7 +47,7 @@ async function downloadInstallAndBundle(
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'@zeit/ncc': '0.1.12',
|
||||
'@zeit/ncc': '0.2.0',
|
||||
},
|
||||
}),
|
||||
}),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/node-server",
|
||||
"version": "0.4.24",
|
||||
"version": "0.4.25-canary.1",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "^0.1.9",
|
||||
"fs-extra": "7.0.1"
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
15
packages/now-node-server/test/fixtures/08-assets/index.js
vendored
Normal file
15
packages/now-node-server/test/fixtures/08-assets/index.js
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
const fs = require('fs');
|
||||
const http = require('http');
|
||||
const path = require('path');
|
||||
|
||||
const server = http.createServer((req, resp) => {
|
||||
const asset1 = fs.readFileSync(
|
||||
path.join(__dirname, 'subdirectory1/asset.txt'),
|
||||
);
|
||||
const asset2 = fs.readFileSync(
|
||||
path.join(__dirname, 'subdirectory2/asset.txt'),
|
||||
);
|
||||
resp.end(`${asset1},${asset2}`);
|
||||
});
|
||||
|
||||
server.listen();
|
||||
9
packages/now-node-server/test/fixtures/08-assets/now.json
vendored
Normal file
9
packages/now-node-server/test/fixtures/08-assets/now.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{ "src": "index.js", "use": "@now/node-server" }
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "asset1:RANDOMNESS_PLACEHOLDER,asset2:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
1
packages/now-node-server/test/fixtures/08-assets/subdirectory1/asset.txt
vendored
Normal file
1
packages/now-node-server/test/fixtures/08-assets/subdirectory1/asset.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
asset1:RANDOMNESS_PLACEHOLDER
|
||||
1
packages/now-node-server/test/fixtures/08-assets/subdirectory2/asset.txt
vendored
Normal file
1
packages/now-node-server/test/fixtures/08-assets/subdirectory2/asset.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
asset2:RANDOMNESS_PLACEHOLDER
|
||||
File diff suppressed because it is too large
Load Diff
@@ -45,7 +45,7 @@ async function downloadInstallAndBundle(
|
||||
'package.json': new FileBlob({
|
||||
data: JSON.stringify({
|
||||
dependencies: {
|
||||
'@zeit/ncc': '0.1.12',
|
||||
'@zeit/ncc': '0.2.0',
|
||||
},
|
||||
}),
|
||||
}),
|
||||
@@ -109,6 +109,7 @@ exports.build = async ({ files, entrypoint, workPath }) => {
|
||||
[
|
||||
'process.chdir("./user");',
|
||||
`listener = require("./${path.join('user', entrypoint)}");`,
|
||||
'if (listener.default) listener = listener.default;',
|
||||
].join(' '),
|
||||
);
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/node",
|
||||
"version": "0.4.26",
|
||||
"version": "0.4.27-canary.1",
|
||||
"dependencies": {
|
||||
"@now/node-bridge": "^0.1.9",
|
||||
"fs-extra": "7.0.1"
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
12
packages/now-node/test/fixtures/08-assets/index.js
vendored
Normal file
12
packages/now-node/test/fixtures/08-assets/index.js
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
module.exports = (req, resp) => {
|
||||
const asset1 = fs.readFileSync(
|
||||
path.join(__dirname, 'subdirectory1/asset.txt'),
|
||||
);
|
||||
const asset2 = fs.readFileSync(
|
||||
path.join(__dirname, 'subdirectory2/asset.txt'),
|
||||
);
|
||||
resp.end(`${asset1},${asset2}`);
|
||||
};
|
||||
9
packages/now-node/test/fixtures/08-assets/now.json
vendored
Normal file
9
packages/now-node/test/fixtures/08-assets/now.json
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{ "src": "index.js", "use": "@now/node" }
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "asset1:RANDOMNESS_PLACEHOLDER,asset2:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
1
packages/now-node/test/fixtures/08-assets/subdirectory1/asset.txt
vendored
Normal file
1
packages/now-node/test/fixtures/08-assets/subdirectory1/asset.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
asset1:RANDOMNESS_PLACEHOLDER
|
||||
1
packages/now-node/test/fixtures/08-assets/subdirectory2/asset.txt
vendored
Normal file
1
packages/now-node/test/fixtures/08-assets/subdirectory2/asset.txt
vendored
Normal file
@@ -0,0 +1 @@
|
||||
asset2:RANDOMNESS_PLACEHOLDER
|
||||
BIN
packages/now-php/dist/launcher
vendored
BIN
packages/now-php/dist/launcher
vendored
Binary file not shown.
BIN
packages/now-php/dist/libphp7-7.1.so
vendored
BIN
packages/now-php/dist/libphp7-7.1.so
vendored
Binary file not shown.
BIN
packages/now-php/dist/modules/curl.so
vendored
BIN
packages/now-php/dist/modules/curl.so
vendored
Binary file not shown.
BIN
packages/now-php/dist/modules/json.so
vendored
BIN
packages/now-php/dist/modules/json.so
vendored
Binary file not shown.
@@ -25,10 +25,17 @@ type Request struct {
|
||||
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"`
|
||||
}
|
||||
|
||||
var phpScript = ""
|
||||
var phpScriptFull = ""
|
||||
|
||||
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
|
||||
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (Response, error) {
|
||||
engine, _ := php.New()
|
||||
context, _ := engine.NewContext()
|
||||
|
||||
@@ -78,11 +85,15 @@ func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.A
|
||||
context.Eval("$_SERVER[\"SERVER_NAME\"]=\"" + req.Host + "\";")
|
||||
context.Eval("$_SERVER[\"SERVER_PORT\"]=\"443\";")
|
||||
context.Eval("$_SERVER[\"HTTPS\"]=\"on\";")
|
||||
context.Eval("http_response_code(200);")
|
||||
|
||||
var stdout bytes.Buffer
|
||||
context.Output = &stdout
|
||||
context.Exec(phpScriptFull)
|
||||
|
||||
statusCodeVal, _ := context.Eval("return http_response_code();")
|
||||
statusCode := int(statusCodeVal.Int())
|
||||
|
||||
headers := make(map[string]string)
|
||||
headers["content-type"] = "text/html"
|
||||
for k, v := range context.Header {
|
||||
@@ -91,8 +102,15 @@ func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.A
|
||||
}
|
||||
}
|
||||
|
||||
resBody := base64.StdEncoding.EncodeToString(stdout.Bytes())
|
||||
|
||||
engine.Destroy()
|
||||
return events.APIGatewayProxyResponse{StatusCode: 200, Headers: headers, Body: stdout.String()}, nil
|
||||
return Response{
|
||||
StatusCode: statusCode,
|
||||
Headers: headers,
|
||||
Encoding: "base64",
|
||||
Body: resBody,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/php",
|
||||
"version": "0.4.11",
|
||||
"version": "0.4.12-canary.1",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
},
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@now/static-build",
|
||||
"version": "0.4.15",
|
||||
"version": "0.4.16-canary.0",
|
||||
"peerDependencies": {
|
||||
"@now/build-utils": ">=0.0.1"
|
||||
},
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -6,6 +6,6 @@
|
||||
],
|
||||
"probes": [
|
||||
{ "path": "/", "mustContain": "cow:RANDOMNESS_PLACEHOLDER" },
|
||||
{ "path": "/subdirectory", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
{ "path": "/subdirectory/", "mustContain": "yoda:RANDOMNESS_PLACEHOLDER" }
|
||||
]
|
||||
}
|
||||
|
||||
@@ -41,3 +41,14 @@ it('Should throw when package.json or next.config.js is not the "src"', async ()
|
||||
expect(err.message).toMatch(/package\.json/);
|
||||
}
|
||||
});
|
||||
|
||||
it(
|
||||
'Should build the static-files test',
|
||||
async () => {
|
||||
const { buildResult } = await runBuildLambda(
|
||||
path.join(__dirname, 'static-files'),
|
||||
);
|
||||
expect(buildResult['static/test.txt']).toBeDefined();
|
||||
},
|
||||
FOUR_MINUTES,
|
||||
);
|
||||
|
||||
1
test/integration/now-next/static-files/next.config.js
Normal file
1
test/integration/now-next/static-files/next.config.js
Normal file
@@ -0,0 +1 @@
|
||||
module.exports = {};
|
||||
6
test/integration/now-next/static-files/now.json
Normal file
6
test/integration/now-next/static-files/now.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{"src": "next.config.js", "use": "@now/next"}
|
||||
]
|
||||
}
|
||||
1
test/integration/now-next/static-files/pages/index.js
Normal file
1
test/integration/now-next/static-files/pages/index.js
Normal file
@@ -0,0 +1 @@
|
||||
export default () => 'Index page';
|
||||
1
test/integration/now-next/static-files/static/test.txt
Normal file
1
test/integration/now-next/static-files/static/test.txt
Normal file
@@ -0,0 +1 @@
|
||||
hello world
|
||||
@@ -104,11 +104,13 @@ async function fetchWithAuth (url, opts = {}) {
|
||||
if (!opts.headers) opts.headers = {};
|
||||
const authJsonPath = path.join(homedir(), '.now/auth.json');
|
||||
if (!(await fs.exists(authJsonPath))) {
|
||||
const tokens = process.env.NOW_AUTH_TOKENS.split(',');
|
||||
const token = tokens[Number(process.env.CIRCLE_BUILD_NUM) % tokens.length];
|
||||
await fs.mkdirp(path.dirname(authJsonPath));
|
||||
await fs.writeFile(
|
||||
authJsonPath,
|
||||
JSON.stringify({
|
||||
token: process.env.NOW_AUTH_TOKEN
|
||||
token
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,11 @@ async function testDeployment ({ builderUrl, buildUtilsUrl }, fixturePath) {
|
||||
|
||||
const randomness = Math.floor(Math.random() * 0x7fffffff).toString(16);
|
||||
for (const file of Object.keys(bodies)) {
|
||||
if ([ '.js', '.json', '.php', '.sh' ].includes(path.extname(file))) {
|
||||
if (
|
||||
[ '.js', '.json', '.php', '.sh', '.txt', '.md', '.mdx' ].includes(
|
||||
path.extname(file)
|
||||
)
|
||||
) {
|
||||
bodies[file] = Buffer.from(
|
||||
bodies[file].toString().replace(/RANDOMNESS_PLACEHOLDER/g, randomness)
|
||||
);
|
||||
|
||||
@@ -6,6 +6,7 @@ const {
|
||||
excludeLockFiles,
|
||||
normalizePackageJson,
|
||||
excludeStaticDirectory,
|
||||
onlyStaticDirectory,
|
||||
} = require('@now/next/utils');
|
||||
const FileRef = require('@now/build-utils/file-ref');
|
||||
|
||||
@@ -170,6 +171,38 @@ describe('excludeStaticDirectory', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('onlyStaticDirectory', () => {
|
||||
it('should keep only /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 = onlyStaticDirectory(files);
|
||||
expect(result['frontend/pages/index.js']).toBeUndefined();
|
||||
expect(result['yarn.lock']).toBeUndefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
expect(result['static/image.png']).toBeDefined();
|
||||
});
|
||||
|
||||
it('should keep 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 = onlyStaticDirectory(files);
|
||||
expect(result['frontend/pages/index.js']).toBeUndefined();
|
||||
expect(result['yarn.lock']).toBeUndefined();
|
||||
expect(result['package-lock.json']).toBeUndefined();
|
||||
expect(result['static/images/png/image.png']).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalizePackageJson', () => {
|
||||
it('should work without a package.json being supplied', () => {
|
||||
const result = normalizePackageJson();
|
||||
|
||||
Reference in New Issue
Block a user