1.0.10 • Published 8 months ago

webpack-add-simple-singlespa-buildinfo v1.0.10

Weekly downloads
-
License
GNU
Repository
github
Last release
8 months ago

webpack-add-simple-singlespa-buildinfo

Adds one line in top of output file build with webpack (target single-spa) with name, version and time and file hash. (Only update / add if file hash has changed)

Very simple build-info plugin.

Install

npm i webpack-add-simple-singlespa-buildinfo

Usage

var AddSimpleSingleSpaBuildInfo = require("webpack-add-simple-singlespa-buildinfo")

Webpack config:

    plugins: [
      new AddSimpleSingleSpaBuildInfo(/*{ override options if needed... }*/)
    ],

Options (default):

options = {
  getPath: () => {
    let caller = module.parent.filename
    let dir = path.dirname(caller)
    return dir
  },
  getPackageJson: () => {
    let dir = this.options.getPath()
    let packageJsonPath = path.join(dir, "package.json")
    let packageJson = readFileSync(packageJsonPath, "utf8")
    return JSON.parse(packageJson)
  },
  getName: (packageJson) => packageJson.name,
  getVersion: (packageJson) => packageJson.version,
  getTime: (packageJson) => new Date().toISOString(),
  getFileName: (packageName) => packageName.replace(/@/, "").replace(/[\\\/]/g, "-"),
  getFilePath: (packageFileName) => {
    let dir = this.options.getPath()
    return path.join(dir, "dist", `${packageFileName}.js`)
  },
  generateBuildInfo: ({ name, version, time, packageJson, base64Hash, content }) =>
    `//@build-info|${name}|${version}|${time}\n`,
  postBuild: (compilation) => {
        // Get the package.json file
      const packageJson = this.options.getPackageJson()
      // Get the name of the package
      const name = this.options.getName(packageJson)
      // Remove @ and '/' '\' (for organization packages)
      const fileName = this.options.getFileName(name)
      // Get the time of the build
      const time = this.options.getTime(packageJson)
      // Get the version of the package
      const version = this.options.getVersion(packageJson)
      // Format file name matching single-spa build : dist/org-name-project-name.js
      const filePath = this.options.getFilePath(fileName)
      // Create a hash of the file
      const hashSum = crypto.createHash("sha256")
      const base64Hash = hashSum.digest("base64")
      // load the file
      let content = readFileSync(filePath, "utf8")
      // test if first line is build info and it it's hash is the same as the current hash
      if (content.indexOf("//@build-info|") === 0 && content.indexOf(base64Hash) !== -1) {
        // No update!
      } else {
        // remove the build info if it exists
        if (content.indexOf("//@build-info|") === 0) {
          content = content.replace(/\/\/@build-info\|.*\n/, "")
        }
        // Generate the build info and add to top of file
        content = this.options.generateBuildInfo({ name, version, time, packageJson, base64Hash, content }) + content
        // Write the file
        writeFileSync(filePath, content)
      }
  },
}

Details

The postBuild options is the entire plugin!

This is just a simple hook into post build, to add build info to the output file.

1.0.9

8 months ago

1.0.8

9 months ago

1.0.7

9 months ago

1.0.6

9 months ago

1.0.5

9 months ago

1.0.10

8 months ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago