@@ -84,118 +84,120 @@ export default function create_manifest_data({
8484 const routes_base = posixify ( path . relative ( cwd , config . kit . files . routes ) ) ;
8585 const valid_extensions = [ ...config . extensions , ...config . kit . endpointExtensions ] ;
8686
87- list_files ( config . kit . files . routes ) . forEach ( ( file ) => {
88- const extension = valid_extensions . find ( ( ext ) => file . endsWith ( ext ) ) ;
89- if ( ! extension ) return ;
90-
91- const id = file
92- . slice ( 0 , - extension . length )
93- . replace ( / (?: ^ | \/ ) i n d e x ( (?: @ [ a - z A - Z 0 - 9 _ - ] + ) ? (?: \. [ a - z ] + ) ? ) ? $ / , '$1' ) ;
94- const project_relative = `${ routes_base } /${ file } ` ;
95-
96- const segments = id . split ( '/' ) ;
97- const name = /** @type {string } */ ( segments . pop ( ) ) ;
98-
99- if ( name === '__layout.reset' ) {
100- throw new Error (
101- '__layout.reset has been removed in favour of named layouts: https://kit.svelte.dev/docs/layouts#named-layouts'
102- ) ;
103- }
87+ if ( fs . existsSync ( config . kit . files . routes ) ) {
88+ list_files ( config . kit . files . routes ) . forEach ( ( file ) => {
89+ const extension = valid_extensions . find ( ( ext ) => file . endsWith ( ext ) ) ;
90+ if ( ! extension ) return ;
10491
105- if ( name === '__error' || layout_pattern . test ( name ) ) {
106- const dir = segments . join ( '/' ) ;
92+ const id = file
93+ . slice ( 0 , - extension . length )
94+ . replace ( / (?: ^ | \/ ) i n d e x ( (?: @ [ a - z A - Z 0 - 9 _ - ] + ) ? (?: \. [ a - z ] + ) ? ) ? $ / , '$1' ) ;
95+ const project_relative = `${ routes_base } /${ file } ` ;
10796
108- if ( ! tree . has ( dir ) ) {
109- tree . set ( dir , {
110- error : undefined ,
111- layouts : { }
112- } ) ;
113- }
97+ const segments = id . split ( '/' ) ;
98+ const name = /** @type {string } */ ( segments . pop ( ) ) ;
11499
115- const group = /** @type {Node } */ ( tree . get ( dir ) ) ;
100+ if ( name === '__layout.reset' ) {
101+ throw new Error (
102+ '__layout.reset has been removed in favour of named layouts: https://kit.svelte.dev/docs/layouts#named-layouts'
103+ ) ;
104+ }
116105
117- if ( name === '__error' ) {
118- group . error = project_relative ;
119- } else {
120- const match = /** @type {RegExpMatchArray } */ ( layout_pattern . exec ( name ) ) ;
106+ if ( name === '__error' || layout_pattern . test ( name ) ) {
107+ const dir = segments . join ( '/' ) ;
121108
122- if ( match [ 1 ] === DEFAULT ) {
123- throw new Error ( `${ project_relative } cannot use reserved "${ DEFAULT } " name` ) ;
109+ if ( ! tree . has ( dir ) ) {
110+ tree . set ( dir , {
111+ error : undefined ,
112+ layouts : { }
113+ } ) ;
124114 }
125115
126- const layout_id = match [ 1 ] || DEFAULT ;
116+ const group = /** @type {Node } */ ( tree . get ( dir ) ) ;
117+
118+ if ( name === '__error' ) {
119+ group . error = project_relative ;
120+ } else {
121+ const match = /** @type {RegExpMatchArray } */ ( layout_pattern . exec ( name ) ) ;
127122
128- const defined = group . layouts [ layout_id ] ;
129- if ( defined && defined !== default_layout ) {
130- throw new Error (
131- `Duplicate layout ${ project_relative } already defined at ${ defined . file } `
132- ) ;
123+ if ( match [ 1 ] === DEFAULT ) {
124+ throw new Error ( `${ project_relative } cannot use reserved "${ DEFAULT } " name` ) ;
125+ }
126+
127+ const layout_id = match [ 1 ] || DEFAULT ;
128+
129+ const defined = group . layouts [ layout_id ] ;
130+ if ( defined && defined !== default_layout ) {
131+ throw new Error (
132+ `Duplicate layout ${ project_relative } already defined at ${ defined . file } `
133+ ) ;
134+ }
135+
136+ group . layouts [ layout_id ] = {
137+ file : project_relative ,
138+ name
139+ } ;
133140 }
134141
135- group . layouts [ layout_id ] = {
136- file : project_relative ,
137- name
138- } ;
142+ return ;
143+ } else if ( dunder_pattern . test ( file ) ) {
144+ throw new Error (
145+ `Files and directories prefixed with __ are reserved (saw ${ project_relative } )`
146+ ) ;
139147 }
140148
141- return ;
142- } else if ( dunder_pattern . test ( file ) ) {
143- throw new Error (
144- `Files and directories prefixed with __ are reserved (saw ${ project_relative } )`
145- ) ;
146- }
147-
148- if ( ! config . kit . routes ( file ) ) return ;
149+ if ( ! config . kit . routes ( file ) ) return ;
149150
150- if ( / \] \[ / . test ( id ) ) {
151- throw new Error ( `Invalid route ${ project_relative } — parameters must be separated` ) ;
152- }
151+ if ( / \] \[ / . test ( id ) ) {
152+ throw new Error ( `Invalid route ${ project_relative } — parameters must be separated` ) ;
153+ }
153154
154- if ( count_occurrences ( '[' , id ) !== count_occurrences ( ']' , id ) ) {
155- throw new Error ( `Invalid route ${ project_relative } — brackets are unbalanced` ) ;
156- }
155+ if ( count_occurrences ( '[' , id ) !== count_occurrences ( ']' , id ) ) {
156+ throw new Error ( `Invalid route ${ project_relative } — brackets are unbalanced` ) ;
157+ }
157158
158- if ( ! units . has ( id ) ) {
159- units . set ( id , {
160- id,
161- pattern : parse_route_id ( id ) . pattern ,
162- segments : id
163- . split ( '/' )
164- . filter ( Boolean )
165- . map ( ( segment ) => {
166- /** @type {Part[] } */
167- const parts = [ ] ;
168- segment . split ( / \[ ( .+ ?) \] / ) . map ( ( content , i ) => {
169- const dynamic = ! ! ( i % 2 ) ;
170-
171- if ( ! content ) return ;
172-
173- parts . push ( {
174- content,
175- dynamic,
176- rest : dynamic && content . startsWith ( '...' ) ,
177- type : ( dynamic && content . split ( '=' ) [ 1 ] ) || null
159+ if ( ! units . has ( id ) ) {
160+ units . set ( id , {
161+ id,
162+ pattern : parse_route_id ( id ) . pattern ,
163+ segments : id
164+ . split ( '/' )
165+ . filter ( Boolean )
166+ . map ( ( segment ) => {
167+ /** @type {Part[] } */
168+ const parts = [ ] ;
169+ segment . split ( / \[ ( .+ ?) \] / ) . map ( ( content , i ) => {
170+ const dynamic = ! ! ( i % 2 ) ;
171+
172+ if ( ! content ) return ;
173+
174+ parts . push ( {
175+ content,
176+ dynamic,
177+ rest : dynamic && content . startsWith ( '...' ) ,
178+ type : ( dynamic && content . split ( '=' ) [ 1 ] ) || null
179+ } ) ;
178180 } ) ;
179- } ) ;
180- return parts ;
181- } ) ,
182- page : undefined ,
183- endpoint : undefined
184- } ) ;
185- }
181+ return parts ;
182+ } ) ,
183+ page : undefined ,
184+ endpoint : undefined
185+ } ) ;
186+ }
186187
187- const unit = /** @type {Unit } */ ( units . get ( id ) ) ;
188+ const unit = /** @type {Unit } */ ( units . get ( id ) ) ;
188189
189- if ( config . extensions . find ( ( ext ) => file . endsWith ( ext ) ) ) {
190- const { layouts, errors } = trace ( project_relative , file , tree , config . extensions ) ;
191- unit . page = {
192- a : layouts . concat ( project_relative ) ,
193- b : errors
194- } ;
195- } else {
196- unit . endpoint = project_relative ;
197- }
198- } ) ;
190+ if ( config . extensions . find ( ( ext ) => file . endsWith ( ext ) ) ) {
191+ const { layouts, errors } = trace ( project_relative , file , tree , config . extensions ) ;
192+ unit . page = {
193+ a : layouts . concat ( project_relative ) ,
194+ b : errors
195+ } ;
196+ } else {
197+ unit . endpoint = project_relative ;
198+ }
199+ } ) ;
200+ }
199201
200202 /** @type {string[] } */
201203 const components = [ ] ;
0 commit comments