main repo

This commit is contained in:
Basilosaurusrex
2025-11-24 18:09:40 +01:00
parent b636ee5e70
commit f027651f9b
34146 changed files with 4436636 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
import { AppPageRouteMatcher } from '../route-matchers/app-page-route-matcher';
import { Manifest, ManifestLoader } from './helpers/manifest-loaders/manifest-loader';
import { ManifestRouteMatcherProvider } from './manifest-route-matcher-provider';
export declare class AppPageRouteMatcherProvider extends ManifestRouteMatcherProvider<AppPageRouteMatcher> {
private readonly normalizers;
constructor(distDir: string, manifestLoader: ManifestLoader);
protected transform(manifest: Manifest): Promise<ReadonlyArray<AppPageRouteMatcher>>;
}

View File

@@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "AppPageRouteMatcherProvider", {
enumerable: true,
get: function() {
return AppPageRouteMatcherProvider;
}
});
const _isapppageroute = require("../../../lib/is-app-page-route");
const _constants = require("../../../shared/lib/constants");
const _app = require("../normalizers/built/app");
const _routekind = require("../route-kind");
const _apppageroutematcher = require("../route-matchers/app-page-route-matcher");
const _manifestroutematcherprovider = require("./manifest-route-matcher-provider");
class AppPageRouteMatcherProvider extends _manifestroutematcherprovider.ManifestRouteMatcherProvider {
constructor(distDir, manifestLoader){
super(_constants.APP_PATHS_MANIFEST, manifestLoader);
this.normalizers = new _app.AppNormalizers(distDir);
}
async transform(manifest) {
// This matcher only matches app pages.
const pages = Object.keys(manifest).filter((page)=>(0, _isapppageroute.isAppPageRoute)(page));
// Collect all the app paths for each page. This could include any parallel
// routes.
const allAppPaths = {};
for (const page of pages){
const pathname = this.normalizers.pathname.normalize(page);
if (pathname in allAppPaths) allAppPaths[pathname].push(page);
else allAppPaths[pathname] = [
page
];
}
// Format the routes.
const matchers = [];
for (const [pathname, appPaths] of Object.entries(allAppPaths)){
// TODO-APP: (wyattjoh) this is a hack right now, should be more deterministic
const page = appPaths[0];
const filename = this.normalizers.filename.normalize(manifest[page]);
const bundlePath = this.normalizers.bundlePath.normalize(page);
matchers.push(new _apppageroutematcher.AppPageRouteMatcher({
kind: _routekind.RouteKind.APP_PAGE,
pathname,
page,
bundlePath,
filename,
appPaths
}));
}
return matchers;
}
}
//# sourceMappingURL=app-page-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/future/route-matcher-providers/app-page-route-matcher-provider.ts"],"names":["AppPageRouteMatcherProvider","ManifestRouteMatcherProvider","constructor","distDir","manifestLoader","APP_PATHS_MANIFEST","normalizers","AppNormalizers","transform","manifest","pages","Object","keys","filter","page","isAppPageRoute","allAppPaths","pathname","normalize","push","matchers","appPaths","entries","filename","bundlePath","AppPageRouteMatcher","kind","RouteKind","APP_PAGE"],"mappings":";;;;+BAYaA;;;eAAAA;;;gCAZkB;2BAEI;qBACJ;2BACL;qCACU;8CAKS;AAEtC,MAAMA,oCAAoCC,0DAA4B;IAG3EC,YAAYC,OAAe,EAAEC,cAA8B,CAAE;QAC3D,KAAK,CAACC,6BAAkB,EAAED;QAE1B,IAAI,CAACE,WAAW,GAAG,IAAIC,mBAAc,CAACJ;IACxC;IAEA,MAAgBK,UACdC,QAAkB,EAC2B;QAC7C,uCAAuC;QACvC,MAAMC,QAAQC,OAAOC,IAAI,CAACH,UAAUI,MAAM,CAAC,CAACC,OAASC,IAAAA,8BAAc,EAACD;QAEpE,2EAA2E;QAC3E,UAAU;QACV,MAAME,cAAwC,CAAC;QAC/C,KAAK,MAAMF,QAAQJ,MAAO;YACxB,MAAMO,WAAW,IAAI,CAACX,WAAW,CAACW,QAAQ,CAACC,SAAS,CAACJ;YACrD,IAAIG,YAAYD,aAAaA,WAAW,CAACC,SAAS,CAACE,IAAI,CAACL;iBACnDE,WAAW,CAACC,SAAS,GAAG;gBAACH;aAAK;QACrC;QAEA,qBAAqB;QACrB,MAAMM,WAAuC,EAAE;QAC/C,KAAK,MAAM,CAACH,UAAUI,SAAS,IAAIV,OAAOW,OAAO,CAACN,aAAc;YAC9D,8EAA8E;YAC9E,MAAMF,OAAOO,QAAQ,CAAC,EAAE;YAExB,MAAME,WAAW,IAAI,CAACjB,WAAW,CAACiB,QAAQ,CAACL,SAAS,CAACT,QAAQ,CAACK,KAAK;YACnE,MAAMU,aAAa,IAAI,CAAClB,WAAW,CAACkB,UAAU,CAACN,SAAS,CAACJ;YAEzDM,SAASD,IAAI,CACX,IAAIM,wCAAmB,CAAC;gBACtBC,MAAMC,oBAAS,CAACC,QAAQ;gBACxBX;gBACAH;gBACAU;gBACAD;gBACAF;YACF;QAEJ;QAEA,OAAOD;IACT;AACF"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,8 @@
import { AppRouteRouteMatcher } from '../route-matchers/app-route-route-matcher';
import { Manifest, ManifestLoader } from './helpers/manifest-loaders/manifest-loader';
import { ManifestRouteMatcherProvider } from './manifest-route-matcher-provider';
export declare class AppRouteRouteMatcherProvider extends ManifestRouteMatcherProvider<AppRouteRouteMatcher> {
private readonly normalizers;
constructor(distDir: string, manifestLoader: ManifestLoader);
protected transform(manifest: Manifest): Promise<ReadonlyArray<AppRouteRouteMatcher>>;
}

View File

@@ -0,0 +1,43 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "AppRouteRouteMatcherProvider", {
enumerable: true,
get: function() {
return AppRouteRouteMatcherProvider;
}
});
const _isapprouteroute = require("../../../lib/is-app-route-route");
const _constants = require("../../../shared/lib/constants");
const _routekind = require("../route-kind");
const _approuteroutematcher = require("../route-matchers/app-route-route-matcher");
const _manifestroutematcherprovider = require("./manifest-route-matcher-provider");
const _app = require("../normalizers/built/app");
class AppRouteRouteMatcherProvider extends _manifestroutematcherprovider.ManifestRouteMatcherProvider {
constructor(distDir, manifestLoader){
super(_constants.APP_PATHS_MANIFEST, manifestLoader);
this.normalizers = new _app.AppNormalizers(distDir);
}
async transform(manifest) {
// This matcher only matches app routes.
const pages = Object.keys(manifest).filter((page)=>(0, _isapprouteroute.isAppRouteRoute)(page));
// Format the routes.
const matchers = [];
for (const page of pages){
const filename = this.normalizers.filename.normalize(manifest[page]);
const pathname = this.normalizers.pathname.normalize(page);
const bundlePath = this.normalizers.bundlePath.normalize(page);
matchers.push(new _approuteroutematcher.AppRouteRouteMatcher({
kind: _routekind.RouteKind.APP_ROUTE,
pathname,
page,
bundlePath,
filename
}));
}
return matchers;
}
}
//# sourceMappingURL=app-route-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/future/route-matcher-providers/app-route-route-matcher-provider.ts"],"names":["AppRouteRouteMatcherProvider","ManifestRouteMatcherProvider","constructor","distDir","manifestLoader","APP_PATHS_MANIFEST","normalizers","AppNormalizers","transform","manifest","pages","Object","keys","filter","page","isAppRouteRoute","matchers","filename","normalize","pathname","bundlePath","push","AppRouteRouteMatcher","kind","RouteKind","APP_ROUTE"],"mappings":";;;;+BAWaA;;;eAAAA;;;iCAXmB;2BACG;2BACT;sCACW;8CAKQ;qBACd;AAExB,MAAMA,qCAAqCC,0DAA4B;IAG5EC,YAAYC,OAAe,EAAEC,cAA8B,CAAE;QAC3D,KAAK,CAACC,6BAAkB,EAAED;QAE1B,IAAI,CAACE,WAAW,GAAG,IAAIC,mBAAc,CAACJ;IACxC;IAEA,MAAgBK,UACdC,QAAkB,EAC4B;QAC9C,wCAAwC;QACxC,MAAMC,QAAQC,OAAOC,IAAI,CAACH,UAAUI,MAAM,CAAC,CAACC,OAASC,IAAAA,gCAAe,EAACD;QAErE,qBAAqB;QACrB,MAAME,WAAwC,EAAE;QAChD,KAAK,MAAMF,QAAQJ,MAAO;YACxB,MAAMO,WAAW,IAAI,CAACX,WAAW,CAACW,QAAQ,CAACC,SAAS,CAACT,QAAQ,CAACK,KAAK;YACnE,MAAMK,WAAW,IAAI,CAACb,WAAW,CAACa,QAAQ,CAACD,SAAS,CAACJ;YACrD,MAAMM,aAAa,IAAI,CAACd,WAAW,CAACc,UAAU,CAACF,SAAS,CAACJ;YAEzDE,SAASK,IAAI,CACX,IAAIC,0CAAoB,CAAC;gBACvBC,MAAMC,oBAAS,CAACC,SAAS;gBACzBN;gBACAL;gBACAM;gBACAH;YACF;QAEJ;QAEA,OAAOD;IACT;AACF"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,9 @@
import { FileReader } from './helpers/file-reader/file-reader';
import { AppPageRouteMatcher } from '../../route-matchers/app-page-route-matcher';
import { FileCacheRouteMatcherProvider } from './file-cache-route-matcher-provider';
export declare class DevAppPageRouteMatcherProvider extends FileCacheRouteMatcherProvider<AppPageRouteMatcher> {
private readonly expression;
private readonly normalizers;
constructor(appDir: string, extensions: ReadonlyArray<string>, reader: FileReader);
protected transform(files: ReadonlyArray<string>): Promise<ReadonlyArray<AppPageRouteMatcher>>;
}

View File

@@ -0,0 +1,71 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DevAppPageRouteMatcherProvider", {
enumerable: true,
get: function() {
return DevAppPageRouteMatcherProvider;
}
});
const _apppageroutematcher = require("../../route-matchers/app-page-route-matcher");
const _routekind = require("../../route-kind");
const _filecacheroutematcherprovider = require("./file-cache-route-matcher-provider");
const _app = require("../../normalizers/built/app");
class DevAppPageRouteMatcherProvider extends _filecacheroutematcherprovider.FileCacheRouteMatcherProvider {
constructor(appDir, extensions, reader){
super(appDir, reader);
this.normalizers = new _app.DevAppNormalizers(appDir, extensions);
// Match any page file that ends with `/page.${extension}` under the app
// directory.
this.expression = new RegExp(`[/\\\\]page\\.(?:${extensions.join("|")})$`);
}
async transform(files) {
// Collect all the app paths for each page. This could include any parallel
// routes.
const cache = new Map();
const routeFilenames = new Array();
const appPaths = {};
for (const filename of files){
// If the file isn't a match for this matcher, then skip it.
if (!this.expression.test(filename)) continue;
const page = this.normalizers.page.normalize(filename);
// Validate that this is not an ignored page.
if (page.includes("/_")) continue;
// This is a valid file that we want to create a matcher for.
routeFilenames.push(filename);
const pathname = this.normalizers.pathname.normalize(filename);
const bundlePath = this.normalizers.bundlePath.normalize(filename);
// Save the normalization results.
cache.set(filename, {
page,
pathname,
bundlePath
});
if (pathname in appPaths) appPaths[pathname].push(page);
else appPaths[pathname] = [
page
];
}
const matchers = [];
for (const filename of routeFilenames){
// Grab the cached values (and the appPaths).
const cached = cache.get(filename);
if (!cached) {
throw new Error("Invariant: expected filename to exist in cache");
}
const { pathname, page, bundlePath } = cached;
matchers.push(new _apppageroutematcher.AppPageRouteMatcher({
kind: _routekind.RouteKind.APP_PAGE,
pathname,
page,
bundlePath,
filename,
appPaths: appPaths[pathname]
}));
}
return matchers;
}
}
//# sourceMappingURL=dev-app-page-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/dev/dev-app-page-route-matcher-provider.ts"],"names":["DevAppPageRouteMatcherProvider","FileCacheRouteMatcherProvider","constructor","appDir","extensions","reader","normalizers","DevAppNormalizers","expression","RegExp","join","transform","files","cache","Map","routeFilenames","Array","appPaths","filename","test","page","normalize","includes","push","pathname","bundlePath","set","matchers","cached","get","Error","AppPageRouteMatcher","kind","RouteKind","APP_PAGE"],"mappings":";;;;+BAOaA;;;eAAAA;;;qCANuB;2BACV;+CACoB;qBAEZ;AAE3B,MAAMA,uCAAuCC,4DAA6B;IAI/EC,YACEC,MAAc,EACdC,UAAiC,EACjCC,MAAkB,CAClB;QACA,KAAK,CAACF,QAAQE;QAEd,IAAI,CAACC,WAAW,GAAG,IAAIC,sBAAiB,CAACJ,QAAQC;QAEjD,wEAAwE;QACxE,aAAa;QACb,IAAI,CAACI,UAAU,GAAG,IAAIC,OAAO,CAAC,iBAAiB,EAAEL,WAAWM,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3E;IAEA,MAAgBC,UACdC,KAA4B,EACiB;QAC7C,2EAA2E;QAC3E,UAAU;QACV,MAAMC,QAAQ,IAAIC;QAIlB,MAAMC,iBAAiB,IAAIC;QAC3B,MAAMC,WAAqC,CAAC;QAC5C,KAAK,MAAMC,YAAYN,MAAO;YAC5B,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAACJ,UAAU,CAACW,IAAI,CAACD,WAAW;YAErC,MAAME,OAAO,IAAI,CAACd,WAAW,CAACc,IAAI,CAACC,SAAS,CAACH;YAE7C,6CAA6C;YAC7C,IAAIE,KAAKE,QAAQ,CAAC,OAAO;YAEzB,6DAA6D;YAC7DP,eAAeQ,IAAI,CAACL;YAEpB,MAAMM,WAAW,IAAI,CAAClB,WAAW,CAACkB,QAAQ,CAACH,SAAS,CAACH;YACrD,MAAMO,aAAa,IAAI,CAACnB,WAAW,CAACmB,UAAU,CAACJ,SAAS,CAACH;YAEzD,kCAAkC;YAClCL,MAAMa,GAAG,CAACR,UAAU;gBAAEE;gBAAMI;gBAAUC;YAAW;YAEjD,IAAID,YAAYP,UAAUA,QAAQ,CAACO,SAAS,CAACD,IAAI,CAACH;iBAC7CH,QAAQ,CAACO,SAAS,GAAG;gBAACJ;aAAK;QAClC;QAEA,MAAMO,WAAuC,EAAE;QAC/C,KAAK,MAAMT,YAAYH,eAAgB;YACrC,6CAA6C;YAC7C,MAAMa,SAASf,MAAMgB,GAAG,CAACX;YACzB,IAAI,CAACU,QAAQ;gBACX,MAAM,IAAIE,MAAM;YAClB;YACA,MAAM,EAAEN,QAAQ,EAAEJ,IAAI,EAAEK,UAAU,EAAE,GAAGG;YAEvCD,SAASJ,IAAI,CACX,IAAIQ,wCAAmB,CAAC;gBACtBC,MAAMC,oBAAS,CAACC,QAAQ;gBACxBV;gBACAJ;gBACAK;gBACAP;gBACAD,UAAUA,QAAQ,CAACO,SAAS;YAC9B;QAEJ;QACA,OAAOG;IACT;AACF"}

View File

@@ -0,0 +1,8 @@
import { FileReader } from './helpers/file-reader/file-reader';
import { AppRouteRouteMatcher } from '../../route-matchers/app-route-route-matcher';
import { FileCacheRouteMatcherProvider } from './file-cache-route-matcher-provider';
export declare class DevAppRouteRouteMatcherProvider extends FileCacheRouteMatcherProvider<AppRouteRouteMatcher> {
private readonly normalizers;
constructor(appDir: string, extensions: ReadonlyArray<string>, reader: FileReader);
protected transform(files: ReadonlyArray<string>): Promise<ReadonlyArray<AppRouteRouteMatcher>>;
}

View File

