Decrypt assets with webpack
If your public repository includes files you can't share with the world, one solution is to encrypt them. Decryption-loader allows you to encrypt assets via CLI and decrypt them at build-time right in webpack.
npm install decryption-loader
npx decryption-loader example.txt
You will be prompted for a password and an encrypted file example.txt.enc is created.
webpack.config.js
module.exports = { // ... module: { rules: [ { test: /\.enc$/, loader: "decryption-loader", options: { password: "password", }, }, ], }, // ... };
Be careful: Your webpack configuration file is probably not a safe place to keep passwords.
password(string) required: The password used to derive the encryption key
Say you have font.woff, a commercial font that you want to include in your public repository, but can't because of licensing issues. Let's encrypt it to solve this problem:
npx decryption-loader font.woff
We need a save place to store the password. We'll put it in the environment variable PASSWORD. We can use dotenv to set the variable in the context of our local repo:
npm install dotenv
.env
PASSWORD=password
Be sure to add the unencrypted font file and .env to your .gitignore to keep them out of the public repo:
.gitignore
font.woff .env
Now we have to decrypt the font at build time using webpack:
webpack.config.js
/* Read variables from .env If actual environment variables are set the values in .env are ignored */ require("dotenv").config(); module.exports = { // ... module: { rules: [ { test: /\.(enc)$/, use: [ { loader: "file-loader", // Not including [ext] strips the .cast5 extension from the filename options: { name: "[name]" }, }, { loader: "decryption-loader", options: { password: process.env.PASSWORD }, }, ], }, ], }, // ... };
And we're done. The encrypted file is now decrypted and then processed by file-loader as font.woff. You can reference the encrypted file font.woff.enc in your CSS like a normal font file.