Skip to content

Commit

Permalink
Refactors and type
Browse files Browse the repository at this point in the history
Major type refactor
  • Loading branch information
bcomnes committed Oct 30, 2023
1 parent 736428f commit 6259608
Show file tree
Hide file tree
Showing 57 changed files with 2,795 additions and 637 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Expand Up @@ -8,7 +8,7 @@ on:
required: true

env:
node_version: 16
node_version: lts/*
FORCE_COLOR: 2

jobs:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tests.yml
Expand Up @@ -13,7 +13,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
node_version: [16]
node_version: [lts/*]

steps:
- uses: actions/checkout@v4
Expand Down
6 changes: 6 additions & 0 deletions .gitignore
Expand Up @@ -5,3 +5,9 @@ package-lock.json
public
coverage
.tap

# Generated types
*.d.ts
*.d.ts.map
!/lib/**/*-types.d.ts
!/index.d.ts
1 change: 1 addition & 0 deletions .npmignore
@@ -0,0 +1 @@
*.test.js
1 change: 1 addition & 0 deletions README.md
@@ -1,6 +1,7 @@
# @siteup/cli
[![Actions Status](https://github.com/bcomnes/siteup-cli/workflows/tests/badge.svg)](https://github.com/bcomnes/siteup-cli/actions)
[![Coverage Status](https://coveralls.io/repos/github/bcomnes/siteup/badge.svg?branch=master)](https://coveralls.io/github/bcomnes/siteup?branch=master)
[![Types in JS](https://img.shields.io/badge/types_in_js-yes-brightgreen)](https://github.com/voxpelli/types-in-js)
[![Neocities][neocities-img]](https://siteup.neocities.org)

`siteup` builds websites with html, md, css and js.
Expand Down
120 changes: 40 additions & 80 deletions bin.js
@@ -1,16 +1,25 @@
#!/usr/bin/env node
/* eslint-disable dot-notation */

import minimist from 'minimist'
// @ts-ignore
import cliclopts from 'cliclopts'
import { readFile } from 'fs/promises'
import { resolve, join, basename, sep, relative } from 'path'
import { resolve, join } from 'path'
import desm from 'desm'
import process from 'process'
// @ts-ignore
import tree from 'pretty-tree'
import cleanDeep from 'clean-deep'
import { inspect } from 'util'

import { Siteup } from './index.js'
import { SiteupAggregateError } from './lib/helpers/siteup-aggregate-error.js'
import { generateTreeData } from './lib/helpers/generate-tree-data.js'

/**
* @typedef {import('./lib/builder.js').SiteupOpts} SiteupOpts
* @typedef {import('./lib/builder.js').Results} Results
*/

const __dirname = desm(import.meta.url)

Expand Down Expand Up @@ -61,13 +70,13 @@ const clopts = cliclopts([
const argv = minimist(process.argv.slice(2), clopts.options())

async function run () {
if (argv.version) {
if (argv['version']) {
const pkg = await getPkg()
console.log(pkg.version)
process.exit(0)
}

if (argv.help) {
if (argv['help']) {
const pkg = await getPkg()
console.log('Usage: siteup [options]\n')
console.log(' Example: siteup --src website --dest public\n')
Expand All @@ -76,16 +85,15 @@ async function run () {
process.exit(0)
}
const cwd = process.cwd()
const src = resolve(join(cwd, argv.src))
const dest = resolve(join(cwd, argv.dest))

// TODO validate input a little better
const src = resolve(join(cwd, argv['src']))
const dest = resolve(join(cwd, argv['dest']))

/** @type {SiteupOpts} */
const opts = {}

if (argv.ignore) opts.ignore = argv.ignore.split(',')
if (argv['ignore']) opts.ignore = argv['ignore'].split(',')

const siteup = new Siteup(src, dest, cwd, opts)
const siteup = new Siteup(src, dest, opts)

process.once('SIGINT', quit)
process.once('SIGTERM', quit)
Expand All @@ -100,8 +108,7 @@ async function run () {
process.exit(0)
}

if (!argv.watch) {
// TODO: handle warning and error output
if (!argv['watch']) {
try {
const results = await siteup.build()
console.log(tree(generateTreeData(cwd, src, dest, results)))
Expand All @@ -111,88 +118,41 @@ async function run () {
)
}
for (const warning of results?.warnings) {
console.log(` ${warning.message}`)
if ('message' in warning) {
console.log(` ${warning.message}`)
} else {
console.warn(warning)
}
}
console.log('\nBuild Success!\n\n')
} catch (err) {
if (err.results?.siteData?.pages) {
console.log(tree(generateTreeData(cwd, src, dest, err.results)))
if (!(err instanceof Error || err instanceof AggregateError)) throw new Error('Non-error thrown', { cause: err })
if (err instanceof SiteupAggregateError) {
if (err?.results?.siteData?.pages) {
console.log(tree(generateTreeData(cwd, src, dest, err.results)))
}
}
if ('results' in err) delete err.results
console.error(inspect(err, { depth: 999, colors: true }))

if (err.errors) {
console.error(inspect(err.errors, { depth: 5, colors: true }))
}

console.log('\nBuild Failed!\n\n')
}
} else {
// TODO: handle watch data event or something... maybe like a async iterator?
const initialResults = await siteup.watch()
console.log(initialResults)
}
}

function generateTreeData (cwd, src, dest, results) {
const cwdDir = basename(cwd)
const srcDir = basename(relative(cwd, src))
const destDir = basename(relative(cwd, dest))

const treeStructure = {
label: `${join(cwdDir, srcDir)} => ${join(cwdDir, destDir)}`,
leaf: {
globalStyle: results?.siteData?.globalStyle?.outputRelname,
globalClient: results?.siteData?.outputMaps?.outputRelname,
globalVars: results?.siteData?.globalVars?.basename,
rootLayout: results?.siteData?.rootLayout?.basename
},
nodes: []
}

for (const page of results?.siteData?.pages) {
const segments = page.page.relname.split(sep)
segments.pop()

let nodes = treeStructure.nodes
let targetNode = treeStructure

for (const segment of segments) {
targetNode = nodes.find(node => segment === node.label)
if (!targetNode) {
targetNode = { label: segment, leaf: {}, nodes: [] }
nodes.push(targetNode)
}
nodes = targetNode.nodes
console.log(tree(generateTreeData(cwd, src, dest, initialResults)))
if (initialResults?.warnings?.length > 0) {
console.log(
'\nThere were build warnings:\n'
)
}

targetNode.leaf[page.page.basename] = join(page.path, page.outputName)
if (page.pageStyle) targetNode.leaf[page.pageStyle.basename] = join(page.path, page.pageStyle.outputName ?? page.pageStyle.basename)
if (page.clientBundle) targetNode.leaf[page.clientBundle.basename] = join(page.path, page.clientBundle.outputName ?? page.clientBundle.basename)
if (page.pageVars) targetNode.leaf[page.pageVars.basename] = join(page.path, page.pageVars.basename)
}

for (const file of results?.static?.report?.copied) {
const srcFile = relative(srcDir, file.source)
const destFile = relative(destDir, file.output)
const segments = srcFile.split(sep)
segments.pop()

let nodes = treeStructure.nodes
let targetNode = treeStructure

for (const segment of segments) {
targetNode = nodes.find(node => segment === node.label)
if (!targetNode) {
targetNode = { label: segment, leaf: {}, nodes: [] }
nodes.push(targetNode)
for (const warning of initialResults?.warnings) {
if ('message' in warning) {
console.log(` ${warning.message}`)
} else {
console.warn(warning)
}
nodes = targetNode.nodes
}

targetNode.leaf[basename(srcFile)] = destFile
}

return cleanDeep(treeStructure)
}

run().catch(err => {
Expand Down
13 changes: 13 additions & 0 deletions declaration.tsconfig.json
@@ -0,0 +1,13 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"declaration": true,
"declarationMap": true,
"noEmit": false,
"emitDeclarationOnly": true
},
"exclude": [
"**/*.test.js",
"test-cases/**/*",
]
}
1,173 changes: 1,172 additions & 1 deletion dependencygraph.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions examples/nested-dest/package.json
@@ -1,11 +1,11 @@
{
"name": "default-layout",
"name": "nested-dest",
"version": "0.0.0",
"description": "",
"type": "module",
"scripts": {
"start": "npm run watch",
"build": "npm run clean && siteup",
"build": "npm run clean && siteup --src . --ignore ignore",
"clean": "rm -rf public && mkdir -p public",
"watch": "npm run clean && run-p watch:*",
"watch:serve": "browser-sync start --server 'public' --files 'public'",
Expand Down

0 comments on commit 6259608

Please sign in to comment.