@@ -0,0 +1,43 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DevAppRouteRouteMatcherProvider", {
enumerable: true,
get: function() {
return DevAppRouteRouteMatcherProvider;
}
});
const _approuteroutematcher = require("../../route-matchers/app-route-route-matcher");
const _routekind = require("../../route-kind");
const _filecacheroutematcherprovider = require("./file-cache-route-matcher-provider");
const _isapprouteroute = require("../../../../lib/is-app-route-route");
const _app = require("../../normalizers/built/app");
class DevAppRouteRouteMatcherProvider extends _filecacheroutematcherprovider.FileCacheRouteMatcherProvider {
constructor(appDir, extensions, reader){
super(appDir, reader);
this.normalizers = new _app.DevAppNormalizers(appDir, extensions);
}
async transform(files) {
const matchers = [];
for (const filename of files){
const page = this.normalizers.page.normalize(filename);
// If the file isn't a match for this matcher, then skip it.
if (!(0, _isapprouteroute.isAppRouteRoute)(page)) continue;
// Validate that this is not an ignored page.
if (page.includes("/_")) continue;
const pathname = this.normalizers.pathname.normalize(filename);
const bundlePath = this.normalizers.bundlePath.normalize(filename);
matchers.push(new _approuteroutematcher.AppRouteRouteMatcher({
kind: _routekind.RouteKind.APP_ROUTE,
pathname,
page,
bundlePath,
filename
}));
}
return matchers;
}
}
//# sourceMappingURL=dev-app-route-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/dev/dev-app-route-route-matcher-provider.ts"],"names":["DevAppRouteRouteMatcherProvider","FileCacheRouteMatcherProvider","constructor","appDir","extensions","reader","normalizers","DevAppNormalizers","transform","files","matchers","filename","page","normalize","isAppRouteRoute","includes","pathname","bundlePath","push","AppRouteRouteMatcher","kind","RouteKind","APP_ROUTE"],"mappings":";;;;+BAQaA;;;eAAAA;;;sCAPwB;2BAEX;+CACoB;iCACd;qBACE;AAE3B,MAAMA,wCAAwCC,4DAA6B;IAOhFC,YACEC,MAAc,EACdC,UAAiC,EACjCC,MAAkB,CAClB;QACA,KAAK,CAACF,QAAQE;QAEd,IAAI,CAACC,WAAW,GAAG,IAAIC,sBAAiB,CAACJ,QAAQC;IACnD;IAEA,MAAgBI,UACdC,KAA4B,EACkB;QAC9C,MAAMC,WAAwC,EAAE;QAChD,KAAK,MAAMC,YAAYF,MAAO;YAC5B,MAAMG,OAAO,IAAI,CAACN,WAAW,CAACM,IAAI,CAACC,SAAS,CAACF;YAE7C,4DAA4D;YAC5D,IAAI,CAACG,IAAAA,gCAAe,EAACF,OAAO;YAE5B,6CAA6C;YAC7C,IAAIA,KAAKG,QAAQ,CAAC,OAAO;YAEzB,MAAMC,WAAW,IAAI,CAACV,WAAW,CAACU,QAAQ,CAACH,SAAS,CAACF;YACrD,MAAMM,aAAa,IAAI,CAACX,WAAW,CAACW,UAAU,CAACJ,SAAS,CAACF;YAEzDD,SAASQ,IAAI,CACX,IAAIC,0CAAoB,CAAC;gBACvBC,MAAMC,oBAAS,CAACC,SAAS;gBACzBN;gBACAJ;gBACAK;gBACAN;YACF;QAEJ;QAEA,OAAOD;IACT;AACF"}

View File

@@ -0,0 +1,14 @@
import { FileReader } from './helpers/file-reader/file-reader';
import { PagesAPIRouteMatcher } from '../../route-matchers/pages-api-route-matcher';
import { LocaleRouteNormalizer } from '../../normalizers/locale-route-normalizer';
import { FileCacheRouteMatcherProvider } from './file-cache-route-matcher-provider';
export declare class DevPagesAPIRouteMatcherProvider extends FileCacheRouteMatcherProvider<PagesAPIRouteMatcher> {
private readonly pagesDir;
private readonly extensions;
private readonly localeNormalizer?;
private readonly expression;
private readonly normalizers;
constructor(pagesDir: string, extensions: ReadonlyArray<string>, reader: FileReader, localeNormalizer?: LocaleRouteNormalizer | undefined);
private test;
protected transform(files: ReadonlyArray<string>): Promise<ReadonlyArray<PagesAPIRouteMatcher>>;
}

View File

@@ -0,0 +1,80 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DevPagesAPIRouteMatcherProvider", {
enumerable: true,
get: function() {
return DevPagesAPIRouteMatcherProvider;
}
});
const _pagesapiroutematcher = require("../../route-matchers/pages-api-route-matcher");
const _routekind = require("../../route-kind");
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
const _filecacheroutematcherprovider = require("./file-cache-route-matcher-provider");
const _pages = require("../../normalizers/built/pages");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
class DevPagesAPIRouteMatcherProvider extends _filecacheroutematcherprovider.FileCacheRouteMatcherProvider {
constructor(pagesDir, extensions, reader, localeNormalizer){
super(pagesDir, reader);
this.pagesDir = pagesDir;
this.extensions = extensions;
this.localeNormalizer = localeNormalizer;
// Match any route file that ends with `/${filename}.${extension}` under the
// pages directory.
this.expression = new RegExp(`\\.(?:${extensions.join("|")})$`);
this.normalizers = new _pages.DevPagesNormalizers(pagesDir, extensions);
}
test(filename) {
// If the file does not end in the correct extension it's not a match.
if (!this.expression.test(filename)) return false;
// Pages API routes must exist in the pages directory with the `/api/`
// prefix. The pathnames being tested here though are the full filenames,
// so we need to include the pages directory.
// TODO: could path separator normalization be needed here?
if (filename.startsWith(_path.default.join(this.pagesDir, "/api/"))) return true;
for (const extension of this.extensions){
// We can also match if we have `pages/api.${extension}`, so check to
// see if it's a match.
if (filename === _path.default.join(this.pagesDir, `api.${extension}`)) {
return true;
}
}
return false;
}
async transform(files) {
const matchers = [];
for (const filename of files){
// If the file isn't a match for this matcher, then skip it.
if (!this.test(filename)) continue;
const pathname = this.normalizers.pathname.normalize(filename);
const page = this.normalizers.page.normalize(filename);
const bundlePath = this.normalizers.bundlePath.normalize(filename);
if (this.localeNormalizer) {
matchers.push(new _pagesapiroutematcher.PagesAPILocaleRouteMatcher({
kind: _routekind.RouteKind.PAGES_API,
pathname,
page,
bundlePath,
filename,
i18n: {}
}));
} else {
matchers.push(new _pagesapiroutematcher.PagesAPIRouteMatcher({
kind: _routekind.RouteKind.PAGES_API,
pathname,
page,
bundlePath,
filename
}));
}
}
return matchers;
}
}
//# sourceMappingURL=dev-pages-api-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.ts"],"names":["DevPagesAPIRouteMatcherProvider","FileCacheRouteMatcherProvider","constructor","pagesDir","extensions","reader","localeNormalizer","expression","RegExp","join","normalizers","DevPagesNormalizers","test","filename","startsWith","path","extension","transform","files","matchers","pathname","normalize","page","bundlePath","push","PagesAPILocaleRouteMatcher","kind","RouteKind","PAGES_API","i18n","PagesAPIRouteMatcher"],"mappings":";;;;+BAWaA;;;eAAAA;;;sCAPN;2BACmB;6DACT;+CAE6B;uBACV;;;;;;AAE7B,MAAMA,wCAAwCC,4DAA6B;IAIhFC,YACmBC,UACAC,YACjBC,MAAkB,EACDC,iBACjB;QACA,KAAK,CAACH,UAAUE;wBALCF;0BACAC;gCAEAE;QAIjB,4EAA4E;QAC5E,mBAAmB;QACnB,IAAI,CAACC,UAAU,GAAG,IAAIC,OAAO,CAAC,MAAM,EAAEJ,WAAWK,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAACC,WAAW,GAAG,IAAIC,0BAAmB,CAACR,UAAUC;IACvD;IAEQQ,KAAKC,QAAgB,EAAW;QACtC,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAACN,UAAU,CAACK,IAAI,CAACC,WAAW,OAAO;QAE5C,sEAAsE;QACtE,yEAAyE;QACzE,6CAA6C;QAE7C,2DAA2D;QAC3D,IAAIA,SAASC,UAAU,CAACC,aAAI,CAACN,IAAI,CAAC,IAAI,CAACN,QAAQ,EAAE,WAAW,OAAO;QAEnE,KAAK,MAAMa,aAAa,IAAI,CAACZ,UAAU,CAAE;YACvC,qEAAqE;YACrE,uBAAuB;YACvB,IAAIS,aAAaE,aAAI,CAACN,IAAI,CAAC,IAAI,CAACN,QAAQ,EAAE,CAAC,IAAI,EAAEa,UAAU,CAAC,GAAG;gBAC7D,OAAO;YACT;QACF;QAEA,OAAO;IACT;IAEA,MAAgBC,UACdC,KAA4B,EACkB;QAC9C,MAAMC,WAAwC,EAAE;QAChD,KAAK,MAAMN,YAAYK,MAAO;YAC5B,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAACN,IAAI,CAACC,WAAW;YAE1B,MAAMO,WAAW,IAAI,CAACV,WAAW,CAACU,QAAQ,CAACC,SAAS,CAACR;YACrD,MAAMS,OAAO,IAAI,CAACZ,WAAW,CAACY,IAAI,CAACD,SAAS,CAACR;YAC7C,MAAMU,aAAa,IAAI,CAACb,WAAW,CAACa,UAAU,CAACF,SAAS,CAACR;YAEzD,IAAI,IAAI,CAACP,gBAAgB,EAAE;gBACzBa,SAASK,IAAI,CACX,IAAIC,gDAA0B,CAAC;oBAC7BC,MAAMC,oBAAS,CAACC,SAAS;oBACzBR;oBACAE;oBACAC;oBACAV;oBACAgB,MAAM,CAAC;gBACT;YAEJ,OAAO;gBACLV,SAASK,IAAI,CACX,IAAIM,0CAAoB,CAAC;oBACvBJ,MAAMC,oBAAS,CAACC,SAAS;oBACzBR;oBACAE;oBACAC;oBACAV;gBACF;YAEJ;QACF;QAEA,OAAOM;IACT;AACF"}

