11#!/usr/bin/env node
2+ /* eslint-disable dot-notation */
23
34import minimist from 'minimist'
5+ // @ts -ignore
46import cliclopts from 'cliclopts'
57import { readFile } from 'fs/promises'
6- import { resolve , join , basename , sep , relative } from 'path'
8+ import { resolve , join } from 'path'
79import desm from 'desm'
810import process from 'process'
11+ // @ts -ignore
912import tree from 'pretty-tree'
10- import cleanDeep from 'clean-deep'
1113import { inspect } from 'util'
1214
1315import { Siteup } from './index.js'
16+ import { SiteupAggregateError } from './lib/helpers/siteup-aggregate-error.js'
17+ import { generateTreeData } from './lib/helpers/generate-tree-data.js'
18+
19+ /**
20+ * @typedef {import('./lib/builder.js').SiteupOpts } SiteupOpts
21+ * @typedef {import('./lib/builder.js').Results } Results
22+ */
1423
1524const __dirname = desm ( import . meta. url )
1625
@@ -61,13 +70,13 @@ const clopts = cliclopts([
6170const argv = minimist ( process . argv . slice ( 2 ) , clopts . options ( ) )
6271
6372async function run ( ) {
64- if ( argv . version ) {
73+ if ( argv [ ' version' ] ) {
6574 const pkg = await getPkg ( )
6675 console . log ( pkg . version )
6776 process . exit ( 0 )
6877 }
6978
70- if ( argv . help ) {
79+ if ( argv [ ' help' ] ) {
7180 const pkg = await getPkg ( )
7281 console . log ( 'Usage: siteup [options]\n' )
7382 console . log ( ' Example: siteup --src website --dest public\n' )
@@ -76,16 +85,15 @@ async function run () {
7685 process . exit ( 0 )
7786 }
7887 const cwd = process . cwd ( )
79- const src = resolve ( join ( cwd , argv . src ) )
80- const dest = resolve ( join ( cwd , argv . dest ) )
81-
82- // TODO validate input a little better
88+ const src = resolve ( join ( cwd , argv [ 'src' ] ) )
89+ const dest = resolve ( join ( cwd , argv [ 'dest' ] ) )
8390
91+ /** @type {SiteupOpts } */
8492 const opts = { }
8593
86- if ( argv . ignore ) opts . ignore = argv . ignore . split ( ',' )
94+ if ( argv [ ' ignore' ] ) opts . ignore = argv [ ' ignore' ] . split ( ',' )
8795
88- const siteup = new Siteup ( src , dest , cwd , opts )
96+ const siteup = new Siteup ( src , dest , opts )
8997
9098 process . once ( 'SIGINT' , quit )
9199 process . once ( 'SIGTERM' , quit )
@@ -100,8 +108,7 @@ async function run () {
100108 process . exit ( 0 )
101109 }
102110
103- if ( ! argv . watch ) {
104- // TODO: handle warning and error output
111+ if ( ! argv [ 'watch' ] ) {
105112 try {
106113 const results = await siteup . build ( )
107114 console . log ( tree ( generateTreeData ( cwd , src , dest , results ) ) )
@@ -111,88 +118,41 @@ async function run () {
111118 )
112119 }
113120 for ( const warning of results ?. warnings ) {
114- console . log ( ` ${ warning . message } ` )
121+ if ( 'message' in warning ) {
122+ console . log ( ` ${ warning . message } ` )
123+ } else {
124+ console . warn ( warning )
125+ }
115126 }
116127 console . log ( '\nBuild Success!\n\n' )
117128 } catch ( err ) {
118- if ( err . results ?. siteData ?. pages ) {
119- console . log ( tree ( generateTreeData ( cwd , src , dest , err . results ) ) )
129+ if ( ! ( err instanceof Error || err instanceof AggregateError ) ) throw new Error ( 'Non-error thrown' , { cause : err } )
130+ if ( err instanceof SiteupAggregateError ) {
131+ if ( err ?. results ?. siteData ?. pages ) {
132+ console . log ( tree ( generateTreeData ( cwd , src , dest , err . results ) ) )
133+ }
120134 }
135+ if ( 'results' in err ) delete err . results
121136 console . error ( inspect ( err , { depth : 999 , colors : true } ) )
122137
123- if ( err . errors ) {
124- console . error ( inspect ( err . errors , { depth : 5 , colors : true } ) )
125- }
126-
127138 console . log ( '\nBuild Failed!\n\n' )
128139 }
129140 } else {
130- // TODO: handle watch data event or something... maybe like a async iterator?
131141 const initialResults = await siteup . watch ( )
132- console . log ( initialResults )
133- }
134- }
135-
136- function generateTreeData ( cwd , src , dest , results ) {
137- const cwdDir = basename ( cwd )
138- const srcDir = basename ( relative ( cwd , src ) )
139- const destDir = basename ( relative ( cwd , dest ) )
140-
141- const treeStructure = {
142- label : `${ join ( cwdDir , srcDir ) } => ${ join ( cwdDir , destDir ) } ` ,
143- leaf : {
144- globalStyle : results ?. siteData ?. globalStyle ?. outputRelname ,
145- globalClient : results ?. siteData ?. outputMaps ?. outputRelname ,
146- globalVars : results ?. siteData ?. globalVars ?. basename ,
147- rootLayout : results ?. siteData ?. rootLayout ?. basename
148- } ,
149- nodes : [ ]
150- }
151-
152- for ( const page of results ?. siteData ?. pages ) {
153- const segments = page . page . relname . split ( sep )
154- segments . pop ( )
155-
156- let nodes = treeStructure . nodes
157- let targetNode = treeStructure
158-
159- for ( const segment of segments ) {
160- targetNode = nodes . find ( node => segment === node . label )
161- if ( ! targetNode ) {
162- targetNode = { label : segment , leaf : { } , nodes : [ ] }
163- nodes . push ( targetNode )
164- }
165- nodes = targetNode . nodes
142+ console . log ( tree ( generateTreeData ( cwd , src , dest , initialResults ) ) )
143+ if ( initialResults ?. warnings ?. length > 0 ) {
144+ console . log (
145+ '\nThere were build warnings:\n'
146+ )
166147 }
167-
168- targetNode . leaf [ page . page . basename ] = join ( page . path , page . outputName )
169- if ( page . pageStyle ) targetNode . leaf [ page . pageStyle . basename ] = join ( page . path , page . pageStyle . outputName ?? page . pageStyle . basename )
170- if ( page . clientBundle ) targetNode . leaf [ page . clientBundle . basename ] = join ( page . path , page . clientBundle . outputName ?? page . clientBundle . basename )
171- if ( page . pageVars ) targetNode . leaf [ page . pageVars . basename ] = join ( page . path , page . pageVars . basename )
172- }
173-
174- for ( const file of results ?. static ?. report ?. copied ) {
175- const srcFile = relative ( srcDir , file . source )
176- const destFile = relative ( destDir , file . output )
177- const segments = srcFile . split ( sep )
178- segments . pop ( )
179-
180- let nodes = treeStructure . nodes
181- let targetNode = treeStructure
182-
183- for ( const segment of segments ) {
184- targetNode = nodes . find ( node => segment === node . label )
185- if ( ! targetNode ) {
186- targetNode = { label : segment , leaf : { } , nodes : [ ] }
187- nodes . push ( targetNode )
148+ for ( const warning of initialResults ?. warnings ) {
149+ if ( 'message' in warning ) {
150+ console . log ( ` ${ warning . message } ` )
151+ } else {
152+ console . warn ( warning )
188153 }
189- nodes = targetNode . nodes
190154 }
191-
192- targetNode . leaf [ basename ( srcFile ) ] = destFile
193155 }
194-
195- return cleanDeep ( treeStructure )
196156}
197157
198158run ( ) . catch ( err => {
0 commit comments