11import path from 'path' ;
2- import matter from 'gray-matter' ;
3- import type { SafeParseError } from 'zod' ;
4- import { activeEnvSchema } from '@jpmorganchase/mosaic-schemas' ;
52import type { SharedConfig } from '@jpmorganchase/mosaic-store' ;
3+ import type { MosaicMode } from '@jpmorganchase/mosaic-types' ;
64
75import type { LoaderPage } from './types/index.js' ;
6+ import { loadActiveContent , loadActiveMosaicData } from './loadActiveContent' ;
7+ import { loadSnapshotFileContent , loadSnapshotFileMosaicData } from './loadSnapshotFileContent' ;
88
9+ export { LoadPageError } from './LoadPageError' ;
910export * from './types/index.js' ;
1011
11- const normalizePageUrl = ( url : string ) : string => ( / \/ i n d e x $ / . test ( url ) ? `${ url } .mdx` : url ) ;
12-
13- type ActiveModeUrlEnv = {
14- MOSAIC_ACTIVE_MODE_URL : string ;
15- } ;
16-
17- export class LoadPageError extends Error {
18- statusCode : number ;
19- constructor ( { message, statusCode } : { message : string ; statusCode : number } ) {
20- super ( message ) ;
21- this . statusCode = statusCode ;
22- }
23- }
24-
25- const getFSRootUrl = ( ) : string => {
26- const env = activeEnvSchema . safeParse ( process . env ) ;
27- if ( ! env . success ) {
28- const { error } = env as SafeParseError < ActiveModeUrlEnv > ;
29- error . issues . forEach ( issue => {
30- console . error (
31- `Missing process.env.${ issue . path . join ( ) } environment variable required to load pages`
32- ) ;
33- } ) ;
34- throw new LoadPageError ( {
35- message : `Environment variables missing to load pages` ,
36- statusCode : 500
37- } ) ;
38- }
39- return env . data . MOSAIC_ACTIVE_MODE_URL ;
40- } ;
41-
4212export const loadMosaicData = async < T > ( url : string ) : Promise < T > => {
43- const fsRootUrl = getFSRootUrl ( ) ;
44- const dataUrl = new URL ( url , fsRootUrl ) ;
45- const response = await fetch ( dataUrl ) ;
13+ const mode : MosaicMode = ( process . env . MOSAIC_MODE || 'active' ) as MosaicMode ;
4614
47- if ( ! response . ok ) {
48- // This will activate the closest `error.js` Error Boundary
49- throw new Error ( `Failed to fetch mosaic data @ ${ dataUrl } ` ) ;
15+ if ( mode === 'snapshot-file' ) {
16+ return loadSnapshotFileMosaicData ( url ) ;
5017 }
51- return response . json ( ) ;
18+
19+ return loadActiveMosaicData ( url ) ;
5220} ;
5321
5422export const loadSharedConfig = async ( route : string ) : Promise < SharedConfig | undefined > => {
@@ -58,20 +26,11 @@ export const loadSharedConfig = async (route: string): Promise<SharedConfig | un
5826} ;
5927
6028export const loadPage = async ( route : string ) : Promise < LoaderPage > => {
61- const fsRootUrl = getFSRootUrl ( ) ;
62- const pageUrl = normalizePageUrl ( `${ fsRootUrl } ${ route } ` ) ;
63- const response = await fetch ( pageUrl ) ;
64- if ( response . status === 302 ) {
65- const { redirect } = await response . json ( ) ;
66- return loadPage ( redirect ) ;
67- }
68- if ( response . ok ) {
69- const source = await response . text ( ) ;
70- const { content, data } = matter ( source ) ;
71- return { source : content , data } ;
29+ const mode : MosaicMode = ( process . env . MOSAIC_MODE || 'active' ) as MosaicMode ;
30+
31+ if ( mode === 'snapshot-file' ) {
32+ return loadSnapshotFileContent ( route ) ;
7233 }
73- throw new LoadPageError ( {
74- message : `Could not load page : ${ pageUrl } ${ response . status } /${ response . statusText } ` ,
75- statusCode : 404
76- } ) ;
34+
35+ return loadActiveContent ( route ) ;
7736} ;
0 commit comments