View File

@@ -0,0 +1,14 @@
import { FileReader } from './helpers/file-reader/file-reader';
import { PagesRouteMatcher } from '../../route-matchers/pages-route-matcher';
import { LocaleRouteNormalizer } from '../../normalizers/locale-route-normalizer';
import { FileCacheRouteMatcherProvider } from './file-cache-route-matcher-provider';
export declare class DevPagesRouteMatcherProvider extends FileCacheRouteMatcherProvider<PagesRouteMatcher> {
private readonly pagesDir;
private readonly extensions;
private readonly localeNormalizer?;
private readonly expression;
private readonly normalizers;
constructor(pagesDir: string, extensions: ReadonlyArray<string>, reader: FileReader, localeNormalizer?: LocaleRouteNormalizer | undefined);
private test;
protected transform(files: ReadonlyArray<string>): Promise<ReadonlyArray<PagesRouteMatcher>>;
}

View File

@@ -0,0 +1,80 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DevPagesRouteMatcherProvider", {
enumerable: true,
get: function() {
return DevPagesRouteMatcherProvider;
}
});
const _pagesroutematcher = require("../../route-matchers/pages-route-matcher");
const _routekind = require("../../route-kind");
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
const _filecacheroutematcherprovider = require("./file-cache-route-matcher-provider");
const _pages = require("../../normalizers/built/pages");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
class DevPagesRouteMatcherProvider extends _filecacheroutematcherprovider.FileCacheRouteMatcherProvider {
constructor(pagesDir, extensions, reader, localeNormalizer){
super(pagesDir, reader);
this.pagesDir = pagesDir;
this.extensions = extensions;
this.localeNormalizer = localeNormalizer;
// Match any route file that ends with `/${filename}.${extension}` under the
// pages directory.
this.expression = new RegExp(`\\.(?:${extensions.join("|")})$`);
this.normalizers = new _pages.DevPagesNormalizers(pagesDir, extensions);
}
test(filename) {
// If the file does not end in the correct extension it's not a match.
if (!this.expression.test(filename)) return false;
// Pages routes must exist in the pages directory without the `/api/`
// prefix. The pathnames being tested here though are the full filenames,
// so we need to include the pages directory.
// TODO: could path separator normalization be needed here?
if (filename.startsWith(_path.default.join(this.pagesDir, "/api/"))) return false;
for (const extension of this.extensions){
// We can also match if we have `pages/api.${extension}`, so check to
// see if it's a match.
if (filename === _path.default.join(this.pagesDir, `api.${extension}`)) {
return false;
}
}
return true;
}
async transform(files) {
const matchers = [];
for (const filename of files){
// If the file isn't a match for this matcher, then skip it.
if (!this.test(filename)) continue;
const pathname = this.normalizers.pathname.normalize(filename);
const page = this.normalizers.page.normalize(filename);
const bundlePath = this.normalizers.bundlePath.normalize(filename);
if (this.localeNormalizer) {
matchers.push(new _pagesroutematcher.PagesLocaleRouteMatcher({
kind: _routekind.RouteKind.PAGES,
pathname,
page,
bundlePath,
filename,
i18n: {}
}));
} else {
matchers.push(new _pagesroutematcher.PagesRouteMatcher({
kind: _routekind.RouteKind.PAGES,
pathname,
page,
bundlePath,
filename
}));
}
}
return matchers;
}
}
//# sourceMappingURL=dev-pages-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/dev/dev-pages-route-matcher-provider.ts"],"names":["DevPagesRouteMatcherProvider","FileCacheRouteMatcherProvider","constructor","pagesDir","extensions","reader","localeNormalizer","expression","RegExp","join","normalizers","DevPagesNormalizers","test","filename","startsWith","path","extension","transform","files","matchers","pathname","normalize","page","bundlePath","push","PagesLocaleRouteMatcher","kind","RouteKind","PAGES","i18n","PagesRouteMatcher"],"mappings":";;;;+BAWaA;;;eAAAA;;;mCAPN;2BACmB;6DACT;+CAE6B;uBACV;;;;;;AAE7B,MAAMA,qCAAqCC,4DAA6B;IAI7EC,YACmBC,UACAC,YACjBC,MAAkB,EACDC,iBACjB;QACA,KAAK,CAACH,UAAUE;wBALCF;0BACAC;gCAEAE;QAIjB,4EAA4E;QAC5E,mBAAmB;QACnB,IAAI,CAACC,UAAU,GAAG,IAAIC,OAAO,CAAC,MAAM,EAAEJ,WAAWK,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9D,IAAI,CAACC,WAAW,GAAG,IAAIC,0BAAmB,CAACR,UAAUC;IACvD;IAEQQ,KAAKC,QAAgB,EAAW;QACtC,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAACN,UAAU,CAACK,IAAI,CAACC,WAAW,OAAO;QAE5C,qEAAqE;QACrE,yEAAyE;QACzE,6CAA6C;QAE7C,2DAA2D;QAC3D,IAAIA,SAASC,UAAU,CAACC,aAAI,CAACN,IAAI,CAAC,IAAI,CAACN,QAAQ,EAAE,WAAW,OAAO;QAEnE,KAAK,MAAMa,aAAa,IAAI,CAACZ,UAAU,CAAE;YACvC,qEAAqE;YACrE,uBAAuB;YACvB,IAAIS,aAAaE,aAAI,CAACN,IAAI,CAAC,IAAI,CAACN,QAAQ,EAAE,CAAC,IAAI,EAAEa,UAAU,CAAC,GAAG;gBAC7D,OAAO;YACT;QACF;QAEA,OAAO;IACT;IAEA,MAAgBC,UACdC,KAA4B,EACe;QAC3C,MAAMC,WAAqC,EAAE;QAC7C,KAAK,MAAMN,YAAYK,MAAO;YAC5B,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAACN,IAAI,CAACC,WAAW;YAE1B,MAAMO,WAAW,IAAI,CAACV,WAAW,CAACU,QAAQ,CAACC,SAAS,CAACR;YACrD,MAAMS,OAAO,IAAI,CAACZ,WAAW,CAACY,IAAI,CAACD,SAAS,CAACR;YAC7C,MAAMU,aAAa,IAAI,CAACb,WAAW,CAACa,UAAU,CAACF,SAAS,CAACR;YAEzD,IAAI,IAAI,CAACP,gBAAgB,EAAE;gBACzBa,SAASK,IAAI,CACX,IAAIC,0CAAuB,CAAC;oBAC1BC,MAAMC,oBAAS,CAACC,KAAK;oBACrBR;oBACAE;oBACAC;oBACAV;oBACAgB,MAAM,CAAC;gBACT;YAEJ,OAAO;gBACLV,SAASK,IAAI,CACX,IAAIM,oCAAiB,CAAC;oBACpBJ,MAAMC,oBAAS,CAACC,KAAK;oBACrBR;oBACAE;oBACAC;oBACAV;gBACF;YAEJ;QACF;QAEA,OAAOM;IACT;AACF"}

View File

