next
Version:
The React Framework
134 lines (133 loc) • 4.73 kB
JavaScript
/**
* Web vitals provided to _app.reportWebVitals by Core Web Vitals plugin developed by Google Chrome team.
* https://nextjs.org/blog/next-9-4#integrated-web-vitals-reporting
*/ export const WEB_VITALS = [
'CLS',
'FCP',
'FID',
'INP',
'LCP',
'TTFB'
];
/**
* Utils
*/ export function execOnce(fn) {
let used = false;
let result;
return function() {
for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){
args[_key] = arguments[_key];
}
if (!used) {
used = true;
result = fn(...args);
}
return result;
};
}
// Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
// Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
const ABSOLUTE_URL_REGEX = /^[a-zA-Z][a-zA-Z\d+\-.]*?:/;
export const isAbsoluteUrl = (url)=>ABSOLUTE_URL_REGEX.test(url);
export function getLocationOrigin() {
const { protocol, hostname, port } = window.location;
return protocol + "//" + hostname + (port ? ':' + port : '');
}
export function getURL() {
const { href } = window.location;
const origin = getLocationOrigin();
return href.substring(origin.length);
}
export function getDisplayName(Component) {
return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown';
}
export function isResSent(res) {
return res.finished || res.headersSent;
}
export function normalizeRepeatedSlashes(url) {
const urlParts = url.split('?');
const urlNoQuery = urlParts[0];
return urlNoQuery// first we replace any non-encoded backslashes with forward
// then normalize repeated forward slashes
.replace(/\\/g, '/').replace(/\/\/+/g, '/') + (urlParts[1] ? "?" + urlParts.slice(1).join('?') : '');
}
export async function loadGetInitialProps(App, ctx) {
if (process.env.NODE_ENV !== 'production') {
var _App_prototype;
if ((_App_prototype = App.prototype) == null ? void 0 : _App_prototype.getInitialProps) {
const message = '"' + getDisplayName(App) + '.getInitialProps()" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.';
throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", {
value: "E394",
enumerable: false,
configurable: true
});
}
}
// when called from _app `ctx` is nested in `ctx`
const res = ctx.res || ctx.ctx && ctx.ctx.res;
if (!App.getInitialProps) {
if (ctx.ctx && ctx.Component) {
// @ts-ignore pageProps default
return {
pageProps: await loadGetInitialProps(ctx.Component, ctx.ctx)
};
}
return {};
}
const props = await App.getInitialProps(ctx);
if (res && isResSent(res)) {
return props;
}
if (!props) {
const message = '"' + getDisplayName(App) + '.getInitialProps()" should resolve to an object. But found "' + props + '" instead.';
throw Object.defineProperty(new Error(message), "__NEXT_ERROR_CODE", {
value: "E394",
enumerable: false,
configurable: true
});
}
if (process.env.NODE_ENV !== 'production') {
if (Object.keys(props).length === 0 && !ctx.ctx) {
console.warn("" + getDisplayName(App) + " returned an empty object from `getInitialProps`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps");
}
}
return props;
}
export const SP = typeof performance !== 'undefined';
export const ST = SP && [
'mark',
'measure',
'getEntriesByName'
].every((method)=>typeof performance[method] === 'function');
export class DecodeError extends Error {
}
export class NormalizeError extends Error {
}
export class PageNotFoundError extends Error {
constructor(page){
super();
this.code = 'ENOENT';
this.name = 'PageNotFoundError';
this.message = "Cannot find module for page: " + page;
}
}
export class MissingStaticPage extends Error {
constructor(page, message){
super();
this.message = "Failed to load static file for page: " + page + " " + message;
}
}
export class MiddlewareNotFoundError extends Error {
constructor(){
super();
this.code = 'ENOENT';
this.message = "Cannot find the middleware module";
}
}
export function stringifyError(error) {
return JSON.stringify({
message: error.message,
stack: error.stack
});
}
//# sourceMappingURL=utils.js.map