diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 1ca87ab7..00000000 --- a/.prettierrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "singleQuote": false -} diff --git a/modules/AuthAPI.js b/modules/AuthAPI.js index 1fd2064e..4cf2d99a 100644 --- a/modules/AuthAPI.js +++ b/modules/AuthAPI.js @@ -1,22 +1,22 @@ -const crypto = require("crypto"); -const jwt = require("jsonwebtoken"); +const crypto = require('crypto'); +const jwt = require('jsonwebtoken'); -const db = require("./utils/data"); -const secretKey = require("./secretKey"); +const db = require('./utils/data'); +const secretKey = require('./secretKey'); function getCurrentSeconds() { return Math.floor(Date.now() / 1000); } function createTokenId() { - return crypto.randomBytes(16).toString("hex"); + return crypto.randomBytes(16).toString('hex'); } function createToken(scopes = {}) { return new Promise((resolve, reject) => { const payload = { jti: createTokenId(), - iss: "https://unpkg.com", + iss: 'https://unpkg.com', iat: getCurrentSeconds(), scopes }; @@ -24,7 +24,7 @@ function createToken(scopes = {}) { jwt.sign( payload, secretKey.private, - { algorithm: "RS256" }, + { algorithm: 'RS256' }, (error, token) => { if (error) { reject(error); @@ -36,11 +36,11 @@ function createToken(scopes = {}) { }); } -const revokedTokensSet = "revoked-tokens"; +const revokedTokensSet = 'revoked-tokens'; function verifyToken(token) { return new Promise((resolve, reject) => { - const options = { algorithms: ["RS256"] }; + const options = { algorithms: ['RS256'] }; jwt.verify(token, secretKey.public, options, (error, payload) => { if (error) { diff --git a/modules/BlacklistAPI.js b/modules/BlacklistAPI.js index 78635185..1910cd14 100644 --- a/modules/BlacklistAPI.js +++ b/modules/BlacklistAPI.js @@ -1,6 +1,6 @@ -const db = require("./utils/data"); +const db = require('./utils/data'); -const blacklistSet = "blacklisted-packages"; +const blacklistSet = 'blacklisted-packages'; function addPackage(packageName) { return new Promise((resolve, reject) => { diff --git a/modules/CloudflareAPI.js b/modules/CloudflareAPI.js index d4119d54..1e05e063 100644 --- a/modules/CloudflareAPI.js +++ b/modules/CloudflareAPI.js @@ -1,24 +1,24 @@ -require("isomorphic-fetch"); -const invariant = require("invariant"); -const gunzip = require("gunzip-maybe"); -const ndjson = require("ndjson"); +require('isomorphic-fetch'); +const invariant = require('invariant'); +const gunzip = require('gunzip-maybe'); +const ndjson = require('ndjson'); -const cloudflareURL = "https://api.cloudflare.com/client/v4"; +const cloudflareURL = 'https://api.cloudflare.com/client/v4'; const cloudflareEmail = process.env.CLOUDFLARE_EMAIL; const cloudflareKey = process.env.CLOUDFLARE_KEY; invariant( cloudflareEmail, - "Missing the $CLOUDFLARE_EMAIL environment variable" + 'Missing the $CLOUDFLARE_EMAIL environment variable' ); -invariant(cloudflareKey, "Missing the $CLOUDFLARE_KEY environment variable"); +invariant(cloudflareKey, 'Missing the $CLOUDFLARE_KEY environment variable'); function get(path, headers) { return fetch(`${cloudflareURL}${path}`, { headers: Object.assign({}, headers, { - "X-Auth-Email": cloudflareEmail, - "X-Auth-Key": cloudflareKey + 'X-Auth-Email': cloudflareEmail, + 'X-Auth-Key': cloudflareKey }) }); } @@ -32,7 +32,7 @@ function getJSON(path, headers) { if (!data.success) { console.error(`CloudflareAPI.getJSON failed at ${path}`); console.error(data); - throw new Error("Failed to getJSON from Cloudflare"); + throw new Error('Failed to getJSON from Cloudflare'); } return data.result; @@ -51,9 +51,9 @@ function reduceResults(target, values) { Object.keys(values).forEach(key => { const value = values[key]; - if (typeof value === "object" && value) { + if (typeof value === 'object' && value) { target[key] = reduceResults(target[key] || {}, value); - } else if (typeof value === "number") { + } else if (typeof value === 'number') { target[key] = (target[key] || 0) + values[key]; } }); @@ -75,7 +75,7 @@ function getZoneAnalyticsDashboard(zones, since, until) { function getJSONStream(path, headers) { const gzipHeaders = Object.assign({}, headers, { - "Accept-Encoding": "gzip" + 'Accept-Encoding': 'gzip' }); return get(path, gzipHeaders) @@ -84,7 +84,7 @@ function getJSONStream(path, headers) { } function getLogs(zoneId, startTime, endTime, fieldsArray) { - const fields = fieldsArray.join(","); + const fields = fieldsArray.join(','); // console.log( // `https://api.cloudflare.com/client/v4/zones/${zoneId}/logs/received?start=${startTime}&end=${endTime}&fields=${fields}` diff --git a/modules/StatsAPI.js b/modules/StatsAPI.js index 3e6d8d80..b0b1a798 100644 --- a/modules/StatsAPI.js +++ b/modules/StatsAPI.js @@ -1,7 +1,7 @@ -const db = require("./utils/data"); +const db = require('./utils/data'); -const CloudflareAPI = require("./CloudflareAPI"); -const BlacklistAPI = require("./BlacklistAPI"); +const CloudflareAPI = require('./CloudflareAPI'); +const BlacklistAPI = require('./BlacklistAPI'); function prunePackages(packagesMap) { return Promise.all( @@ -39,7 +39,7 @@ function createScoresMap(array) { function getScoresMap(key, n = 100) { return new Promise((resolve, reject) => { - db.zrevrange(key, 0, n, "withscores", (error, value) => { + db.zrevrange(key, 0, n, 'withscores', (error, value) => { if (error) { reject(error); } else { @@ -141,7 +141,7 @@ function extractPublicInfo(data) { }; } -const DomainNames = ["unpkg.com", "npmcdn.com"]; +const DomainNames = ['unpkg.com', 'npmcdn.com']; function fetchStats(since, until) { return CloudflareAPI.getZones(DomainNames).then(zones => { diff --git a/modules/__tests__/AuthAPI-test.js b/modules/__tests__/AuthAPI-test.js index 536b1bfd..2a085df1 100644 --- a/modules/__tests__/AuthAPI-test.js +++ b/modules/__tests__/AuthAPI-test.js @@ -1,11 +1,11 @@ -const AuthAPI = require("../AuthAPI"); +const AuthAPI = require('../AuthAPI'); -describe("Auth API", () => { +describe('Auth API', () => { beforeEach(done => { AuthAPI.removeAllRevokedTokens().then(() => done(), done); }); - it("creates tokens with the right scopes", done => { + it('creates tokens with the right scopes', done => { const scopes = { blacklist: { add: true, @@ -24,7 +24,7 @@ describe("Auth API", () => { }); }); - it("refuses to verify revoked tokens", done => { + it('refuses to verify revoked tokens', done => { const scopes = {}; AuthAPI.createToken(scopes).then(token => { diff --git a/modules/__tests__/BlacklistAPI-test.js b/modules/__tests__/BlacklistAPI-test.js index 4d2ef48d..daa4259f 100644 --- a/modules/__tests__/BlacklistAPI-test.js +++ b/modules/__tests__/BlacklistAPI-test.js @@ -1,12 +1,12 @@ -const BlacklistAPI = require("../BlacklistAPI"); +const BlacklistAPI = require('../BlacklistAPI'); -describe("Blacklist API", () => { +describe('Blacklist API', () => { beforeEach(done => { BlacklistAPI.removeAllPackages().then(() => done(), done); }); - it("adds and removes packages to/from the blacklist", done => { - const packageName = "bad-package"; + it('adds and removes packages to/from the blacklist', done => { + const packageName = 'bad-package'; BlacklistAPI.addPackage(packageName).then(() => { BlacklistAPI.getPackages().then(packageNames => { diff --git a/modules/__tests__/_auth-test.js b/modules/__tests__/_auth-test.js index f90d2d1b..1bfa33b1 100644 --- a/modules/__tests__/_auth-test.js +++ b/modules/__tests__/_auth-test.js @@ -1,46 +1,46 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); -const withRevokedToken = require("./utils/withRevokedToken"); -const withToken = require("./utils/withToken"); +const createServer = require('../createServer'); +const withRevokedToken = require('./utils/withRevokedToken'); +const withToken = require('./utils/withToken'); -describe("The /_auth endpoint", () => { +describe('The /_auth endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("POST /_auth", () => { - it("creates a new auth token", done => { + describe('POST /_auth', () => { + it('creates a new auth token', done => { request(server) - .post("/_auth") + .post('/_auth') .end((err, res) => { - expect(res.body).toHaveProperty("token"); + expect(res.body).toHaveProperty('token'); done(); }); }); }); - describe("GET /_auth", () => { - describe("with no auth", () => { - it("echoes back null", done => { + describe('GET /_auth', () => { + describe('with no auth', () => { + it('echoes back null', done => { request(server) - .get("/_auth") + .get('/_auth') .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBe(null); done(); }); }); }); - describe("with a revoked auth token", () => { - it("echoes back null", done => { + describe('with a revoked auth token', () => { + it('echoes back null', done => { withRevokedToken({ some: { scope: true } }, token => { request(server) - .get("/_auth?token=" + token) + .get('/_auth?token=' + token) .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBe(null); done(); }); @@ -48,14 +48,14 @@ describe("The /_auth endpoint", () => { }); }); - describe("with a valid auth token", () => { - it("echoes back the auth payload", done => { + describe('with a valid auth token', () => { + it('echoes back the auth payload', done => { withToken({ some: { scope: true } }, token => { request(server) - .get("/_auth?token=" + token) + .get('/_auth?token=' + token) .end((err, res) => { - expect(res.body).toHaveProperty("auth"); - expect(typeof res.body.auth).toBe("object"); + expect(res.body).toHaveProperty('auth'); + expect(typeof res.body.auth).toBe('object'); done(); }); }); diff --git a/modules/__tests__/_blacklist-test.js b/modules/__tests__/_blacklist-test.js index 0e04c9a8..c00b50fd 100644 --- a/modules/__tests__/_blacklist-test.js +++ b/modules/__tests__/_blacklist-test.js @@ -1,22 +1,22 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); -const clearBlacklist = require("./utils/clearBlacklist"); -const withToken = require("./utils/withToken"); +const createServer = require('../createServer'); +const clearBlacklist = require('./utils/clearBlacklist'); +const withToken = require('./utils/withToken'); -describe("The /_blacklist endpoint", () => { +describe('The /_blacklist endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("POST /_blacklist", () => { + describe('POST /_blacklist', () => { afterEach(clearBlacklist); - describe("with no auth", () => { - it("is forbidden", done => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .post("/_blacklist") + .post('/_blacklist') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -25,11 +25,11 @@ describe("The /_blacklist endpoint", () => { }); describe('with the "blacklist.add" scope', () => { - it("can add to the blacklist", done => { + it('can add to the blacklist', done => { withToken({ blacklist: { add: true } }, token => { request(server) - .post("/_blacklist") - .send({ token, packageName: "bad-package" }) + .post('/_blacklist') + .send({ token, packageName: 'bad-package' }) .end((err, res) => { expect(res.statusCode).toBe(200); expect(res.body.ok).toBe(true); @@ -40,11 +40,11 @@ describe("The /_blacklist endpoint", () => { }); }); - describe("GET /_blacklist", () => { - describe("with no auth", () => { - it("is forbidden", done => { + describe('GET /_blacklist', () => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .get("/_blacklist") + .get('/_blacklist') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -53,10 +53,10 @@ describe("The /_blacklist endpoint", () => { }); describe('with the "blacklist.read" scope', () => { - it("can read the blacklist", done => { + it('can read the blacklist', done => { withToken({ blacklist: { read: true } }, token => { request(server) - .get("/_blacklist?token=" + token) + .get('/_blacklist?token=' + token) .end((err, res) => { expect(res.statusCode).toBe(200); done(); @@ -66,11 +66,11 @@ describe("The /_blacklist endpoint", () => { }); }); - describe("DELETE /_blacklist/:packageName", () => { - describe("with no auth", () => { - it("is forbidden", done => { + describe('DELETE /_blacklist/:packageName', () => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .delete("/_blacklist/bad-package") + .delete('/_blacklist/bad-package') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -79,10 +79,10 @@ describe("The /_blacklist endpoint", () => { }); describe('with the "blacklist.remove" scope', () => { - it("can remove a package from the blacklist", done => { + it('can remove a package from the blacklist', done => { withToken({ blacklist: { remove: true } }, token => { request(server) - .delete("/_blacklist/bad-package") + .delete('/_blacklist/bad-package') .send({ token }) .end((err, res) => { expect(res.statusCode).toBe(200); @@ -92,10 +92,10 @@ describe("The /_blacklist endpoint", () => { }); }); - it("can remove a scoped package from the blacklist", done => { + it('can remove a scoped package from the blacklist', done => { withToken({ blacklist: { remove: true } }, token => { request(server) - .delete("/_blacklist/@scope/bad-package") + .delete('/_blacklist/@scope/bad-package') .send({ token }) .end((err, res) => { expect(res.statusCode).toBe(200); diff --git a/modules/__tests__/_publicKey-test.js b/modules/__tests__/_publicKey-test.js index fd65fd5f..a5d318b1 100644 --- a/modules/__tests__/_publicKey-test.js +++ b/modules/__tests__/_publicKey-test.js @@ -1,17 +1,17 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); +const createServer = require('../createServer'); -describe("The /_publicKey endpoint", () => { +describe('The /_publicKey endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("GET /_publicKey", () => { - it("echoes the public key", done => { + describe('GET /_publicKey', () => { + it('echoes the public key', done => { request(server) - .get("/_publicKey") + .get('/_publicKey') .end((err, res) => { expect(res.text).toMatch(/PUBLIC KEY/); done(); diff --git a/modules/__tests__/api-auth-test.js b/modules/__tests__/api-auth-test.js index fce8a7ba..2432806f 100644 --- a/modules/__tests__/api-auth-test.js +++ b/modules/__tests__/api-auth-test.js @@ -1,47 +1,47 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); -const withAuthHeader = require("./utils/withAuthHeader"); -const withRevokedToken = require("./utils/withRevokedToken"); -const withToken = require("./utils/withToken"); +const createServer = require('../createServer'); +const withAuthHeader = require('./utils/withAuthHeader'); +const withRevokedToken = require('./utils/withRevokedToken'); +const withToken = require('./utils/withToken'); -describe("The /api/auth endpoint", () => { +describe('The /api/auth endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("POST /api/auth", () => { - it("creates a new auth token", done => { + describe('POST /api/auth', () => { + it('creates a new auth token', done => { request(server) - .post("/api/auth") + .post('/api/auth') .end((err, res) => { - expect(res.body).toHaveProperty("token"); + expect(res.body).toHaveProperty('token'); done(); }); }); }); - describe("GET /api/auth", () => { - describe("with no auth", () => { - it("echoes back null", done => { + describe('GET /api/auth', () => { + describe('with no auth', () => { + it('echoes back null', done => { request(server) - .get("/api/auth") + .get('/api/auth') .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBe(null); done(); }); }); }); - describe("with a revoked auth token", () => { - it("echoes back null", done => { + describe('with a revoked auth token', () => { + it('echoes back null', done => { withRevokedToken({ some: { scope: true } }, token => { request(server) - .get("/api/auth?token=" + token) + .get('/api/auth?token=' + token) .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBe(null); done(); }); @@ -49,16 +49,16 @@ describe("The /api/auth endpoint", () => { }); }); - describe("with a valid auth token", () => { - describe("in the query string", () => { - it("echoes back the auth payload", done => { + describe('with a valid auth token', () => { + describe('in the query string', () => { + it('echoes back the auth payload', done => { const scopes = { some: { scope: true } }; withToken(scopes, token => { request(server) - .get("/api/auth?token=" + token) + .get('/api/auth?token=' + token) .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBeDefined(); expect(res.body.auth.scopes).toMatchObject(scopes); done(); @@ -67,16 +67,16 @@ describe("The /api/auth endpoint", () => { }); }); - describe("in the Authorization header", () => { - it("echoes back the auth payload", done => { + describe('in the Authorization header', () => { + it('echoes back the auth payload', done => { const scopes = { some: { scope: true } }; withAuthHeader(scopes, header => { request(server) - .get("/api/auth") + .get('/api/auth') .set({ Authorization: header }) .end((err, res) => { - expect(res.body).toHaveProperty("auth"); + expect(res.body).toHaveProperty('auth'); expect(res.body.auth).toBeDefined(); expect(res.body.auth.scopes).toMatchObject(scopes); done(); diff --git a/modules/__tests__/api-blacklist-test.js b/modules/__tests__/api-blacklist-test.js index 77092fc3..acb93956 100644 --- a/modules/__tests__/api-blacklist-test.js +++ b/modules/__tests__/api-blacklist-test.js @@ -1,22 +1,22 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); -const clearBlacklist = require("./utils/clearBlacklist"); -const withToken = require("./utils/withToken"); +const createServer = require('../createServer'); +const clearBlacklist = require('./utils/clearBlacklist'); +const withToken = require('./utils/withToken'); -describe("The /api/blacklist endpoint", () => { +describe('The /api/blacklist endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("POST /api/blacklist", () => { + describe('POST /api/blacklist', () => { afterEach(clearBlacklist); - describe("with no auth", () => { - it("is forbidden", done => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .post("/api/blacklist") + .post('/api/blacklist') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -25,11 +25,11 @@ describe("The /api/blacklist endpoint", () => { }); describe('with the "blacklist.add" scope', () => { - it("can add to the blacklist", done => { + it('can add to the blacklist', done => { withToken({ blacklist: { add: true } }, token => { request(server) - .post("/api/blacklist") - .send({ token, packageName: "bad-package" }) + .post('/api/blacklist') + .send({ token, packageName: 'bad-package' }) .end((err, res) => { expect(res.statusCode).toBe(200); expect(res.body.ok).toBe(true); @@ -40,11 +40,11 @@ describe("The /api/blacklist endpoint", () => { }); }); - describe("GET /api/blacklist", () => { - describe("with no auth", () => { - it("is forbidden", done => { + describe('GET /api/blacklist', () => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .get("/api/blacklist") + .get('/api/blacklist') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -53,10 +53,10 @@ describe("The /api/blacklist endpoint", () => { }); describe('with the "blacklist.read" scope', () => { - it("can read the blacklist", done => { + it('can read the blacklist', done => { withToken({ blacklist: { read: true } }, token => { request(server) - .get("/api/blacklist?token=" + token) + .get('/api/blacklist?token=' + token) .end((err, res) => { expect(res.statusCode).toBe(200); done(); @@ -66,11 +66,11 @@ describe("The /api/blacklist endpoint", () => { }); }); - describe("DELETE /api/blacklist", () => { - describe("with no auth", () => { - it("is forbidden", done => { + describe('DELETE /api/blacklist', () => { + describe('with no auth', () => { + it('is forbidden', done => { request(server) - .delete("/api/blacklist") + .delete('/api/blacklist') .end((err, res) => { expect(res.statusCode).toBe(403); done(); @@ -79,11 +79,11 @@ describe("The /api/blacklist endpoint", () => { }); describe('with the "blacklist.remove" scope', () => { - it("can remove a package from the blacklist", done => { + it('can remove a package from the blacklist', done => { withToken({ blacklist: { remove: true } }, token => { request(server) - .delete("/api/blacklist") - .send({ token, packageName: "bad-package" }) + .delete('/api/blacklist') + .send({ token, packageName: 'bad-package' }) .end((err, res) => { expect(res.statusCode).toBe(200); expect(res.body.ok).toBe(true); @@ -92,11 +92,11 @@ describe("The /api/blacklist endpoint", () => { }); }); - it("can remove a scoped package from the blacklist", done => { + it('can remove a scoped package from the blacklist', done => { withToken({ blacklist: { remove: true } }, token => { request(server) - .delete("/api/blacklist") - .send({ token, packageName: "@scope/bad-package" }) + .delete('/api/blacklist') + .send({ token, packageName: '@scope/bad-package' }) .end((err, res) => { expect(res.statusCode).toBe(200); expect(res.body.ok).toBe(true); diff --git a/modules/__tests__/api-publicKey-test.js b/modules/__tests__/api-publicKey-test.js index 971fa626..bcec4792 100644 --- a/modules/__tests__/api-publicKey-test.js +++ b/modules/__tests__/api-publicKey-test.js @@ -1,17 +1,17 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); +const createServer = require('../createServer'); -describe("The /api/publicKey endpoint", () => { +describe('The /api/publicKey endpoint', () => { let server; beforeEach(() => { server = createServer(); }); - describe("GET /api/publicKey", () => { - it("echoes the public key", done => { + describe('GET /api/publicKey', () => { + it('echoes the public key', done => { request(server) - .get("/api/publicKey") + .get('/api/publicKey') .end((err, res) => { expect(res.text).toMatch(/PUBLIC KEY/); done(); diff --git a/modules/__tests__/server-test.js b/modules/__tests__/server-test.js index 1051e359..5b92a1e0 100644 --- a/modules/__tests__/server-test.js +++ b/modules/__tests__/server-test.js @@ -1,62 +1,62 @@ -const request = require("supertest"); +const request = require('supertest'); -const createServer = require("../createServer"); +const createServer = require('../createServer'); -const clearBlacklist = require("./utils/clearBlacklist"); -const withBlacklist = require("./utils/withBlacklist"); +const clearBlacklist = require('./utils/clearBlacklist'); +const withBlacklist = require('./utils/withBlacklist'); -describe("The server", () => { +describe('The server', () => { let server; beforeEach(() => { server = createServer(); }); - it("redirects /_meta to ?meta", done => { + it('redirects /_meta to ?meta', done => { request(server) - .get("/_meta/react") + .get('/_meta/react') .end((err, res) => { expect(res.statusCode).toBe(301); - expect(res.headers.location).toBe("/react?meta"); + expect(res.headers.location).toBe('/react?meta'); done(); }); }); - it("redirects ?json to ?meta", done => { + it('redirects ?json to ?meta', done => { request(server) - .get("/react?json") + .get('/react?json') .end((err, res) => { expect(res.statusCode).toBe(301); - expect(res.headers.location).toBe("/react?meta"); + expect(res.headers.location).toBe('/react?meta'); done(); }); }); - it("redirects invalid query params", done => { + it('redirects invalid query params', done => { request(server) - .get("/react?main=index&invalid") + .get('/react?main=index&invalid') .end((err, res) => { expect(res.statusCode).toBe(302); - expect(res.headers.location).toBe("/react?main=index"); + expect(res.headers.location).toBe('/react?main=index'); done(); }); }); - it("rejects invalid package names", done => { + it('rejects invalid package names', done => { request(server) - .get("/_invalid/index.js") + .get('/_invalid/index.js') .end((err, res) => { expect(res.statusCode).toBe(403); done(); }); }); - describe("blacklisted packages", () => { + describe('blacklisted packages', () => { afterEach(clearBlacklist); - it("does not serve blacklisted packages", done => { - withBlacklist(["bad-package"], () => { + it('does not serve blacklisted packages', done => { + withBlacklist(['bad-package'], () => { request(server) - .get("/bad-package/index.js") + .get('/bad-package/index.js') .end((err, res) => { expect(res.statusCode).toBe(403); done(); diff --git a/modules/__tests__/setupTestFramework.js b/modules/__tests__/setupTestFramework.js index 58fe819f..bf502164 100644 --- a/modules/__tests__/setupTestFramework.js +++ b/modules/__tests__/setupTestFramework.js @@ -1,3 +1,3 @@ -const closeDatabase = require("./utils/closeDatabase"); +const closeDatabase = require('./utils/closeDatabase'); afterAll(closeDatabase); diff --git a/modules/__tests__/utils/clearBlacklist.js b/modules/__tests__/utils/clearBlacklist.js index 8bbbf319..9b8df43c 100644 --- a/modules/__tests__/utils/clearBlacklist.js +++ b/modules/__tests__/utils/clearBlacklist.js @@ -1,4 +1,4 @@ -const BlacklistAPI = require("../../BlacklistAPI"); +const BlacklistAPI = require('../../BlacklistAPI'); function clearBlacklist(done) { BlacklistAPI.removeAllPackages().then(done, done); diff --git a/modules/__tests__/utils/withAuthHeader.js b/modules/__tests__/utils/withAuthHeader.js index 5c3f8847..595a8166 100644 --- a/modules/__tests__/utils/withAuthHeader.js +++ b/modules/__tests__/utils/withAuthHeader.js @@ -1,7 +1,7 @@ -const withToken = require("./withToken"); +const withToken = require('./withToken'); function encodeBase64(token) { - return Buffer.from(token).toString("base64"); + return Buffer.from(token).toString('base64'); } function withAuthHeader(scopes, done) { diff --git a/modules/__tests__/utils/withBlacklist.js b/modules/__tests__/utils/withBlacklist.js index 98e3be3c..28d8d698 100644 --- a/modules/__tests__/utils/withBlacklist.js +++ b/modules/__tests__/utils/withBlacklist.js @@ -1,4 +1,4 @@ -const BlacklistAPI = require("../../BlacklistAPI"); +const BlacklistAPI = require('../../BlacklistAPI'); function withBlacklist(blacklist, done) { Promise.all(blacklist.map(BlacklistAPI.addPackage)).then(done); diff --git a/modules/__tests__/utils/withRevokedToken.js b/modules/__tests__/utils/withRevokedToken.js index 2e55fce5..447463b1 100644 --- a/modules/__tests__/utils/withRevokedToken.js +++ b/modules/__tests__/utils/withRevokedToken.js @@ -1,5 +1,5 @@ -const withToken = require("./withToken"); -const AuthAPI = require("../../AuthAPI"); +const withToken = require('./withToken'); +const AuthAPI = require('../../AuthAPI'); function withRevokedToken(scopes, done) { withToken(scopes, token => { diff --git a/modules/__tests__/utils/withToken.js b/modules/__tests__/utils/withToken.js index 9dbc4a0f..ff65d1ae 100644 --- a/modules/__tests__/utils/withToken.js +++ b/modules/__tests__/utils/withToken.js @@ -1,4 +1,4 @@ -const AuthAPI = require("../../AuthAPI"); +const AuthAPI = require('../../AuthAPI'); function withToken(scopes, done) { AuthAPI.createToken(scopes).then(done); diff --git a/modules/actions/addToBlacklist.js b/modules/actions/addToBlacklist.js index 2f710ef4..ac2eb990 100644 --- a/modules/actions/addToBlacklist.js +++ b/modules/actions/addToBlacklist.js @@ -1,6 +1,6 @@ -const validateNpmPackageName = require("validate-npm-package-name"); +const validateNpmPackageName = require('validate-npm-package-name'); -const BlacklistAPI = require("../BlacklistAPI"); +const BlacklistAPI = require('../BlacklistAPI'); function addToBlacklist(req, res) { const packageName = req.body.packageName; @@ -15,7 +15,7 @@ function addToBlacklist(req, res) { // Disallow invalid package names. if (nameErrors) { - const reason = nameErrors.join(", "); + const reason = nameErrors.join(', '); return res.status(403).send({ error: `Invalid package name "${packageName}" (${reason})` }); @@ -33,7 +33,7 @@ function addToBlacklist(req, res) { res.send({ ok: true, message: `Package "${packageName}" was ${ - added ? "added to" : "already in" + added ? 'added to' : 'already in' } the blacklist` }); }, diff --git a/modules/actions/createAuth.js b/modules/actions/createAuth.js index 4fd8086a..588d509c 100644 --- a/modules/actions/createAuth.js +++ b/modules/actions/createAuth.js @@ -1,4 +1,4 @@ -const AuthAPI = require("../AuthAPI"); +const AuthAPI = require('../AuthAPI'); const defaultScopes = { blacklist: { @@ -15,7 +15,7 @@ function createAuth(req, res) { console.error(error); res.status(500).send({ - error: "Unable to generate auth token" + error: 'Unable to generate auth token' }); } ); diff --git a/modules/actions/removeFromBlacklist.js b/modules/actions/removeFromBlacklist.js index 7ad3faf5..c4d44ecb 100644 --- a/modules/actions/removeFromBlacklist.js +++ b/modules/actions/removeFromBlacklist.js @@ -1,6 +1,6 @@ -const validateNpmPackageName = require("validate-npm-package-name"); +const validateNpmPackageName = require('validate-npm-package-name'); -const BlacklistAPI = require("../BlacklistAPI"); +const BlacklistAPI = require('../BlacklistAPI'); function removeFromBlacklist(req, res) { // TODO: Remove req.packageName when DELETE @@ -17,7 +17,7 @@ function removeFromBlacklist(req, res) { // Disallow invalid package names. if (nameErrors) { - const reason = nameErrors.join(", "); + const reason = nameErrors.join(', '); return res.status(403).send({ error: `Invalid package name "${packageName}" (${reason})` }); @@ -35,7 +35,7 @@ function removeFromBlacklist(req, res) { res.send({ ok: true, message: `Package "${packageName}" was ${ - removed ? "removed from" : "not in" + removed ? 'removed from' : 'not in' } the blacklist` }); }, diff --git a/modules/actions/serveAutoIndexPage.js b/modules/actions/serveAutoIndexPage.js index 1fc43041..e33878dc 100644 --- a/modules/actions/serveAutoIndexPage.js +++ b/modules/actions/serveAutoIndexPage.js @@ -1,21 +1,21 @@ -const React = require("react"); -const ReactDOMServer = require("react-dom/server"); -const semver = require("semver"); +const React = require('react'); +const ReactDOMServer = require('react-dom/server'); +const semver = require('semver'); -const MainPage = require("../client/MainPage"); -const AutoIndexApp = require("../client/autoIndex/App"); -const createHTML = require("../client/utils/createHTML"); -const renderPage = require("../utils/renderPage"); +const MainPage = require('../client/MainPage'); +const AutoIndexApp = require('../client/autoIndex/App'); +const createHTML = require('../client/utils/createHTML'); +const renderPage = require('../utils/renderPage'); const globalScripts = - process.env.NODE_ENV === "production" + process.env.NODE_ENV === 'production' ? [ - "/react@16.4.1/umd/react.production.min.js", - "/react-dom@16.4.1/umd/react-dom.production.min.js" + '/react@16.4.1/umd/react.production.min.js', + '/react-dom@16.4.1/umd/react-dom.production.min.js' ] : [ - "/react@16.4.1/umd/react.development.js", - "/react-dom@16.4.1/umd/react-dom.development.js" + '/react@16.4.1/umd/react.development.js', + '/react-dom@16.4.1/umd/react-dom.development.js' ]; function byVersion(a, b) { @@ -23,8 +23,8 @@ function byVersion(a, b) { } function serveAutoIndexPage(req, res) { - const scripts = globalScripts.concat(req.assets.getScripts("autoIndex")); - const styles = req.assets.getStyles("autoIndex"); + const scripts = globalScripts.concat(req.assets.getScripts('autoIndex')); + const styles = req.assets.getStyles('autoIndex'); const props = { packageName: req.packageName, @@ -49,8 +49,8 @@ function serveAutoIndexPage(req, res) { res .set({ - "Cache-Control": "public,max-age=60", // 1 minute - "Cache-Tag": "auto-index" + 'Cache-Control': 'public,max-age=60', // 1 minute + 'Cache-Tag': 'auto-index' }) .send(html); } diff --git a/modules/actions/serveFile.js b/modules/actions/serveFile.js index 1d1a5561..93bf4411 100644 --- a/modules/actions/serveFile.js +++ b/modules/actions/serveFile.js @@ -1,8 +1,8 @@ -const serveAutoIndexPage = require("./serveAutoIndexPage"); -const serveHTMLModule = require("./serveHTMLModule"); -const serveJavaScriptModule = require("./serveJavaScriptModule"); -const serveStaticFile = require("./serveStaticFile"); -const serveMetadata = require("./serveMetadata"); +const serveAutoIndexPage = require('./serveAutoIndexPage'); +const serveHTMLModule = require('./serveHTMLModule'); +const serveJavaScriptModule = require('./serveJavaScriptModule'); +const serveStaticFile = require('./serveStaticFile'); +const serveMetadata = require('./serveMetadata'); /** * Send the file, JSON metadata, or HTML directory listing. @@ -12,23 +12,23 @@ function serveFile(req, res) { return serveMetadata(req, res); } - if (req.entry.type === "directory") { + if (req.entry.type === 'directory') { return serveAutoIndexPage(req, res); } if (req.query.module != null) { - if (req.entry.contentType === "application/javascript") { + if (req.entry.contentType === 'application/javascript') { return serveJavaScriptModule(req, res); } - if (req.entry.contentType === "text/html") { + if (req.entry.contentType === 'text/html') { return serveHTMLModule(req, res); } return res .status(403) - .type("text") - .send("?module mode is available only for JavaScript and HTML files"); + .type('text') + .send('?module mode is available only for JavaScript and HTML files'); } serveStaticFile(req, res); diff --git a/modules/actions/serveHTMLModule.js b/modules/actions/serveHTMLModule.js index 1b2cdf26..8d0cd00f 100644 --- a/modules/actions/serveHTMLModule.js +++ b/modules/actions/serveHTMLModule.js @@ -1,14 +1,14 @@ -const etag = require("etag"); -const cheerio = require("cheerio"); +const etag = require('etag'); +const cheerio = require('cheerio'); -const getContentTypeHeader = require("../utils/getContentTypeHeader"); -const rewriteBareModuleIdentifiers = require("../utils/rewriteBareModuleIdentifiers"); +const getContentTypeHeader = require('../utils/getContentTypeHeader'); +const rewriteBareModuleIdentifiers = require('../utils/rewriteBareModuleIdentifiers'); function serveHTMLModule(req, res) { try { - const $ = cheerio.load(req.entry.content.toString("utf8")); + const $ = cheerio.load(req.entry.content.toString('utf8')); - $("script[type=module]").each((index, element) => { + $('script[type=module]').each((index, element) => { $(element).html( rewriteBareModuleIdentifiers($(element).html(), req.packageConfig) ); @@ -18,11 +18,11 @@ function serveHTMLModule(req, res) { res .set({ - "Content-Length": Buffer.byteLength(code), - "Content-Type": getContentTypeHeader(req.entry.contentType), - "Cache-Control": "public, max-age=31536000, immutable", // 1 year + 'Content-Length': Buffer.byteLength(code), + 'Content-Type': getContentTypeHeader(req.entry.contentType), + 'Cache-Control': 'public, max-age=31536000, immutable', // 1 year ETag: etag(code), - "Cache-Tag": "file, html-file, html-module" + 'Cache-Tag': 'file, html-file, html-module' }) .send(code); } catch (error) { @@ -38,7 +38,7 @@ function serveHTMLModule(req, res) { res .status(500) - .type("text") + .type('text') .send( `Cannot generate module for ${req.packageSpec}${ req.filename diff --git a/modules/actions/serveJavaScriptModule.js b/modules/actions/serveJavaScriptModule.js index 5772c95d..6dcd5f0a 100644 --- a/modules/actions/serveJavaScriptModule.js +++ b/modules/actions/serveJavaScriptModule.js @@ -1,22 +1,22 @@ -const etag = require("etag"); +const etag = require('etag'); -const getContentTypeHeader = require("../utils/getContentTypeHeader"); -const rewriteBareModuleIdentifiers = require("../utils/rewriteBareModuleIdentifiers"); +const getContentTypeHeader = require('../utils/getContentTypeHeader'); +const rewriteBareModuleIdentifiers = require('../utils/rewriteBareModuleIdentifiers'); function serveJavaScriptModule(req, res) { try { const code = rewriteBareModuleIdentifiers( - req.entry.content.toString("utf8"), + req.entry.content.toString('utf8'), req.packageConfig ); res .set({ - "Content-Length": Buffer.byteLength(code), - "Content-Type": getContentTypeHeader(req.entry.contentType), - "Cache-Control": "public, max-age=31536000, immutable", // 1 year + 'Content-Length': Buffer.byteLength(code), + 'Content-Type': getContentTypeHeader(req.entry.contentType), + 'Cache-Control': 'public, max-age=31536000, immutable', // 1 year ETag: etag(code), - "Cache-Tag": "file,js-file,js-module" + 'Cache-Tag': 'file,js-file,js-module' }) .send(code); } catch (error) { @@ -32,7 +32,7 @@ function serveJavaScriptModule(req, res) { res .status(500) - .type("text") + .type('text') .send( `Cannot generate module for ${req.packageSpec}${ req.filename diff --git a/modules/actions/serveMetadata.js b/modules/actions/serveMetadata.js index 19987b42..5c44c8c7 100644 --- a/modules/actions/serveMetadata.js +++ b/modules/actions/serveMetadata.js @@ -1,9 +1,9 @@ -const path = require("path"); +const path = require('path'); -const addLeadingSlash = require("../utils/addLeadingSlash"); +const addLeadingSlash = require('../utils/addLeadingSlash'); function getMatchingEntries(entry, entries) { - const dirname = entry.name || "."; + const dirname = entry.name || '.'; return Object.keys(entries) .filter(name => entry.name !== name && path.dirname(name) === dirname) @@ -16,12 +16,12 @@ function getMetadata(entry, entries) { type: entry.type }; - if (entry.type === "file") { + if (entry.type === 'file') { metadata.contentType = entry.contentType; metadata.integrity = entry.integrity; metadata.lastModified = entry.lastModified; metadata.size = entry.size; - } else if (entry.type === "directory") { + } else if (entry.type === 'directory') { metadata.files = getMatchingEntries(entry, entries).map(e => getMetadata(e, entries) ); @@ -35,8 +35,8 @@ function serveMetadata(req, res) { res .set({ - "Cache-Control": "public, max-age=31536000, immutable", // 1 year - "Cache-Tag": "meta" + 'Cache-Control': 'public, max-age=31536000, immutable', // 1 year + 'Cache-Tag': 'meta' }) .send(metadata); } diff --git a/modules/actions/serveRootPage.js b/modules/actions/serveRootPage.js index 627ab076..2a1b3484 100644 --- a/modules/actions/serveRootPage.js +++ b/modules/actions/serveRootPage.js @@ -1,22 +1,22 @@ -const MainPage = require("../client/MainPage"); -const renderPage = require("../utils/renderPage"); +const MainPage = require('../client/MainPage'); +const renderPage = require('../utils/renderPage'); const globalScripts = - process.env.NODE_ENV === "production" + process.env.NODE_ENV === 'production' ? [ - "/react@16.4.1/umd/react.production.min.js", - "/react-dom@16.4.1/umd/react-dom.production.min.js", - "/react-router-dom@4.3.1/umd/react-router-dom.min.js" + '/react@16.4.1/umd/react.production.min.js', + '/react-dom@16.4.1/umd/react-dom.production.min.js', + '/react-router-dom@4.3.1/umd/react-router-dom.min.js' ] : [ - "/react@16.4.1/umd/react.development.js", - "/react-dom@16.4.1/umd/react-dom.development.js", - "/react-router-dom@4.3.1/umd/react-router-dom.js" + '/react@16.4.1/umd/react.development.js', + '/react-dom@16.4.1/umd/react-dom.development.js', + '/react-router-dom@4.3.1/umd/react-router-dom.js' ]; function serveRootPage(req, res) { - const scripts = globalScripts.concat(req.assets.getScripts("main")); - const styles = req.assets.getStyles("main"); + const scripts = globalScripts.concat(req.assets.getScripts('main')); + const styles = req.assets.getStyles('main'); const html = renderPage(MainPage, { scripts: scripts, diff --git a/modules/actions/serveStaticFile.js b/modules/actions/serveStaticFile.js index 3f491135..26fba3d0 100644 --- a/modules/actions/serveStaticFile.js +++ b/modules/actions/serveStaticFile.js @@ -1,10 +1,10 @@ -const path = require("path"); -const etag = require("etag"); +const path = require('path'); +const etag = require('etag'); -const getContentTypeHeader = require("../utils/getContentTypeHeader"); +const getContentTypeHeader = require('../utils/getContentTypeHeader'); function serveStaticFile(req, res) { - const tags = ["file"]; + const tags = ['file']; const ext = path.extname(req.entry.name).substr(1); if (ext) { @@ -13,12 +13,12 @@ function serveStaticFile(req, res) { res .set({ - "Content-Length": req.entry.size, - "Content-Type": getContentTypeHeader(req.entry.contentType), - "Cache-Control": "public, max-age=31536000, immutable", // 1 year - "Last-Modified": req.entry.lastModified, + 'Content-Length': req.entry.size, + 'Content-Type': getContentTypeHeader(req.entry.contentType), + 'Cache-Control': 'public, max-age=31536000, immutable', // 1 year + 'Last-Modified': req.entry.lastModified, ETag: etag(req.entry.content), - "Cache-Tag": tags.join(",") + 'Cache-Tag': tags.join(',') }) .send(req.entry.content); } diff --git a/modules/actions/showBlacklist.js b/modules/actions/showBlacklist.js index 8f8b3554..03ca2984 100644 --- a/modules/actions/showBlacklist.js +++ b/modules/actions/showBlacklist.js @@ -1,4 +1,4 @@ -const BlacklistAPI = require("../BlacklistAPI"); +const BlacklistAPI = require('../BlacklistAPI'); function showBlacklist(req, res) { BlacklistAPI.getPackages().then( @@ -8,7 +8,7 @@ function showBlacklist(req, res) { error => { console.error(error); res.status(500).send({ - error: "Unable to fetch blacklist" + error: 'Unable to fetch blacklist' }); } ); diff --git a/modules/actions/showPublicKey.js b/modules/actions/showPublicKey.js index 0e16b414..1b8c66e3 100644 --- a/modules/actions/showPublicKey.js +++ b/modules/actions/showPublicKey.js @@ -1,4 +1,4 @@ -const secretKey = require("../secretKey"); +const secretKey = require('../secretKey'); function showPublicKey(req, res) { res.send({ publicKey: secretKey.public }); diff --git a/modules/actions/showStats.js b/modules/actions/showStats.js index a87bddae..e6e6db9e 100644 --- a/modules/actions/showStats.js +++ b/modules/actions/showStats.js @@ -1,21 +1,21 @@ -const subDays = require("date-fns/sub_days"); -const startOfDay = require("date-fns/start_of_day"); -const startOfSecond = require("date-fns/start_of_second"); +const subDays = require('date-fns/sub_days'); +const startOfDay = require('date-fns/start_of_day'); +const startOfSecond = require('date-fns/start_of_second'); -const StatsAPI = require("../StatsAPI"); +const StatsAPI = require('../StatsAPI'); function showStats(req, res) { let since, until; switch (req.query.period) { - case "last-day": + case 'last-day': until = startOfDay(new Date()); since = subDays(until, 1); break; - case "last-week": + case 'last-week': until = startOfDay(new Date()); since = subDays(until, 7); break; - case "last-month": + case 'last-month': until = startOfDay(new Date()); since = subDays(until, 30); break; @@ -27,35 +27,35 @@ function showStats(req, res) { } if (isNaN(since.getTime())) { - return res.status(403).send({ error: "?since is not a valid date" }); + return res.status(403).send({ error: '?since is not a valid date' }); } if (isNaN(until.getTime())) { - return res.status(403).send({ error: "?until is not a valid date" }); + return res.status(403).send({ error: '?until is not a valid date' }); } if (until <= since) { return res .status(403) - .send({ error: "?until date must come after ?since date" }); + .send({ error: '?until date must come after ?since date' }); } if (until >= new Date()) { - return res.status(403).send({ error: "?until must be a date in the past" }); + return res.status(403).send({ error: '?until must be a date in the past' }); } StatsAPI.getStats(since, until).then( stats => { res .set({ - "Cache-Control": "public, max-age=60", - "Cache-Tag": "stats" + 'Cache-Control': 'public, max-age=60', + 'Cache-Tag': 'stats' }) .send(stats); }, error => { console.error(error); - res.status(500).send({ error: "Unable to fetch stats" }); + res.status(500).send({ error: 'Unable to fetch stats' }); } ); } diff --git a/modules/client/MainPage.js b/modules/client/MainPage.js index ed140a58..7e29d49b 100644 --- a/modules/client/MainPage.js +++ b/modules/client/MainPage.js @@ -1,8 +1,8 @@ -const React = require("react"); -const PropTypes = require("prop-types"); +const React = require('react'); +const PropTypes = require('prop-types'); -const createHTML = require("./utils/createHTML"); -const x = require("./utils/execScript"); +const createHTML = require('./utils/createHTML'); +const x = require('./utils/execScript'); function MainPage({ title, description, scripts, styles, data, content }) { return ( @@ -17,19 +17,23 @@ function MainPage({ title, description, scripts, styles, data, content }) { /> - {styles.map(s => )} + {styles.map(s => ( + + ))} {x( - "window.Promise || document.write('\\x3Cscript src=\"/_polyfills/es6-promise.min.js\">\\x3C/script>\\x3Cscript>ES6Promise.polyfill()\\x3C/script>')" + 'window.Promise || document.write(\'\\x3Cscript src="/_polyfills/es6-promise.min.js">\\x3C/script>\\x3Cscript>ES6Promise.polyfill()\\x3C/script>\')' )} {x( - "window.fetch || document.write('\\x3Cscript src=\"/_polyfills/fetch.min.js\">\\x3C/script>')" + 'window.fetch || document.write(\'\\x3Cscript src="/_polyfills/fetch.min.js">\\x3C/script>\')' )} {x(`window.__DATA__ = ${JSON.stringify(data)}`)} {title}
- {scripts.map(s =>