@@ -0,0 +1,9 @@
import { RouteMatcher } from '../../route-matchers/route-matcher';
import { CachedRouteMatcherProvider } from '../helpers/cached-route-matcher-provider';
import { FileReader } from './helpers/file-reader/file-reader';
/**
* This will memoize the matchers when the file contents are the same.
*/
export declare abstract class FileCacheRouteMatcherProvider<M extends RouteMatcher = RouteMatcher> extends CachedRouteMatcherProvider<M, ReadonlyArray<string>> {
constructor(dir: string, reader: FileReader);
}

View File

@@ -0,0 +1,28 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "FileCacheRouteMatcherProvider", {
enumerable: true,
get: function() {
return FileCacheRouteMatcherProvider;
}
});
const _cachedroutematcherprovider = require("../helpers/cached-route-matcher-provider");
class FileCacheRouteMatcherProvider extends _cachedroutematcherprovider.CachedRouteMatcherProvider {
constructor(dir, reader){
super({
load: async ()=>reader.read(dir),
compare: (left, right)=>{
if (left.length !== right.length) return false;
// Assuming the file traversal order is deterministic...
for(let i = 0; i < left.length; i++){
if (left[i] !== right[i]) return false;
}
return true;
}
});
}
}
//# sourceMappingURL=file-cache-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/dev/file-cache-route-matcher-provider.ts"],"names":["FileCacheRouteMatcherProvider","CachedRouteMatcherProvider","constructor","dir","reader","load","read","compare","left","right","length","i"],"mappings":";;;;+BAOsBA;;;eAAAA;;;4CANqB;AAMpC,MAAeA,sCAEZC,sDAA0B;IAClCC,YAAYC,GAAW,EAAEC,MAAkB,CAAE;QAC3C,KAAK,CAAC;YACJC,MAAM,UAAYD,OAAOE,IAAI,CAACH;YAC9BI,SAAS,CAACC,MAAMC;gBACd,IAAID,KAAKE,MAAM,KAAKD,MAAMC,MAAM,EAAE,OAAO;gBAEzC,wDAAwD;gBACxD,IAAK,IAAIC,IAAI,GAAGA,IAAIH,KAAKE,MAAM,EAAEC,IAAK;oBACpC,IAAIH,IAAI,CAACG,EAAE,KAAKF,KAAK,CAACE,EAAE,EAAE,OAAO;gBACnC;gBAEA,OAAO;YACT;QACF;IACF;AACF"}

View File

@@ -0,0 +1,15 @@
import { FileReader } from './file-reader';
/**
* CachedFileReader will deduplicate requests made to the same folder structure
* to scan for files.
*/
export declare class BatchedFileReader implements FileReader {
private readonly reader;
private batch?;
constructor(reader: FileReader);
private schedulePromise?;
private schedule;
private getOrCreateBatch;
private load;
read(dir: string): Promise<ReadonlyArray<string>>;
}

View File

@@ -0,0 +1,106 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "BatchedFileReader", {
enumerable: true,
get: function() {
return BatchedFileReader;
}
});
class BatchedFileReader {
constructor(reader){
this.reader = reader;
}
schedule(callback) {
if (!this.schedulePromise) {
this.schedulePromise = Promise.resolve();
}
this.schedulePromise.then(()=>{
process.nextTick(callback);
});
}
getOrCreateBatch() {
// If there is an existing batch and it's not completed, then reuse it.
if (this.batch && !this.batch.completed) {
return this.batch;
}
const batch = {
completed: false,
directories: [],
callbacks: []
};
this.batch = batch;
this.schedule(async ()=>{
batch.completed = true;
if (batch.directories.length === 0) return;
// Collect all the results for each of the directories. If any error
// occurs, send the results back to the loaders.
let values;
try {
values = await this.load(batch.directories);
} catch (err) {
// Reject all the callbacks.
for (const { reject } of batch.callbacks){
reject(err);
}
return;
}
// Loop over all the callbacks and send them their results.
for(let i = 0; i < batch.callbacks.length; i++){
const value = values[i];
if (value instanceof Error) {
batch.callbacks[i].reject(value);
} else {
batch.callbacks[i].resolve(value);
}
}
});
return batch;
}
async load(directories) {
// Make a unique array of directories. This is what lets us de-duplicate
// loads for the same directory.
const unique = [
...new Set(directories)
];
const results = await Promise.all(unique.map(async (directory)=>{
let files;
let error;
try {
files = await this.reader.read(directory);
} catch (err) {
if (err instanceof Error) error = err;
}
return {
directory,
files,
error
};
}));
return directories.map((directory)=>{
const found = results.find((result)=>result.directory === directory);
if (!found) return [];
if (found.files) return found.files;
if (found.error) return found.error;
return [];
});
}
async read(dir) {
// Get or create a new file reading batch.
const batch = this.getOrCreateBatch();
// Push this directory into the batch to resolve.
batch.directories.push(dir);
// Push the promise handles into the batch (under the same index) so it can
// be resolved later when it's scheduled.
const promise = new Promise((resolve, reject)=>{
batch.callbacks.push({
resolve,
reject
});
});
return promise;
}
}
//# sourceMappingURL=batched-file-reader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../../../src/server/future/route-matcher-providers/dev/helpers/file-reader/batched-file-reader.ts"],"names":["BatchedFileReader","constructor","reader","schedule","callback","schedulePromise","Promise","resolve","then","process","nextTick","getOrCreateBatch","batch","completed","directories","callbacks","length","values","load","err","reject","i","value","Error","unique","Set","results","all","map","directory","files","error","read","found","find","result","dir","push","promise"],"mappings":";;;;+BAeaA;;;eAAAA;;;AAAN,MAAMA;IAGXC,YAA6BC,OAAoB;sBAApBA;IAAqB;IAK1CC,SAASC,QAAkB,EAAE;QACnC,IAAI,CAAC,IAAI,CAACC,eAAe,EAAE;YACzB,IAAI,CAACA,eAAe,GAAGC,QAAQC,OAAO;QACxC;QACA,IAAI,CAACF,eAAe,CAACG,IAAI,CAAC;YACxBC,QAAQC,QAAQ,CAACN;QACnB;IACF;IAEQO,mBAAoC;QAC1C,uEAAuE;QACvE,IAAI,IAAI,CAACC,KAAK,IAAI,CAAC,IAAI,CAACA,KAAK,CAACC,SAAS,EAAE;YACvC,OAAO,IAAI,CAACD,KAAK;QACnB;QAEA,MAAMA,QAAyB;YAC7BC,WAAW;YACXC,aAAa,EAAE;YACfC,WAAW,EAAE;QACf;QAEA,IAAI,CAACH,KAAK,GAAGA;QAEb,IAAI,CAACT,QAAQ,CAAC;YACZS,MAAMC,SAAS,GAAG;YAClB,IAAID,MAAME,WAAW,CAACE,MAAM,KAAK,GAAG;YAEpC,oEAAoE;YACpE,gDAAgD;YAChD,IAAIC;YACJ,IAAI;gBACFA,SAAS,MAAM,IAAI,CAACC,IAAI,CAACN,MAAME,WAAW;YAC5C,EAAE,OAAOK,KAAK;gBACZ,4BAA4B;gBAC5B,KAAK,MAAM,EAAEC,MAAM,EAAE,IAAIR,MAAMG,SAAS,CAAE;oBACxCK,OAAOD;gBACT;gBACA;YACF;YAEA,2DAA2D;YAC3D,IAAK,IAAIE,IAAI,GAAGA,IAAIT,MAAMG,SAAS,CAACC,MAAM,EAAEK,IAAK;gBAC/C,MAAMC,QAAQL,MAAM,CAACI,EAAE;gBACvB,IAAIC,iBAAiBC,OAAO;oBAC1BX,MAAMG,SAAS,CAACM,EAAE,CAACD,MAAM,CAACE;gBAC5B,OAAO;oBACLV,MAAMG,SAAS,CAACM,EAAE,CAACd,OAAO,CAACe;gBAC7B;YACF;QACF;QAEA,OAAOV;IACT;IAEA,MAAcM,KACZJ,WAAkC,EACqB;QACvD,wEAAwE;QACxE,gCAAgC;QAChC,MAAMU,SAAS;eAAI,IAAIC,IAAIX;SAAa;QAExC,MAAMY,UAAU,MAAMpB,QAAQqB,GAAG,CAC/BH,OAAOI,GAAG,CAAC,OAAOC;YAChB,IAAIC;YACJ,IAAIC;YACJ,IAAI;gBACFD,QAAQ,MAAM,IAAI,CAAC5B,MAAM,CAAC8B,IAAI,CAACH;YACjC,EAAE,OAAOV,KAAK;gBACZ,IAAIA,eAAeI,OAAOQ,QAAQZ;YACpC;YAEA,OAAO;gBAAEU;gBAAWC;gBAAOC;YAAM;QACnC;QAGF,OAAOjB,YAAYc,GAAG,CAAC,CAACC;YACtB,MAAMI,QAAQP,QAAQQ,IAAI,CAAC,CAACC,SAAWA,OAAON,SAAS,KAAKA;YAC5D,IAAI,CAACI,OAAO,OAAO,EAAE;YAErB,IAAIA,MAAMH,KAAK,EAAE,OAAOG,MAAMH,KAAK;YACnC,IAAIG,MAAMF,KAAK,EAAE,OAAOE,MAAMF,KAAK;YAEnC,OAAO,EAAE;QACX;IACF;IAEA,MAAaC,KAAKI,GAAW,EAAkC;QAC7D,0CAA0C;QAC1C,MAAMxB,QAAQ,IAAI,CAACD,gBAAgB;QAEnC,iDAAiD;QACjDC,MAAME,WAAW,CAACuB,IAAI,CAACD;QAEvB,2EAA2E;QAC3E,yCAAyC;QACzC,MAAME,UAAU,IAAIhC,QAA+B,CAACC,SAASa;YAC3DR,MAAMG,SAAS,CAACsB,IAAI,CAAC;gBAAE9B;gBAASa;YAAO;QACzC;QAEA,OAAOkB;IACT;AACF"}

