1
1
import React , { ComponentType , useCallback , useEffect , useState } from 'https://esm.sh/react'
2
- import { AppManifestContext , DataContext , RouterContext } from './context.ts'
3
- import { E404Page , E501App , E501Page } from './error.ts'
2
+ import { DataContext , RouterContext } from './context.ts'
3
+ import { E404Page , E501App , E501Page , ErrorBoundary } from './error.ts'
4
4
import events from './events.ts'
5
5
import { createRouter } from './router.ts'
6
- import type { AppManifest , Module , RouterURL } from './types.ts'
6
+ import type { Module , RouterURL } from './types.ts'
7
7
import util , { hashShort , reModuleExt } from './util.ts'
8
8
9
9
export function ALEPH ( { initial } : {
10
10
initial : {
11
- manifest : AppManifest
11
+ baseUrl : string
12
+ defaultLocale : string
13
+ locales : string [ ]
12
14
routing : Record < string , Module >
13
15
url : RouterURL
14
16
staticData : Record < string , any >
15
17
components : Record < string , ComponentType < any > >
16
18
}
17
19
} ) {
18
- const [ manifest , setManifest ] = useState ( ( ) => initial . manifest )
19
20
const [ staticData , setStaticData ] = useState ( ( ) => initial . staticData )
20
21
const [ routing , setRouting ] = useState ( ( ) => initial . routing )
22
+ const [ locales , setLocales ] = useState ( ( ) => initial . locales )
21
23
const [ e404 , setE404 ] = useState ( ( ) => {
22
24
const { E404 } = initial . components
23
25
return {
@@ -39,13 +41,13 @@ export function ALEPH({ initial }: {
39
41
}
40
42
} )
41
43
const onpopstate = useCallback ( async ( ) => {
42
- const { baseUrl, defaultLocale, locales } = manifest
44
+ const { baseUrl, defaultLocale } = initial
43
45
const url = createRouter (
44
46
baseUrl ,
45
47
Object . keys ( routing ) ,
46
48
{
47
49
defaultLocale,
48
- locales : Object . keys ( locales )
50
+ locales
49
51
}
50
52
)
51
53
if ( url . pagePath && url . pagePath in routing ) {
@@ -65,7 +67,7 @@ export function ALEPH({ initial }: {
65
67
} else {
66
68
setPage ( { url, Component : null } )
67
69
}
68
- } , [ manifest , routing ] )
70
+ } , [ routing , locales ] )
69
71
70
72
useEffect ( ( ) => {
71
73
window . addEventListener ( 'popstate' , onpopstate )
@@ -78,7 +80,7 @@ export function ALEPH({ initial }: {
78
80
} , [ onpopstate ] )
79
81
80
82
useEffect ( ( ) => {
81
- const { baseUrl } = manifest
83
+ const { baseUrl } = initial
82
84
const onUpdateData = ( data : any ) => {
83
85
console . log ( '[DATA]' , data )
84
86
setStaticData ( data )
@@ -101,7 +103,7 @@ export function ALEPH({ initial }: {
101
103
Component : E501App
102
104
} ) )
103
105
}
104
- } else if ( mod . id === '/data.js' || mod . id === '/data/index.js' ) {
106
+ } else if ( mod . id === '/data.js' ) {
105
107
const { default : data } = await import ( getModuleImportUrl ( baseUrl , mod ) + '?t=' + Date . now ( ) )
106
108
console . log ( '[DATA]' , data )
107
109
setStaticData ( data )
@@ -118,7 +120,7 @@ export function ALEPH({ initial }: {
118
120
setE404 ( { Component : E404Page } )
119
121
} else if ( moduleId === '/app.js' ) {
120
122
setApp ( { Component : null } )
121
- } else if ( moduleId === '/data.js' || moduleId === '/data/index.js' ) {
123
+ } else if ( moduleId === '/data.js' ) {
122
124
console . log ( '[DATA]' , { } )
123
125
setStaticData ( { } )
124
126
} else if ( moduleId . startsWith ( '/pages/' ) ) {
@@ -144,20 +146,24 @@ export function ALEPH({ initial }: {
144
146
events . off ( 'add-module' , onAddModule )
145
147
events . off ( 'remove-module' , onRemoveModule )
146
148
}
147
- } , [ manifest ] )
149
+ } , [ ] )
148
150
149
- return React . createElement (
150
- AppManifestContext . Provider ,
151
- { value : manifest } ,
151
+ return (
152
152
React . createElement (
153
- DataContext . Provider ,
154
- { value : staticData } ,
153
+ ErrorBoundary ,
154
+ null ,
155
155
React . createElement (
156
- RouterContext . Provider ,
157
- { value : page . url } ,
158
- ( page . Component && app . Component ) && React . createElement ( app . Component , { Page : page . Component } ) ,
159
- ( page . Component && ! app . Component ) && React . createElement ( page . Component ) ,
160
- ! page . Component && React . createElement ( e404 . Component ) ,
156
+ DataContext . Provider ,
157
+ { value : staticData } ,
158
+ React . createElement (
159
+ RouterContext . Provider ,
160
+ { value : page . url } ,
161
+ ...[
162
+ ( page . Component && app . Component ) && React . createElement ( app . Component , { Page : page . Component } ) ,
163
+ ( page . Component && ! app . Component ) && React . createElement ( page . Component ) ,
164
+ ! page . Component && React . createElement ( e404 . Component )
165
+ ] . filter ( Boolean ) ,
166
+ )
161
167
)
162
168
)
163
169
)
0 commit comments