Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Upgrade to express 5.0.1 #9530

Open
wants to merge 20 commits into
base: alpha
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29,773 changes: 7,550 additions & 22,223 deletions package-lock.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,10 @@
"@parse/fs-files-adapter": "3.0.0",
"@parse/push-adapter": "6.10.0",
"bcryptjs": "2.4.3",
"body-parser": "1.20.3",
"commander": "13.0.0",
"cors": "2.8.5",
"deepcopy": "2.1.0",
"express": "4.21.2",
"express": "5.0.1",
"express-rate-limit": "7.5.0",
"follow-redirects": "1.15.9",
"graphql": "16.9.0",
Expand All @@ -58,6 +57,7 @@
"punycode": "2.3.1",
"rate-limit-redis": "4.2.0",
"redis": "4.7.0",
"router": "2.0.0",
"semver": "7.7.1",
"subscriptions-transport-ws": "0.11.0",
"tv4": "1.3.0",
Expand Down
3 changes: 1 addition & 2 deletions spec/HTTPRequest.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@

const httpRequest = require('../lib/request'),
HTTPResponse = require('../lib/request').HTTPResponse,
bodyParser = require('body-parser'),
express = require('express');

const port = 13371;
const httpRequestServer = `http://localhost:${port}`;

function startServer(done) {
const app = express();
app.use(bodyParser.json({ type: '*/*' }));
app.use(express.json({ type: '*/*' }));
app.get('/hello', function (req, res) {
res.json({ response: 'OK' });
});
Expand Down
3 changes: 1 addition & 2 deletions spec/ParseHooks.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ const request = require('../lib/request');
const triggers = require('../lib/triggers');
const HooksController = require('../lib/Controllers/HooksController').default;
const express = require('express');
const bodyParser = require('body-parser');
const auth = require('../lib/Auth');
const Config = require('../lib/Config');

Expand All @@ -17,7 +16,7 @@ describe('Hooks', () => {
beforeEach(done => {
if (!app) {
app = express();
app.use(bodyParser.json({ type: '*/*' }));
app.use(express.json({ type: '*/*' }));
server = app.listen(port, undefined, done);
} else {
done();
Expand Down
3 changes: 1 addition & 2 deletions spec/vulnerabilities.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -250,11 +250,10 @@ describe('Vulnerabilities', () => {

it_id('e8b5f1e1-8326-4c70-b5f4-1e8678dfff8d')(it)('denies creating a hook with polluted data', async () => {
const express = require('express');
const bodyParser = require('body-parser');
const port = 34567;
const hookServerURL = 'http://localhost:' + port;
const app = express();
app.use(bodyParser.json({ type: '*/*' }));
app.use(express.json({ type: '*/*' }));
const server = await new Promise(resolve => {
const res = app.listen(port, undefined, () => resolve(res));
});
Expand Down
4 changes: 2 additions & 2 deletions src/Controllers/AnalyticsController.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export class AnalyticsController extends AdaptableController {
appOpened(req) {
return Promise.resolve()
.then(() => {
return this.adapter.appOpened(req.body, req);
return this.adapter.appOpened(req.body || {}, req);
})
.then(response => {
return { response: response || {} };
Expand All @@ -18,7 +18,7 @@ export class AnalyticsController extends AdaptableController {
trackEvent(req) {
return Promise.resolve()
.then(() => {
return this.adapter.trackEvent(req.params.eventName, req.body, req);
return this.adapter.trackEvent(req.params.eventName, req.body || {}, req);
})
.then(response => {
return { response: response || {} };
Expand Down
7 changes: 4 additions & 3 deletions src/ParseServer.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// ParseServer - open-source compatible API Server for Parse apps

var batch = require('./batch'),
bodyParser = require('body-parser'),
express = require('express'),
middlewares = require('./middlewares'),
Parse = require('parse/node').Parse,
Expand Down Expand Up @@ -253,6 +252,7 @@ class ParseServer {
var api = express();
//api.use("/apps", express.static(__dirname + "/public"));
api.use(middlewares.allowCrossDomain(appId));
api.use(middlewares.allowDoubleForwardSlash);
// File handling needs to be before default middlewares are applied
api.use(
'/',
Expand All @@ -273,15 +273,16 @@ class ParseServer {

api.use(
'/',
bodyParser.urlencoded({ extended: false }),
express.urlencoded({ extended: false }),
pages.enableRouter
? new PagesRouter(pages).expressRouter()
: new PublicAPIRouter().expressRouter()
);

api.use(bodyParser.json({ type: '*/*', limit: maxUploadSize }));
api.use(express.json({ type: '*/*', limit: maxUploadSize }));
api.use(middlewares.allowMethodOverride);
api.use(middlewares.handleParseHeaders);
api.set('query parser', 'extended');
const routes = Array.isArray(rateLimit) ? rateLimit : [rateLimit];
for (const route of routes) {
middlewares.addRateLimit(route, options);
Expand Down
2 changes: 1 addition & 1 deletion src/PromiseRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Parse from 'parse/node';
import express from 'express';
import log from './logger';
import { inspect } from 'util';
const Layer = require('express/lib/router/layer');
const Layer = require('router/lib/layer');

function validateParameter(key, value) {
if (key == 'className') {
Expand Down
2 changes: 1 addition & 1 deletion src/Routers/AggregateRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import UsersRouter from './UsersRouter';

export class AggregateRouter extends ClassesRouter {
handleFind(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const body = Object.assign(req.body || {}, ClassesRouter.JSONFromQuery(req.query));
const options = {};
if (body.distinct) {
options.distinct = String(body.distinct);
Expand Down
2 changes: 1 addition & 1 deletion src/Routers/AudiencesRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class AudiencesRouter extends ClassesRouter {
}

handleFind(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const body = Object.assign(req.body || {}, ClassesRouter.JSONFromQuery(req.query));
const options = ClassesRouter.optionsFromBody(body, req.config.defaultLimit);

return rest
Expand Down
8 changes: 4 additions & 4 deletions src/Routers/ClassesRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class ClassesRouter extends PromiseRouter {
}

handleFind(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const body = Object.assign(req.body || {}, ClassesRouter.JSONFromQuery(req.query));
const options = ClassesRouter.optionsFromBody(body, req.config.defaultLimit);
if (req.config.maxLimit && body.limit > req.config.maxLimit) {
// Silently replace the limit on the query with the max configured
Expand Down Expand Up @@ -48,7 +48,7 @@ export class ClassesRouter extends PromiseRouter {

// Returns a promise for a {response} object.
handleGet(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const body = Object.assign(req.body || {}, ClassesRouter.JSONFromQuery(req.query));
const options = {};

for (const key of Object.keys(body)) {
Expand Down Expand Up @@ -117,7 +117,7 @@ export class ClassesRouter extends PromiseRouter {
req.config,
req.auth,
this.className(req),
req.body,
req.body || {},
req.info.clientSDK,
req.info.context
);
Expand All @@ -130,7 +130,7 @@ export class ClassesRouter extends PromiseRouter {
req.auth,
this.className(req),
where,
req.body,
req.body || {},
req.info.clientSDK,
req.info.context
);
Expand Down
4 changes: 2 additions & 2 deletions src/Routers/CloudCodeRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export class CloudCodeRouter extends PromiseRouter {
}

static createJob(req) {
const { job_schedule } = req.body;
const { job_schedule } = req.body || {};
validateJobSchedule(req.config, job_schedule);
return rest.create(
req.config,
Expand All @@ -91,7 +91,7 @@ export class CloudCodeRouter extends PromiseRouter {

static editJob(req) {
const { objectId } = req.params;
const { job_schedule } = req.body;
const { job_schedule } = req.body || {};
validateJobSchedule(req.config, job_schedule);
return rest
.update(
Expand Down
3 changes: 1 addition & 2 deletions src/Routers/FilesRouter.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import express from 'express';
import BodyParser from 'body-parser';
import * as Middlewares from '../middlewares';
import Parse from 'parse/node';
import Config from '../Config';
Expand Down Expand Up @@ -45,7 +44,7 @@ export class FilesRouter {

router.post(
'/files/:filename',
BodyParser.raw({
express.raw({
type: () => {
return true;
},
Expand Down
2 changes: 1 addition & 1 deletion src/Routers/FunctionsRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export class FunctionsRouter extends PromiseRouter {
}

static handleCloudJob(req) {
const jobName = req.params.jobName || req.body.jobName;
const jobName = req.params.jobName || req.body?.jobName;
const applicationId = req.config.applicationId;
const jobHandler = jobStatusHandler(req.config);
const jobFunction = triggers.getJob(jobName, applicationId);
Expand Down
4 changes: 2 additions & 2 deletions src/Routers/GlobalConfigRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ export class GlobalConfigRouter extends PromiseRouter {
"read-only masterKey isn't allowed to update the config."
);
}
const params = req.body.params;
const masterKeyOnly = req.body.masterKeyOnly || {};
const params = req.body.params || {};
const masterKeyOnly = req.body?.masterKeyOnly || {};
// Transform in dot notation to make sure it works
const update = Object.keys(params).reduce((acc, key) => {
acc[`params.${key}`] = params[key];
Expand Down
2 changes: 1 addition & 1 deletion src/Routers/GraphQLRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"read-only masterKey isn't allowed to update the GraphQL config."
);
}
const data = await req.config.parseGraphQLController.updateGraphQLConfig(req.body.params);
const data = await req.config.parseGraphQLController.updateGraphQLConfig(req.body?.params || {});

Check warning on line 22 in src/Routers/GraphQLRouter.js

View check run for this annotation

Codecov / codecov/patch

src/Routers/GraphQLRouter.js#L22

Added line #L22 was not covered by tests
return {
response: data,
};
Expand Down
8 changes: 4 additions & 4 deletions src/Routers/HooksRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export class HooksRouter extends PromiseRouter {
}

handlePost(req) {
return this.createHook(req.body, req.config);
return this.createHook(req.body || {}, req.config);
}

handleGetFunctions(req) {
Expand Down Expand Up @@ -66,11 +66,11 @@ export class HooksRouter extends PromiseRouter {

handleUpdate(req) {
var hook;
if (req.params.functionName && req.body.url) {
if (req.params.functionName && req.body?.url) {
hook = {};
hook.functionName = req.params.functionName;
hook.url = req.body.url;
} else if (req.params.className && req.params.triggerName && req.body.url) {
} else if (req.params.className && req.params.triggerName && req.body?.url) {
hook = {};
hook.className = req.params.className;
hook.triggerName = req.params.triggerName;
Expand All @@ -82,7 +82,7 @@ export class HooksRouter extends PromiseRouter {
}

handlePut(req) {
var body = req.body;
var body = req.body || {};
if (body.__op == 'Delete') {
return this.handleDelete(req);
} else {
Expand Down
6 changes: 3 additions & 3 deletions src/Routers/IAPValidationRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ function getFileForProductIdentifier(productIdentifier, req) {

export class IAPValidationRouter extends PromiseRouter {
handleRequest(req) {
let receipt = req.body.receipt;
const productIdentifier = req.body.productIdentifier;
let receipt = req.body?.receipt;
const productIdentifier = req.body?.productIdentifier;

if (!receipt || !productIdentifier) {
// TODO: Error, malformed request
Expand All @@ -84,7 +84,7 @@ export class IAPValidationRouter extends PromiseRouter {
}
}

if (process.env.TESTING == '1' && req.body.bypassAppStoreValidation) {
if (process.env.TESTING == '1' && req.body?.bypassAppStoreValidation) {
return getFileForProductIdentifier(productIdentifier, req);
}

Expand Down
2 changes: 1 addition & 1 deletion src/Routers/InstallationsRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export class InstallationsRouter extends ClassesRouter {
}

handleFind(req) {
const body = Object.assign(req.body, ClassesRouter.JSONFromQuery(req.query));
const body = Object.assign(req.body || {}, ClassesRouter.JSONFromQuery(req.query));
const options = ClassesRouter.optionsFromBody(body, req.config.defaultLimit);
return rest
.find(
Expand Down
8 changes: 4 additions & 4 deletions src/Routers/PagesRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export class PagesRouter extends PromiseRouter {

resendVerificationEmail(req) {
const config = req.config;
const username = req.body.username;
const username = req.body?.username;

if (!config) {
this.invalidRequest();
Expand Down Expand Up @@ -187,7 +187,7 @@ export class PagesRouter extends PromiseRouter {
this.invalidRequest();
}

const { username, new_password, token: rawToken } = req.body;
const { username, new_password, token: rawToken } = req.body || {};
const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;

if ((!username || !token || !new_password) && req.xhr === false) {
Expand Down Expand Up @@ -331,7 +331,7 @@ export class PagesRouter extends PromiseRouter {
*/
staticRoute(req) {
// Get requested path
const relativePath = req.params[0];
const relativePath = req.params['resource'][0];

// Resolve requested path to absolute path
const absolutePath = path.resolve(this.pagesPath, relativePath);
Expand Down Expand Up @@ -727,7 +727,7 @@ export class PagesRouter extends PromiseRouter {
mountStaticRoute() {
this.route(
'GET',
`/${this.pagesEndpoint}/(*)?`,
`/${this.pagesEndpoint}/*resource`,
req => {
this.setConfig(req, true);
},
Expand Down
4 changes: 2 additions & 2 deletions src/Routers/PublicAPIRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export class PublicAPIRouter extends PromiseRouter {
}

resendVerificationEmail(req) {
const username = req.body.username;
const username = req.body?.username;
const appId = req.params.appId;
const config = Config.get(appId);

Expand Down Expand Up @@ -162,7 +162,7 @@ export class PublicAPIRouter extends PromiseRouter {
return this.missingPublicServerURL();
}

const { username, new_password, token: rawToken } = req.body;
const { username, new_password, token: rawToken } = req.body || {};
const token = rawToken && typeof rawToken !== 'string' ? rawToken.toString() : rawToken;

if ((!username || !token || !new_password) && req.xhr === false) {
Expand Down
2 changes: 1 addition & 1 deletion src/Routers/PushRouter.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export class PushRouter extends PromiseRouter {
});
let pushStatusId;
pushController
.sendPush(req.body, where, req.config, req.auth, objectId => {
.sendPush(req.body || {}, where, req.config, req.auth, objectId => {
pushStatusId = objectId;
resolve({
headers: {
Expand Down
Loading
Loading