View File

@@ -0,0 +1,30 @@
import type { FileReader } from './file-reader';
import { RecursiveReadDirOptions } from '../../../../../../lib/recursive-readdir';
export type DefaultFileReaderOptions = Pick<RecursiveReadDirOptions, 'pathnameFilter' | 'ignoreFilter' | 'ignorePartFilter'>;
/**
* Reads all the files in the directory and its subdirectories following any
* symbolic links.
*/
export declare class DefaultFileReader implements FileReader {
/**
* Filter to ignore files with absolute pathnames. If undefined, no files are
* ignored.
*/
private readonly options;
/**
* Creates a new file reader.
*
* @param pathnameFilter filter to ignore files with absolute pathnames, false to ignore
* @param ignoreFilter filter to ignore files and directories with absolute pathnames, false to ignore
* @param ignorePartFilter filter to ignore files and directories with the pathname part, false to ignore
*/
constructor(options: Readonly<DefaultFileReaderOptions>);
/**
* Reads all the files in the directory and its subdirectories following any
* symbolic links.
*
* @param dir the directory to read
* @returns a promise that resolves to the list of files
*/
read(dir: string): Promise<ReadonlyArray<string>>;
}

View File

@@ -0,0 +1,43 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "DefaultFileReader", {
enumerable: true,
get: function() {
return DefaultFileReader;
}
});
const _recursivereaddir = require("../../../../../../lib/recursive-readdir");
class DefaultFileReader {
/**
* Creates a new file reader.
*
* @param pathnameFilter filter to ignore files with absolute pathnames, false to ignore
* @param ignoreFilter filter to ignore files and directories with absolute pathnames, false to ignore
* @param ignorePartFilter filter to ignore files and directories with the pathname part, false to ignore
*/ constructor(options){
this.options = options;
}
/**
* Reads all the files in the directory and its subdirectories following any
* symbolic links.
*
* @param dir the directory to read
* @returns a promise that resolves to the list of files
*/ async read(dir) {
return (0, _recursivereaddir.recursiveReadDir)(dir, {
pathnameFilter: this.options.pathnameFilter,
ignoreFilter: this.options.ignoreFilter,
ignorePartFilter: this.options.ignorePartFilter,
// We don't need to sort the results because we're not depending on the
// order of the results.
sortPathnames: false,
// We want absolute pathnames because we're going to be comparing them
// with other absolute pathnames.
relativePathnames: false
});
}
}
//# sourceMappingURL=default-file-reader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../../../src/server/future/route-matcher-providers/dev/helpers/file-reader/default-file-reader.ts"],"names":["DefaultFileReader","constructor","options","read","dir","recursiveReadDir","pathnameFilter","ignoreFilter","ignorePartFilter","sortPathnames","relativePathnames"],"mappings":";;;;+BAgBaA;;;eAAAA;;;kCAXN;AAWA,MAAMA;IAOX;;;;;;GAMC,GACDC,YAAYC,OAA2C,CAAE;QACvD,IAAI,CAACA,OAAO,GAAGA;IACjB;IAEA;;;;;;GAMC,GACD,MAAaC,KAAKC,GAAW,EAAkC;QAC7D,OAAOC,IAAAA,kCAAgB,EAACD,KAAK;YAC3BE,gBAAgB,IAAI,CAACJ,OAAO,CAACI,cAAc;YAC3CC,cAAc,IAAI,CAACL,OAAO,CAACK,YAAY;YACvCC,kBAAkB,IAAI,CAACN,OAAO,CAACM,gBAAgB;YAE/C,uEAAuE;YACvE,wBAAwB;YACxBC,eAAe;YAEf,sEAAsE;YACtE,iCAAiC;YACjCC,mBAAmB;QACrB;IACF;AACF"}

View File

@@ -0,0 +1,8 @@
export interface FileReader {
/**
* Reads the directory contents recursively.
*
* @param dir directory to read recursively from
*/
read(dir: string): Promise<ReadonlyArray<string>> | ReadonlyArray<string>;
}

View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=file-reader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":""}

View File

@@ -0,0 +1,18 @@
import { RouteMatcher } from '../../route-matchers/route-matcher';
import { RouteMatcherProvider } from '../route-matcher-provider';
interface LoaderComparable<D> {
load(): Promise<D>;
compare(left: D, right: D): boolean;
}
/**
* This will memoize the matchers if the loaded data is comparable.
*/
export declare abstract class CachedRouteMatcherProvider<M extends RouteMatcher = RouteMatcher, D = any> implements RouteMatcherProvider<M> {
private readonly loader;
private data?;
private cached;
constructor(loader: LoaderComparable<D>);
protected abstract transform(data: D): Promise<ReadonlyArray<M>>;
matchers(): Promise<readonly M[]>;
}
export {};

View File

@@ -0,0 +1,30 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "CachedRouteMatcherProvider", {
enumerable: true,
get: function() {
return CachedRouteMatcherProvider;
}
});
class CachedRouteMatcherProvider {
constructor(loader){
this.loader = loader;
this.cached = [];
}
async matchers() {
const data = await this.loader.load();
if (!data) return [];
// Return the cached matchers if the data has not changed.
if (this.data && this.loader.compare(this.data, data)) return this.cached;
this.data = data;
// Transform the manifest into matchers.
const matchers = await this.transform(data);
// Cache the matchers.
this.cached = matchers;
return matchers;
}
}
//# sourceMappingURL=cached-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/server/future/route-matcher-providers/helpers/cached-route-matcher-provider.ts"],"names":["CachedRouteMatcherProvider","constructor","loader","cached","matchers","data","load","compare","transform"],"mappings":";;;;+BAWsBA;;;eAAAA;;;AAAf,MAAeA;IAQpBC,YAA6BC,OAA6B;sBAA7BA;aAFrBC,SAA2B,EAAE;IAEsB;IAI3D,MAAaC,WAAkC;QAC7C,MAAMC,OAAO,MAAM,IAAI,CAACH,MAAM,CAACI,IAAI;QACnC,IAAI,CAACD,MAAM,OAAO,EAAE;QAEpB,0DAA0D;QAC1D,IAAI,IAAI,CAACA,IAAI,IAAI,IAAI,CAACH,MAAM,CAACK,OAAO,CAAC,IAAI,CAACF,IAAI,EAAEA,OAAO,OAAO,IAAI,CAACF,MAAM;QACzE,IAAI,CAACE,IAAI,GAAGA;QAEZ,wCAAwC;QACxC,MAAMD,WAAW,MAAM,IAAI,CAACI,SAAS,CAACH;QAEtC,sBAAsB;QACtB,IAAI,CAACF,MAAM,GAAGC;QAEd,OAAOA;IACT;AACF"}

View File

@@ -0,0 +1,4 @@
export type Manifest = Record<string, string>;
export interface ManifestLoader {
load(name: string): Manifest | null;
}

View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=manifest-loader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":""}

View File

@@ -0,0 +1,7 @@
import { Manifest, ManifestLoader } from './manifest-loader';
export declare class NodeManifestLoader implements ManifestLoader {
private readonly distDir;
constructor(distDir: string);
static require(id: string): any;
load(name: string): Manifest | null;
}

View File

