1.0.1 • Published 7 months ago

@im-bravo/posthtml-versioning-path v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
7 months ago

posthtml-versioning-path

NPM

posthtml-versioning-path is a PostHTML plugin for hashing file names to enable caching.

<html>
  <head>
-   <link rel="stylesheet" href="/[versioning_path]/styles.css" />
+   <link rel="stylesheet" href="/20231013220934001/styles.css" />
  </head>
  <body>
-   <script src="/[versioning_path]/src.js"></script>
+   <script src="/20231013220934001/src.js"></script>
  </body>
</html>

Install

# npm
npm i -D @im-bravo/posthtml-versioning-path

Usage

By default, the plugin will attempt to hash file names that contain [versioning_path]. As an additional qualifier, only nodes containing href, src, or content attributes are eligible.

<html>
  <head>
    <!-- ✅ versioned -->
    <link rel="stylesheet" href="/[versioning_path]/styles.css" />

    <!-- ❌ not versioned -->
    <link rel="stylesheet" href="reset.css" />
  </head>
  <body>
    <!-- ✅ versioned -->
    <script src="/[versioning_path]/src.js"></script>

    <!-- ❌ not versioned -->
    <script src="analytics.js"></script>
  </body>
</html>
const fs = require("fs");
const posthtml = require("posthtml");
const { versioningPath } = require("posthtml-versioning-path");
const html = fs.readFileSync("./processed/index.html");

function yourOwnVersioningLogic() {
  const now = new Date()
  const year = now.getFullYear();
  const month = String(now.getMonth() + 1).padStart(2, '0');
  const day = String(now.getDate()).padStart(2, '0');
  const hours = String(now.getHours()).padStart(2, '0');
  const minutes = String(now.getMinutes()).padStart(2, '0');
  const seconds = String(now.getSeconds()).padStart(2, '0');

  return `${year}${month}${day}${hours}${minutes}${seconds}`;
}

posthtml()
  .use(
    versioningPath({
      path: "processed",
      transformPath: (filepath) => {
        return filepath
          .replace("https://example.com/", "") // 
          .replace("[versioning_path]/", "")
      },
      versioningPath: ( ) => {
        const versionPath = yourOwnVersioningLogic()
        return versionPath
      }
    })
  )
  .process(html)
  .then((result) => fs.writeFileSync("./processed/index.html", result.html));

For convenience, you can add the post-build script to your package.json. The postbuild script is automatically invoked following the build script.

{
  "scripts": {
    "build": "rollup -c",
    "postbuild": "node postbuild.js"
  }
}