Skip to content

Commit

Permalink
fix: cleanup for built normalizers
Browse files Browse the repository at this point in the history
  • Loading branch information
wyattjoh committed Mar 27, 2023
1 parent 152b0b5 commit fdf746c
Show file tree
Hide file tree
Showing 20 changed files with 277 additions and 192 deletions.
Expand Up @@ -18,8 +18,8 @@ export class AbsoluteFilenameNormalizer implements Normalizer {
private readonly pagesType: 'pages' | 'app' | 'root'
) {}

public normalize(pathname: string): string {
return absolutePathToPage(pathname, {
public normalize(filename: string): string {
return absolutePathToPage(filename, {
extensions: this.extensions,
keepIndex: false,
dir: this.dir,
Expand Down
@@ -0,0 +1,28 @@
import { Normalizers } from '../../normalizers'
import { Normalizer } from '../../normalizer'
import { PrefixingNormalizer } from '../../prefixing-normalizer'

export class AppBundlePathNormalizer extends PrefixingNormalizer {
constructor() {
super('app')
}

public normalize(page: string): string {
return super.normalize(page)
}
}

export class DevAppBundlePathNormalizer extends Normalizers {
constructor(pageNormalizer: Normalizer) {
super([
// This should normalize the filename to a page.
pageNormalizer,
// Normalize the app page to a pathname.
new AppBundlePathNormalizer(),
])
}

public normalize(filename: string): string {
return super.normalize(filename)
}
}
@@ -0,0 +1,12 @@
import { SERVER_DIRECTORY } from '../../../../../shared/lib/constants'
import { PrefixingNormalizer } from '../../prefixing-normalizer'

export class AppFilenameNormalizer extends PrefixingNormalizer {
constructor(distDir: string) {
super(distDir, SERVER_DIRECTORY)
}

public normalize(manifestFilename: string): string {
return super.normalize(manifestFilename)
}
}
@@ -0,0 +1,11 @@
import { AbsoluteFilenameNormalizer } from '../../absolute-filename-normalizer'

/**
* DevAppPageNormalizer is a normalizer that is used to normalize a pathname
* to a page in the `app` directory.
*/
export class DevAppPageNormalizer extends AbsoluteFilenameNormalizer {
constructor(appDir: string, extensions: ReadonlyArray<string>) {
super(appDir, extensions, 'app')
}
}
@@ -0,0 +1,36 @@
import { normalizeAppPath } from '../../../../../shared/lib/router/utils/app-paths'
import { Normalizers } from '../../normalizers'
import { wrapNormalizerFn } from '../../wrap-normalizer-fn'
import { UnderscoreNormalizer } from '../../underscore-normalizer'
import { Normalizer } from '../../normalizer'

export class AppPathnameNormalizer extends Normalizers {
constructor() {
super([
// The pathname to match should have the trailing `/page` and other route
// group information stripped from it.
wrapNormalizerFn(normalizeAppPath),
// The page should have the `%5F` characters replaced with `_` characters.
new UnderscoreNormalizer(),
])
}

public normalize(page: string): string {
return super.normalize(page)
}
}

export class DevAppPathnameNormalizer extends Normalizers {
constructor(pageNormalizer: Normalizer) {
super([
// This should normalize the filename to a page.
pageNormalizer,
// Normalize the app page to a pathname.
new AppPathnameNormalizer(),
])
}

public normalize(filename: string): string {
return super.normalize(filename)
}
}
34 changes: 34 additions & 0 deletions packages/next/src/server/future/normalizers/built/app/index.ts
@@ -0,0 +1,34 @@
import {
AppBundlePathNormalizer,
DevAppBundlePathNormalizer,
} from './app-bundle-path-normalizer'
import { AppFilenameNormalizer } from './app-filename-normalizer'
import { DevAppPageNormalizer } from './app-page-normalizer'
import {
AppPathnameNormalizer,
DevAppPathnameNormalizer,
} from './app-pathname-normalizer'

export class AppNormalizers {
public readonly filename: AppFilenameNormalizer
public readonly pathname: AppPathnameNormalizer
public readonly bundlePath: AppBundlePathNormalizer

constructor(distDir: string) {
this.filename = new AppFilenameNormalizer(distDir)
this.pathname = new AppPathnameNormalizer()
this.bundlePath = new AppBundlePathNormalizer()
}
}

export class DevAppNormalizers {
public readonly page: DevAppPageNormalizer
public readonly pathname: DevAppPathnameNormalizer
public readonly bundlePath: DevAppBundlePathNormalizer

constructor(appDir: string, extensions: ReadonlyArray<string>) {
this.page = new DevAppPageNormalizer(appDir, extensions)
this.pathname = new DevAppPathnameNormalizer(this.page)
this.bundlePath = new DevAppBundlePathNormalizer(this.page)
}
}
33 changes: 33 additions & 0 deletions packages/next/src/server/future/normalizers/built/pages/index.ts
@@ -0,0 +1,33 @@
import {
DevPagesBundlePathNormalizer,
PagesBundlePathNormalizer,
} from './pages-bundle-path-normalizer'
import { PagesFilenameNormalizer } from './pages-filename-normalizer'
import { DevPagesPageNormalizer } from './pages-page-normalizer'
import { DevPagesPathnameNormalizer } from './pages-pathname-normalizer'

export class PagesNormalizers {
public readonly filename: PagesFilenameNormalizer
public readonly bundlePath: PagesBundlePathNormalizer

constructor(distDir: string) {
this.filename = new PagesFilenameNormalizer(distDir)
this.bundlePath = new PagesBundlePathNormalizer()

// You'd think that we'd require a `pathname` normalizer here, but for
// `/pages` we have to handle i18n routes, which means that we need to
// analyze the page path to determine the locale prefix and it's locale.
}
}

export class DevPagesNormalizers {
public readonly page: DevPagesPageNormalizer
public readonly pathname: DevPagesPathnameNormalizer
public readonly bundlePath: DevPagesBundlePathNormalizer

constructor(pagesDir: string, extensions: ReadonlyArray<string>) {
this.page = new DevPagesPageNormalizer(pagesDir, extensions)
this.pathname = new DevPagesPathnameNormalizer(pagesDir, extensions)
this.bundlePath = new DevPagesBundlePathNormalizer(this.page)
}
}
@@ -0,0 +1,36 @@
import { normalizePagePath } from '../../../../../shared/lib/page-path/normalize-page-path'
import { Normalizer } from '../../normalizer'
import { Normalizers } from '../../normalizers'
import { PrefixingNormalizer } from '../../prefixing-normalizer'
import { wrapNormalizerFn } from '../../wrap-normalizer-fn'

export class PagesBundlePathNormalizer extends Normalizers {
constructor() {
super([
// The bundle path should have the trailing `/index` stripped from
// it.
wrapNormalizerFn(normalizePagePath),
// The page should prefixed with `pages/`.
new PrefixingNormalizer('pages'),
])
}

public normalize(page: string): string {
return super.normalize(page)
}
}

export class DevPagesBundlePathNormalizer extends Normalizers {
constructor(pagesNormalizer: Normalizer) {
super([
// This should normalize the filename to a page.
pagesNormalizer,
// Normalize the app page to a pathname.
new PagesBundlePathNormalizer(),
])
}

public normalize(filename: string): string {
return super.normalize(filename)
}
}
@@ -0,0 +1,12 @@
import { SERVER_DIRECTORY } from '../../../../../shared/lib/constants'
import { PrefixingNormalizer } from '../../prefixing-normalizer'

export class PagesFilenameNormalizer extends PrefixingNormalizer {
constructor(distDir: string) {
super(distDir, SERVER_DIRECTORY)
}

public normalize(manifestFilename: string): string {
return super.normalize(manifestFilename)
}
}
@@ -0,0 +1,7 @@
import { AbsoluteFilenameNormalizer } from '../../absolute-filename-normalizer'

export class DevPagesPageNormalizer extends AbsoluteFilenameNormalizer {
constructor(pagesDir: string, extensions: ReadonlyArray<string>) {
super(pagesDir, extensions, 'pages')
}
}
@@ -0,0 +1,7 @@
import { AbsoluteFilenameNormalizer } from '../../absolute-filename-normalizer'

export class DevPagesPathnameNormalizer extends AbsoluteFilenameNormalizer {
constructor(pagesDir: string, extensions: ReadonlyArray<string>) {
super(pagesDir, extensions, 'pages')
}
}
Expand Up @@ -2,7 +2,11 @@ import path from '../../../shared/lib/isomorphic/path'
import { Normalizer } from './normalizer'

export class PrefixingNormalizer implements Normalizer {
constructor(private readonly prefix: string) {}
private readonly prefix: string

constructor(...prefixes: ReadonlyArray<string>) {
this.prefix = path.posix.join(...prefixes)
}

public normalize(pathname: string): string {
return path.posix.join(this.prefix, pathname)
Expand Down
@@ -1,14 +1,6 @@
import { isAppPageRoute } from '../../../lib/is-app-page-route'
import {
APP_PATHS_MANIFEST,
SERVER_DIRECTORY,
} from '../../../shared/lib/constants'
import path from '../../../shared/lib/isomorphic/path'
import { normalizeAppPath } from '../../../shared/lib/router/utils/app-paths'
import { Normalizers } from '../normalizers/normalizers'
import { PrefixingNormalizer } from '../normalizers/prefixing-normalizer'
import { UnderscoreNormalizer } from '../normalizers/underscore-normalizer'
import { wrapNormalizerFn } from '../normalizers/wrap-normalizer-fn'
import { APP_PATHS_MANIFEST } from '../../../shared/lib/constants'
import { AppNormalizers } from '../normalizers/built/app'
import { RouteKind } from '../route-kind'
import { AppPageRouteMatcher } from '../route-matchers/app-page-route-matcher'
import {
Expand All @@ -18,19 +10,12 @@ import {
import { ManifestRouteMatcherProvider } from './manifest-route-matcher-provider'

export class AppPageRouteMatcherProvider extends ManifestRouteMatcherProvider<AppPageRouteMatcher> {
private readonly normalizers = {
pathname: new Normalizers([
wrapNormalizerFn(normalizeAppPath),
new UnderscoreNormalizer(),
]),
bundlePath: new PrefixingNormalizer('app'),
}
private readonly normalizers: AppNormalizers

constructor(
private readonly distDir: string,
manifestLoader: ManifestLoader
) {
constructor(distDir: string, manifestLoader: ManifestLoader) {
super(APP_PATHS_MANIFEST, manifestLoader)

this.normalizers = new AppNormalizers(distDir)
}

protected async transform(
Expand All @@ -41,20 +26,20 @@ export class AppPageRouteMatcherProvider extends ManifestRouteMatcherProvider<Ap

// Collect all the app paths for each page. This could include any parallel
// routes.
const appPaths: Record<string, string[]> = {}
const allAppPaths: Record<string, string[]> = {}
for (const page of pages) {
const pathname = this.normalizers.pathname.normalize(page)
if (pathname in appPaths) appPaths[pathname].push(page)
else appPaths[pathname] = [page]
if (pathname in allAppPaths) allAppPaths[pathname].push(page)
else allAppPaths[pathname] = [page]
}

// Format the routes.
const matchers: Array<AppPageRouteMatcher> = []
for (const [pathname, paths] of Object.entries(appPaths)) {
for (const [pathname, appPaths] of Object.entries(allAppPaths)) {
// TODO-APP: (wyattjoh) this is a hack right now, should be more deterministic
const page = paths[0]
const page = appPaths[0]

const filename = path.join(this.distDir, SERVER_DIRECTORY, manifest[page])
const filename = this.normalizers.filename.normalize(manifest[page])
const bundlePath = this.normalizers.bundlePath.normalize(page)

matchers.push(
Expand All @@ -64,7 +49,7 @@ export class AppPageRouteMatcherProvider extends ManifestRouteMatcherProvider<Ap
page,
bundlePath,
filename,
appPaths: paths,
appPaths,
})
)
}
Expand Down
@@ -1,36 +1,21 @@
import path from '../../../shared/lib/isomorphic/path'
import { isAppRouteRoute } from '../../../lib/is-app-route-route'
import {
APP_PATHS_MANIFEST,
SERVER_DIRECTORY,
} from '../../../shared/lib/constants'
import { normalizeAppPath } from '../../../shared/lib/router/utils/app-paths'
import { APP_PATHS_MANIFEST } from '../../../shared/lib/constants'
import { RouteKind } from '../route-kind'
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'
import { Normalizers } from '../normalizers/normalizers'
import { PrefixingNormalizer } from '../normalizers/prefixing-normalizer'
import { UnderscoreNormalizer } from '../normalizers/underscore-normalizer'
import { wrapNormalizerFn } from '../normalizers/wrap-normalizer-fn'
import { AppNormalizers } from '../normalizers/built/app'

export class AppRouteRouteMatcherProvider extends ManifestRouteMatcherProvider<AppRouteRouteMatcher> {
private readonly normalizers = {
pathname: new Normalizers([
wrapNormalizerFn(normalizeAppPath),
new UnderscoreNormalizer(),
]),
bundlePath: new PrefixingNormalizer('app'),
}
private readonly normalizers: AppNormalizers

constructor(
private readonly distDir: string,
manifestLoader: ManifestLoader
) {
constructor(distDir: string, manifestLoader: ManifestLoader) {
super(APP_PATHS_MANIFEST, manifestLoader)

this.normalizers = new AppNormalizers(distDir)
}

protected async transform(
Expand All @@ -42,8 +27,8 @@ export class AppRouteRouteMatcherProvider extends ManifestRouteMatcherProvider<A
// Format the routes.
const matchers: Array<AppRouteRouteMatcher> = []
for (const page of pages) {
const filename = this.normalizers.filename.normalize(manifest[page])
const pathname = this.normalizers.pathname.normalize(page)
const filename = path.join(this.distDir, SERVER_DIRECTORY, manifest[page])
const bundlePath = this.normalizers.bundlePath.normalize(page)

matchers.push(
Expand Down

0 comments on commit fdf746c

Please sign in to comment.