diff --git a/bin/webstatus-manifest-generator.js b/bin/webstatus-manifest-generator.js index d338738..db937ea 100755 --- a/bin/webstatus-manifest-generator.js +++ b/bin/webstatus-manifest-generator.js @@ -1,104 +1,134 @@ #!/usr/bin/env node -'use strict'; +"use strict"; -const figlet = require('figlet'); -const chalk = require('chalk'); -const fs = require('fs'); +const figlet = require("figlet"); +const chalk = require("chalk"); +const fs = require("fs"); +const find = require("find"); +const pkg = require("../package.json"); + +const warnSymbol = "⚠️"; +const headExplode = "🤯"; +const rightArrow = "➡️"; function recFindByExt(base, ext, files, result) { - files = files || fs.readdirSync(base) - result = result || [] + files = files || fs.readdirSync(base); + result = result || []; - files.forEach( - function (file) { - var newbase = path.join(base,file) - if ( fs.statSync(newbase).isDirectory() ) { - result = recFindByExt(newbase,ext,fs.readdirSync(newbase),result) - } else { - if ( file.substr(-1*(ext.length+1)) == '.' + ext ) { - result.push(newbase) - } + files.forEach(function(file) { + var newbase = path.join(base, file); + if (fs.statSync(newbase).isDirectory()) { + result = recFindByExt( + newbase, + ext, + fs.readdirSync(newbase), + result + ); + } else { + if (file.substr(-1 * (ext.length + 1)) == "." + ext) { + result.push(newbase); } } - ) - return result + }); + return result; } function pprint(obj) { - console.log("%o", obj) + console.log("%o", obj); } -function outputManifest (path, fileList) { - if(!fileList) { - l = [] +function outputManifest(path, fileList) { + if (!fileList) { + l = []; } const output = { - version: 1, - '$id': 'berlin.sneak.ns.webstatus.manifest-v1', + $id: "berlin.sneak.ns.webstatus.manifest-v1", manifest: fileList - } - fs.writeFileSync(path + ".tmp", JSON.stringify(output)) - fs.renameSync(path + ".tmp", path) + }; + fs.writeFileSync(path + ".tmp", JSON.stringify(output)); + fs.renameSync(path + ".tmp", path); } function main() { - const commander = require('commander'); + const commander = require("commander"); const program = new commander.Command(); - program.version('0.0.1', '-v --version', 'output current version'); + program.version(pkg.version, "-v --version", "output current version"); program - .option('-s --source ', 'directory to scan/write', '.') - .option('-v --verbose', 'verbose output', false) - .option('-q --quiet', 'no output', false) + .option("-s --source ", "directory to scan/write", ".") + .option("-v --verbose", "verbose output", false) + .option("-q --quiet", "no output", false); program.parse(process.argv); - const print = (x) => { - if(program.quiet) { - return + const print = x => { + if (program.quiet) { + return; } - console.log(x) - } + console.log(x); + }; - const log = {} + const log = {}; - log.info = (x) => { - print(chalk.blue(x)) - } + log.info = x => { + print(rightArrow + chalk.blue(" " + x)); + }; - log.die = (x) => { - print(chalk.bold.red('error: ' + x)) - print(chalk.bold.red('exiting.')) - process.exit(-1) - } + log.die = x => { + print(warnSymbol + chalk.bold.red(" " + x)); + print(headExplode); + process.exit(-1); + }; - log.huge = (x) => { + log.huge = x => { var f = figlet.textSync(x, { - font: 'Red Phoenix', - horizontalLayout: 'default', - verticalLayout: 'default' - }) - print(chalk.red(f)) - } + font: "Red Phoenix", + horizontalLayout: "default", + verticalLayout: "default" + }); + print(chalk.red(f)); + }; - log.huge('webstatus') + log.huge("webstatus"); //const dir = program.source //pprint(program) - if(!fs.lstatSync(program.source).isDirectory()) { - log.die(`${program.source} is not a directory`) + if (!fs.lstatSync(program.source).isDirectory()) { + log.die(`${program.source} is not a directory`); } else { - log.info(`scanning ${program.source} for images...`) + process.chdir(program.source); + program.source = process.cwd(); + log.info(`scanning ${program.source} for images...`); } - var fileList = [] - var manifestFilename = program.source + '/webstatus.manifest.json' + var fileList = []; + var manifestFilename = program.source + "/webstatus.manifest.json"; - //FIXME scan for files - // - log.info(`writing ${fileList.length} entries to manifest ${manifestFilename}`) - outputManifest(manifestFilename, fileList) + const matchRE = /\.(png|gif|jpg|jpeg|webp)$/i; - log.die("unimplemented") + var candidateList = find.fileSync(matchRE, program.source); + + candidateList.forEach(fn => { + var stat = fs.statSync(fn); + var prefix = new RegExp("^" + program.source + "/"); + fn = fn.replace(prefix, ""); + fileList.push({ + // FIXME read image size from files so that + // renderer can scale them more intelligently + $id: "berlin.sneak.ns.webstatus.fileitem-v1", + path: fn, + mtime: stat.mtime + }); + }); + log.info( + `writing ${fileList.length} entries to manifest ${manifestFilename}` + ); + try { + outputManifest(manifestFilename, fileList); + } catch (err) { + program.quiet = false; + log.die(`unable to write manifest: ${err}`); + } + log.info("success"); } main(); diff --git a/package.json b/package.json index fdf1edb..df5443b 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,49 @@ { - "name": "@sneak.berlin/webstatus", - "version": "1.0.0", - "description": "webstatus app for displaying a directory of images", - "main": "index.js", - "bin": { - "webstatus-manifest-generator": "./bin/webstatus-manifest-generator.js" - }, - "dependencies": { - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "chalk": "^3.0.0", - "figlet": "^1.3.0", - "find": "^0.3.0", - "prettier": "^1.19.1", - "react": "^16.13.0", - "react-dom": "^16.13.0", - "react-scripts": "3.4.0" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject", - "fmt": "prettier -- --write bin/**/*.js src/**/*.js package.json" - }, - "eslintConfig": { - "extends": "react-app" - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "repository": { - "type": "git", - "url": "https://git.eeqj.de/sneak/webstatus.git" - }, - "author": "sneak ", - "license": "WTFPL" + "name": "@sneak.berlin/webstatus", + "version": "1.0.0", + "description": "webstatus app for displaying a directory of images", + "main": "index.js", + "bin": { + "webstatus-manifest-generator": "./bin/webstatus-manifest-generator.js" + }, + "dependencies": { + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "chalk": "^3.0.0", + "figlet": "^1.3.0", + "find": "^0.3.0", + "prettier": "^1.19.1", + "react": "^16.13.0", + "react-dom": "^16.13.0", + "react-scripts": "3.4.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject", + "fmt": "prettier --write --tab-width 4 -- bin/**/*.js src/**/*.js package.json" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "repository": { + "type": "git", + "url": "https://git.eeqj.de/sneak/webstatus.git" + }, + "author": "sneak ", + "license": "WTFPL" } diff --git a/src/WebStatus.js b/src/WebStatus.js index 1da0c4c..57be168 100644 --- a/src/WebStatus.js +++ b/src/WebStatus.js @@ -1,25 +1,22 @@ -import React from 'react'; +import React from "react"; //import logo from './logo.svg'; -import './WebStatus.css'; +import "./WebStatus.css"; class WebStatusImage extends React.Component { render() { - return ( - - ) + return ; } } class WebStatus extends React.Component { render() { - - const currentImageUrl = "http://placekitten.com/3840/2160" + const currentImageUrl = "http://placekitten.com/3840/2160"; return (
- ) + ); } } diff --git a/src/index.js b/src/index.js index edd75d4..1c21908 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import './index.css'; -import WebStatus from './WebStatus'; +import React from "react"; +import ReactDOM from "react-dom"; +import "./index.css"; +import WebStatus from "./WebStatus"; -ReactDOM.render(, document.getElementById('root')); +ReactDOM.render(, document.getElementById("root")); diff --git a/src/setupTests.js b/src/setupTests.js index 74b1a27..5fdf001 100644 --- a/src/setupTests.js +++ b/src/setupTests.js @@ -2,4 +2,4 @@ // allows you to do things like: // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom/extend-expect'; +import "@testing-library/jest-dom/extend-expect";