@@ -0,0 +1,34 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "NodeManifestLoader", {
enumerable: true,
get: function() {
return NodeManifestLoader;
}
});
const _constants = require("../../../../../shared/lib/constants");
const _path = /*#__PURE__*/ _interop_require_default(require("../../../../../shared/lib/isomorphic/path"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
class NodeManifestLoader {
constructor(distDir){
this.distDir = distDir;
}
static require(id) {
try {
return require(id);
} catch {
return null;
}
}
load(name) {
return NodeManifestLoader.require(_path.default.join(this.distDir, _constants.SERVER_DIRECTORY, name));
}
}
//# sourceMappingURL=node-manifest-loader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../../src/server/future/route-matcher-providers/helpers/manifest-loaders/node-manifest-loader.ts"],"names":["NodeManifestLoader","constructor","distDir","require","id","load","name","path","join","SERVER_DIRECTORY"],"mappings":";;;;+BAIaA;;;eAAAA;;;2BAJoB;6DAChB;;;;;;AAGV,MAAMA;IACXC,YAA6BC,QAAiB;uBAAjBA;IAAkB;IAE/C,OAAOC,QAAQC,EAAU,EAAE;QACzB,IAAI;YACF,OAAOD,QAAQC;QACjB,EAAE,OAAM;YACN,OAAO;QACT;IACF;IAEOC,KAAKC,IAAY,EAAmB;QACzC,OAAON,mBAAmBG,OAAO,CAC/BI,aAAI,CAACC,IAAI,CAAC,IAAI,CAACN,OAAO,EAAEO,2BAAgB,EAAEH;IAE9C;AACF"}

View File

@@ -0,0 +1,6 @@
import { Manifest, ManifestLoader } from './manifest-loader';
export declare class ServerManifestLoader implements ManifestLoader {
private readonly getter;
constructor(getter: (name: string) => Manifest | null);
load(name: string): Manifest | null;
}

View File

@@ -0,0 +1,20 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ServerManifestLoader", {
enumerable: true,
get: function() {
return ServerManifestLoader;
}
});
class ServerManifestLoader {
constructor(getter){
this.getter = getter;
}
load(name) {
return this.getter(name);
}
}
//# sourceMappingURL=server-manifest-loader.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../../src/server/future/route-matcher-providers/helpers/manifest-loaders/server-manifest-loader.ts"],"names":["ServerManifestLoader","constructor","getter","load","name"],"mappings":";;;;+BAEaA;;;eAAAA;;;AAAN,MAAMA;IACXC,YAA6BC,OAA2C;sBAA3CA;IAA4C;IAElEC,KAAKC,IAAY,EAAmB;QACzC,OAAO,IAAI,CAACF,MAAM,CAACE;IACrB;AACF"}

View File

@@ -0,0 +1,6 @@
import { RouteMatcher } from '../route-matchers/route-matcher';
import { Manifest, ManifestLoader } from './helpers/manifest-loaders/manifest-loader';
import { CachedRouteMatcherProvider } from './helpers/cached-route-matcher-provider';
export declare abstract class ManifestRouteMatcherProvider<M extends RouteMatcher = RouteMatcher> extends CachedRouteMatcherProvider<M, Manifest | null> {
constructor(manifestName: string, manifestLoader: ManifestLoader);
}

View File

@@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ManifestRouteMatcherProvider", {
enumerable: true,
get: function() {
return ManifestRouteMatcherProvider;
}
});
const _cachedroutematcherprovider = require("./helpers/cached-route-matcher-provider");
class ManifestRouteMatcherProvider extends _cachedroutematcherprovider.CachedRouteMatcherProvider {
constructor(manifestName, manifestLoader){
super({
load: async ()=>manifestLoader.load(manifestName),
compare: (left, right)=>left === right
});
}
}
//# sourceMappingURL=manifest-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/future/route-matcher-providers/manifest-route-matcher-provider.ts"],"names":["ManifestRouteMatcherProvider","CachedRouteMatcherProvider","constructor","manifestName","manifestLoader","load","compare","left","right"],"mappings":";;;;+BAOsBA;;;eAAAA;;;4CAFqB;AAEpC,MAAeA,qCAEZC,sDAA0B;IAClCC,YAAYC,YAAoB,EAAEC,cAA8B,CAAE;QAChE,KAAK,CAAC;YACJC,MAAM,UAAYD,eAAeC,IAAI,CAACF;YACtCG,SAAS,CAACC,MAAMC,QAAUD,SAASC;QACrC;IACF;AACF"}

View File

@@ -0,0 +1,10 @@
import { PagesAPIRouteMatcher } from '../route-matchers/pages-api-route-matcher';
import { Manifest, ManifestLoader } from './helpers/manifest-loaders/manifest-loader';
import { ManifestRouteMatcherProvider } from './manifest-route-matcher-provider';
import { I18NProvider } from '../helpers/i18n-provider';
export declare class PagesAPIRouteMatcherProvider extends ManifestRouteMatcherProvider<PagesAPIRouteMatcher> {
private readonly i18nProvider?;
private readonly normalizers;
constructor(distDir: string, manifestLoader: ManifestLoader, i18nProvider?: I18NProvider | undefined);
protected transform(manifest: Manifest): Promise<ReadonlyArray<PagesAPIRouteMatcher>>;
}

View File

@@ -0,0 +1,56 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "PagesAPIRouteMatcherProvider", {
enumerable: true,
get: function() {
return PagesAPIRouteMatcherProvider;
}
});
const _isapiroute = require("../../../lib/is-api-route");
const _constants = require("../../../shared/lib/constants");
const _routekind = require("../route-kind");
const _pagesapiroutematcher = require("../route-matchers/pages-api-route-matcher");
const _manifestroutematcherprovider = require("./manifest-route-matcher-provider");
const _pages = require("../normalizers/built/pages");
class PagesAPIRouteMatcherProvider extends _manifestroutematcherprovider.ManifestRouteMatcherProvider {
constructor(distDir, manifestLoader, i18nProvider){
super(_constants.PAGES_MANIFEST, manifestLoader);
this.i18nProvider = i18nProvider;
this.normalizers = new _pages.PagesNormalizers(distDir);
}
async transform(manifest) {
// This matcher is only for Pages API routes.
const pathnames = Object.keys(manifest).filter((pathname)=>(0, _isapiroute.isAPIRoute)(pathname));
const matchers = [];
for (const page of pathnames){
if (this.i18nProvider) {
// Match the locale on the page name, or default to the default locale.
const { detectedLocale, pathname } = this.i18nProvider.analyze(page);
matchers.push(new _pagesapiroutematcher.PagesAPILocaleRouteMatcher({
kind: _routekind.RouteKind.PAGES_API,
pathname,
page,
bundlePath: this.normalizers.bundlePath.normalize(page),
filename: this.normalizers.filename.normalize(manifest[page]),
i18n: {
locale: detectedLocale
}
}));
} else {
matchers.push(new _pagesapiroutematcher.PagesAPIRouteMatcher({
kind: _routekind.RouteKind.PAGES_API,
// In `pages/`, the page is the same as the pathname.
pathname: page,
page,
bundlePath: this.normalizers.bundlePath.normalize(page),
filename: this.normalizers.filename.normalize(manifest[page])
}));
}
}
return matchers;
}
}
//# sourceMappingURL=pages-api-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/future/route-matcher-providers/pages-api-route-matcher-provider.ts"],"names":["PagesAPIRouteMatcherProvider","ManifestRouteMatcherProvider","constructor","distDir","manifestLoader","i18nProvider","PAGES_MANIFEST","normalizers","PagesNormalizers","transform","manifest","pathnames","Object","keys","filter","pathname","isAPIRoute","matchers","page","detectedLocale","analyze","push","PagesAPILocaleRouteMatcher","kind","RouteKind","PAGES_API","bundlePath","normalize","filename","i18n","locale","PagesAPIRouteMatcher"],"mappings":";;;;+BAeaA;;;eAAAA;;;4BAfc;2BACI;2BACL;sCAInB;8CAKsC;uBAEZ;AAE1B,MAAMA,qCAAqCC,0DAA4B;IAG5EC,YACEC,OAAe,EACfC,cAA8B,EACbC,aACjB;QACA,KAAK,CAACC,yBAAc,EAAEF;4BAFLC;QAIjB,IAAI,CAACE,WAAW,GAAG,IAAIC,uBAAgB,CAACL;IAC1C;IAEA,MAAgBM,UACdC,QAAkB,EAC4B;QAC9C,6CAA6C;QAC7C,MAAMC,YAAYC,OAAOC,IAAI,CAACH,UAAUI,MAAM,CAAC,CAACC,WAC9CC,IAAAA,sBAAU,EAACD;QAGb,MAAME,WAAwC,EAAE;QAEhD,KAAK,MAAMC,QAAQP,UAAW;YAC5B,IAAI,IAAI,CAACN,YAAY,EAAE;gBACrB,uEAAuE;gBACvE,MAAM,EAAEc,cAAc,EAAEJ,QAAQ,EAAE,GAAG,IAAI,CAACV,YAAY,CAACe,OAAO,CAACF;gBAE/DD,SAASI,IAAI,CACX,IAAIC,gDAA0B,CAAC;oBAC7BC,MAAMC,oBAAS,CAACC,SAAS;oBACzBV;oBACAG;oBACAQ,YAAY,IAAI,CAACnB,WAAW,CAACmB,UAAU,CAACC,SAAS,CAACT;oBAClDU,UAAU,IAAI,CAACrB,WAAW,CAACqB,QAAQ,CAACD,SAAS,CAACjB,QAAQ,CAACQ,KAAK;oBAC5DW,MAAM;wBACJC,QAAQX;oBACV;gBACF;YAEJ,OAAO;gBACLF,SAASI,IAAI,CACX,IAAIU,0CAAoB,CAAC;oBACvBR,MAAMC,oBAAS,CAACC,SAAS;oBACzB,qDAAqD;oBACrDV,UAAUG;oBACVA;oBACAQ,YAAY,IAAI,CAACnB,WAAW,CAACmB,UAAU,CAACC,SAAS,CAACT;oBAClDU,UAAU,IAAI,CAACrB,WAAW,CAACqB,QAAQ,CAACD,SAAS,CAACjB,QAAQ,CAACQ,KAAK;gBAC9D;YAEJ;QACF;QAEA,OAAOD;IACT;AACF"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,10 @@
import { PagesRouteMatcher } from '../route-matchers/pages-route-matcher';
import { Manifest, ManifestLoader } from './helpers/manifest-loaders/manifest-loader';
import { ManifestRouteMatcherProvider } from './manifest-route-matcher-provider';
import { I18NProvider } from '../helpers/i18n-provider';
export declare class PagesRouteMatcherProvider extends ManifestRouteMatcherProvider<PagesRouteMatcher> {
private readonly i18nProvider?;
private readonly normalizers;
constructor(distDir: string, manifestLoader: ManifestLoader, i18nProvider?: I18NProvider | undefined);
protected transform(manifest: Manifest): Promise<ReadonlyArray<PagesRouteMatcher>>;
}

