mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
51ff72c15e
Summary: Building: - Builds no longer wait for tsc for either client, server, or test targets. All use esbuild which is very fast. - Build still runs tsc, but only to report errors. This may be turned off with `SKIP_TSC=1` env var. - Grist-core continues to build using tsc. - Esbuild requires ES6 module semantics. Typescript's esModuleInterop is turned on, so that tsc accepts and enforces correct usage. - Client-side code is watched and bundled by webpack as before (using esbuild-loader) Code changes: - Imports must now follow ES6 semantics: `import * as X from ...` produces a module object; to import functions or class instances, use `import X from ...`. - Everything is now built with isolatedModules flag. Some exports were updated for it. Packages: - Upgraded browserify dependency, and related packages (used for the distribution-building step). - Building the distribution now uses esbuild's minification. babel-minify is no longer used. Test Plan: Should have no behavior changes, existing tests should pass, and docker image should build too. Reviewers: georgegevoian Reviewed By: georgegevoian Subscribers: alexmojaki Differential Revision: https://phab.getgrist.com/D3506
74 lines
2.5 KiB
TypeScript
74 lines
2.5 KiB
TypeScript
import {RequestWithLogin} from 'app/server/lib/Authorizer';
|
|
import log from 'app/server/lib/log';
|
|
import * as express from 'express';
|
|
|
|
/**
|
|
* Wrapper for async express endpoints to catch errors and forward them to the error handler.
|
|
*/
|
|
export function expressWrap(callback: express.RequestHandler): express.RequestHandler {
|
|
return async (req, res, next) => {
|
|
try {
|
|
await callback(req, res, next);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
};
|
|
}
|
|
|
|
interface JsonErrorHandlerOptions {
|
|
shouldLogBody?: boolean;
|
|
shouldLogParams?: boolean;
|
|
}
|
|
|
|
/**
|
|
* Returns a custom error-handling middleware that responds to errors in json.
|
|
*
|
|
* Currently allows for toggling of logging request bodies and params.
|
|
*/
|
|
const buildJsonErrorHandler = (options: JsonErrorHandlerOptions = {}): express.ErrorRequestHandler => {
|
|
const {shouldLogBody, shouldLogParams} = options;
|
|
return (err, req, res, _next) => {
|
|
const mreq = req as RequestWithLogin;
|
|
const meta = {
|
|
path: mreq.path,
|
|
userId: mreq.userId,
|
|
altSessionId: mreq.altSessionId,
|
|
body: shouldLogBody !== false ? req.body : undefined,
|
|
params: shouldLogParams !== false ? req.params : undefined,
|
|
};
|
|
log.rawWarn(`Error during api call to ${meta.path}: ${err.message}`, meta);
|
|
let details = err.details && {...err.details};
|
|
const status = details?.status || err.status || 500;
|
|
if (details) {
|
|
// Remove some details exposed for websocket API only.
|
|
delete details.accessMode;
|
|
delete details.status; // TODO: reconcile err.status and details.status, no need for both.
|
|
if (Object.keys(details).length === 0) { details = undefined; }
|
|
}
|
|
res.status(status).json({error: err.message || 'internal error', details});
|
|
};
|
|
};
|
|
|
|
/**
|
|
* Error-handling middleware that responds to errors in json. The status code is taken from
|
|
* error.status property (for which ApiError is convenient), and defaults to 500.
|
|
*/
|
|
export const jsonErrorHandler: express.ErrorRequestHandler = buildJsonErrorHandler();
|
|
|
|
/**
|
|
* Variant of `jsonErrorHandler` that skips logging request bodies and params.
|
|
*
|
|
* Should be used for sensitive routes, such as those under '/api/auth/'.
|
|
*/
|
|
export const secureJsonErrorHandler: express.ErrorRequestHandler = buildJsonErrorHandler({
|
|
shouldLogBody: false,
|
|
shouldLogParams: false,
|
|
});
|
|
|
|
/**
|
|
* Middleware that responds with a 404 status and a json error object.
|
|
*/
|
|
export const jsonNotFoundHandler: express.RequestHandler = (req, res, next) => {
|
|
res.status(404).json({error: `not found: ${req.url}`});
|
|
};
|