瀏覽代碼

Refactor: dir listing to glob for infiles

Craig Fletcher 5 月之前
父節點
當前提交
995d621c06
共有 6 個文件被更改,包括 739 次插入71 次删除
  1. 678 40
      package-lock.json
  2. 1 0
      package.json
  3. 15 19
      src/defaults.js
  4. 13 11
      src/lib.js
  5. 0 1
      src/processors.js
  6. 32 0
      src/util.js

File diff suppressed because it is too large
+ 678 - 40
package-lock.json


+ 1 - 0
package.json

@@ -22,6 +22,7 @@
   "type": "module",
   "dependencies": {
     "favicons": "^7.2.0",
+    "glob": "^11.0.3",
     "gray-matter": "^4.0.3",
     "handlebars": "^4.7.8",
     "html-minifier-terser": "^7.2.0",

+ 15 - 19
src/defaults.js

@@ -9,51 +9,47 @@ import {
 
 export const tasks = [
   {
-    inputDirs: ["styles/"],
-    inputFileExtension: ".scss",
     name: "styles",
+    inputFiles: [{ pattern: "styles/**/*.scss" }],
+    stripPaths: ["styles/"],
     outputDir: "static/styles/",
     outputFileExtension: ".css",
     processor: compileSass
   },
   {
-    inputDirs: ["images/icons/"],
-    inputFileExtension: ".svg",
     name: "icons",
-    outputDir: "static/icons/",
+    inputFiles: [{ pattern: "images/icons/*.svg" }],
+    stripPaths: ["images/"],
+    outputDir: "static/",
     outputFileExtension: ".svg",
     processor: optimiseSvg
   },
   {
-    inputDirs: ["images/content/"],
-    inputFileExtension: ".jpg",
     name: "images",
-    outputDir: "static/images/",
+    inputFiles: [{ pattern: "images/content/*.jpg" }],
+    stripPaths: ["images/content/"],
+    outputDir: "images/",
     outputFileExtension: ".webp",
     processor: optimiseImage
   },
   {
-    inputDirs: ["images/favicon/"],
-    inputFileExtension: "",
     name: "favicons",
+    inputFiles: [{ pattern: "images/favicon/*" }],
+    stripPaths: ["images/favicon/"],
     outputDir: "static/meta/",
-    outputFileExtension: "",
     processor: generateFavicons
   },
   {
-    inputDirs: ["markdown/"],
-    inputFileExtension: ".md",
     name: "pages",
-    outputDir: "./",
+    inputFiles: [{ pattern: "markdown/*.md" }],
+    stripPaths: ["markdown/"],
     outputFileExtension: ".html",
     processor: renderMarkdownWithTemplate
   },
   {
-    inputDirs: ["static/"],
-    inputFileExtension: "",
     name: "static files",
-    outputDir: "",
-    outputFileExtension: "",
+    inputFiles: [{ pattern: "static/*" }],
+    stripPaths: ["static/"],
     processor: copy
   }
 ];
@@ -63,7 +59,7 @@ export const opts = {
   runDir: process.cwd(),
   defaultTemplate: "default",
   include: {
-    styles: ["~/.rhedyn/styles/"]
+    styles: [{ pattern: "~/.rhedyn/styles/*.scss" }]
   },
   templateDirs: ["templates/", "~/.rhedyn/templates/"],
   site: {

+ 13 - 11
src/lib.js

@@ -1,7 +1,8 @@
 import {
-  readDirectoryRecursively,
+  readFilesByGlob,
   removeBasePaths,
-  resolvePath
+  resolvePath,
+  replaceFileExtension
 } from "./util.js";
 import fs from "fs";
 import { writeFile } from "node:fs/promises";
@@ -25,27 +26,27 @@ export async function getConfig() {
 
 export async function processFiles(config, meta) {
   const includes = meta.opts?.include?.[config.name] || [];
-  const pathsToInclude = [...config.inputDirs, ...includes].map(resolvePath);
-  const filesToProcess = pathsToInclude
-    .map(dirPath => {
-      return readDirectoryRecursively(dirPath);
-    })
-    .flat();
+  const patternsToInclude = [...config.inputFiles, ...includes];
+  const filesToProcess = await readFilesByGlob(patternsToInclude);
+  const pathsToStrip = config.stripPaths || [];
+  const outputDir = config.outputDir || "";
 
   return await Promise.all(
     filesToProcess.map(async filePath => {
       const fileOutputPath = path.join(
         meta.opts.baseDir,
-        config.outputDir,
-        removeBasePaths(pathsToInclude, filePath).replace(
-          config.inputFileExtension,
+        outputDir,
+        replaceFileExtension(
+          removeBasePaths(pathsToStrip, filePath),
           config.outputFileExtension
         )
       );
+
       if (meta.opts.debug) {
         console.log("in filePath", filePath);
         console.log("out fileOutputPath", fileOutputPath);
       }
+
       const fileOutputDir = path.dirname(fileOutputPath);
       if (!fs.existsSync(fileOutputDir)) {
         fs.mkdirSync(fileOutputDir, { recursive: true });
@@ -57,6 +58,7 @@ export async function processFiles(config, meta) {
         fileOutputDir,
         fileOutputPath
       );
+
       if (!written) {
         await writeFile(fileOutputPath, result);
       }

+ 0 - 1
src/processors.js

@@ -95,7 +95,6 @@ export async function renderMarkdownWithTemplate(
     href,
     content: renderer(markdown)
   });
-  console.log("====>", data, meta, href);
   const minifiedHtml = await minify(html, {
     collapseWhitespace: true,
     removeComments: true,

+ 32 - 0
src/util.js

@@ -1,6 +1,7 @@
 import fs from "fs";
 import os from "node:os";
 import path from "path";
+import { glob } from "glob";
 
 export function readDirectoryRecursively(dir, files = []) {
   if (!fs.existsSync(dir)) {
@@ -17,6 +18,30 @@ export function readDirectoryRecursively(dir, files = []) {
   }
   return files;
 }
+// type InputConfig
+// {
+//  pattern: String | String[];
+//  ignore:  String | String[];
+// }
+export async function readFilesByGlob(globConfigs) {
+  const matchPromises = globConfigs.reduce(
+    async (existingMatches, globConfig) => {
+      const { pattern, ignore, dot } = {
+        dot: false,
+        ignore: [],
+        ...globConfig
+      };
+      const matches = await glob(pattern, {
+        ignore,
+        dot
+      });
+      return [...(await existingMatches), ...matches];
+    },
+    []
+  );
+  const files = await matchPromises;
+  return [...new Set(files)];
+}
 
 export function resolvePath(unresolvedPath) {
   return path.resolve(unresolvedPath.replace(/^~/, os.homedir()));
@@ -38,6 +63,13 @@ export function removeBasePaths(baseDirs, fullPath) {
   }, fullPath);
 }
 
+export function replaceFileExtension(filePath, newExtension) {
+  if (!newExtension) {
+    return filePath;
+  }
+  return `${stripFileExtension(filePath)}${newExtension}`;
+}
+
 export function stripFileExtension(filePath) {
   return path.join(
     path.dirname(filePath),

Some files were not shown because too many files changed in this diff