View File

@@ -0,0 +1,65 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "PagesRouteMatcherProvider", {
enumerable: true,
get: function() {
return PagesRouteMatcherProvider;
}
});
const _isapiroute = require("../../../lib/is-api-route");
const _constants = require("../../../shared/lib/constants");
const _routekind = require("../route-kind");
const _pagesroutematcher = require("../route-matchers/pages-route-matcher");
const _manifestroutematcherprovider = require("./manifest-route-matcher-provider");
const _pages = require("../normalizers/built/pages");
class PagesRouteMatcherProvider extends _manifestroutematcherprovider.ManifestRouteMatcherProvider {
constructor(distDir, manifestLoader, i18nProvider){
super(_constants.PAGES_MANIFEST, manifestLoader);
this.i18nProvider = i18nProvider;
this.normalizers = new _pages.PagesNormalizers(distDir);
}
async transform(manifest) {
// This matcher is only for Pages routes, not Pages API routes which are
// included in this manifest.
const pathnames = Object.keys(manifest).filter((pathname)=>!(0, _isapiroute.isAPIRoute)(pathname))// Remove any blocked pages (page that can't be routed to, like error or
// internal pages).
.filter((pathname)=>{
var _this_i18nProvider;
const normalized = ((_this_i18nProvider = this.i18nProvider) == null ? void 0 : _this_i18nProvider.analyze(pathname).pathname) ?? pathname;
// Skip any blocked pages.
if (_constants.BLOCKED_PAGES.includes(normalized)) return false;
return true;
});
const matchers = [];
for (const page of pathnames){
if (this.i18nProvider) {
// Match the locale on the page name, or default to the default locale.
const { detectedLocale, pathname } = this.i18nProvider.analyze(page);
matchers.push(new _pagesroutematcher.PagesLocaleRouteMatcher({
kind: _routekind.RouteKind.PAGES,
pathname,
page,
bundlePath: this.normalizers.bundlePath.normalize(page),
filename: this.normalizers.filename.normalize(manifest[page]),
i18n: {
locale: detectedLocale
}
}));
} else {
matchers.push(new _pagesroutematcher.PagesRouteMatcher({
kind: _routekind.RouteKind.PAGES,
// In `pages/`, the page is the same as the pathname.
pathname: page,
page,
bundlePath: this.normalizers.bundlePath.normalize(page),
filename: this.normalizers.filename.normalize(manifest[page])
}));
}
}
return matchers;
}
}
//# sourceMappingURL=pages-route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../../../../src/server/future/route-matcher-providers/pages-route-matcher-provider.ts"],"names":["PagesRouteMatcherProvider","ManifestRouteMatcherProvider","constructor","distDir","manifestLoader","i18nProvider","PAGES_MANIFEST","normalizers","PagesNormalizers","transform","manifest","pathnames","Object","keys","filter","pathname","isAPIRoute","normalized","analyze","BLOCKED_PAGES","includes","matchers","page","detectedLocale","push","PagesLocaleRouteMatcher","kind","RouteKind","PAGES","bundlePath","normalize","filename","i18n","locale","PagesRouteMatcher"],"mappings":";;;;+BAeaA;;;eAAAA;;;4BAfc;2BACmB;2BACpB;mCAInB;8CAKsC;uBAEZ;AAE1B,MAAMA,kCAAkCC,0DAA4B;IAGzEC,YACEC,OAAe,EACfC,cAA8B,EACbC,aACjB;QACA,KAAK,CAACC,yBAAc,EAAEF;4BAFLC;QAIjB,IAAI,CAACE,WAAW,GAAG,IAAIC,uBAAgB,CAACL;IAC1C;IAEA,MAAgBM,UACdC,QAAkB,EACyB;QAC3C,wEAAwE;QACxE,6BAA6B;QAC7B,MAAMC,YAAYC,OAAOC,IAAI,CAACH,UAC3BI,MAAM,CAAC,CAACC,WAAa,CAACC,IAAAA,sBAAU,EAACD,UAClC,wEAAwE;QACxE,mBAAmB;SAClBD,MAAM,CAAC,CAACC;gBAEL;YADF,MAAME,aACJ,EAAA,qBAAA,IAAI,CAACZ,YAAY,qBAAjB,mBAAmBa,OAAO,CAACH,UAAUA,QAAQ,KAAIA;YAEnD,0BAA0B;YAC1B,IAAII,wBAAa,CAACC,QAAQ,CAACH,aAAa,OAAO;YAE/C,OAAO;QACT;QAEF,MAAMI,WAAqC,EAAE;QAC7C,KAAK,MAAMC,QAAQX,UAAW;YAC5B,IAAI,IAAI,CAACN,YAAY,EAAE;gBACrB,uEAAuE;gBACvE,MAAM,EAAEkB,cAAc,EAAER,QAAQ,EAAE,GAAG,IAAI,CAACV,YAAY,CAACa,OAAO,CAACI;gBAE/DD,SAASG,IAAI,CACX,IAAIC,0CAAuB,CAAC;oBAC1BC,MAAMC,oBAAS,CAACC,KAAK;oBACrBb;oBACAO;oBACAO,YAAY,IAAI,CAACtB,WAAW,CAACsB,UAAU,CAACC,SAAS,CAACR;oBAClDS,UAAU,IAAI,CAACxB,WAAW,CAACwB,QAAQ,CAACD,SAAS,CAACpB,QAAQ,CAACY,KAAK;oBAC5DU,MAAM;wBACJC,QAAQV;oBACV;gBACF;YAEJ,OAAO;gBACLF,SAASG,IAAI,CACX,IAAIU,oCAAiB,CAAC;oBACpBR,MAAMC,oBAAS,CAACC,KAAK;oBACrB,qDAAqD;oBACrDb,UAAUO;oBACVA;oBACAO,YAAY,IAAI,CAACtB,WAAW,CAACsB,UAAU,CAACC,SAAS,CAACR;oBAClDS,UAAU,IAAI,CAACxB,WAAW,CAACwB,QAAQ,CAACD,SAAS,CAACpB,QAAQ,CAACY,KAAK;gBAC9D;YAEJ;QACF;QAEA,OAAOD;IACT;AACF"}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,4 @@
import { RouteMatcher } from '../route-matchers/route-matcher';
export interface RouteMatcherProvider<M extends RouteMatcher = RouteMatcher> {
matchers(): Promise<ReadonlyArray<M>>;
}

View File

@@ -0,0 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
//# sourceMappingURL=route-matcher-provider.js.map

View File

@@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":""}