first commit

This commit is contained in:
notgne2 2019-12-12 01:25:34 -07:00
commit 320bb65533
5 changed files with 5128 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules/

94
default.nix Normal file
View File

@ -0,0 +1,94 @@
{ pkgs, google-chrome, symlinkJoin, stdenv, elmPackages, ... }:
let
pnpm2nix = pkgs.callPackage (builtins.fetchGit {
url = "https://github.com/notgne2/pnpm2nix.git";
rev = "21e7f567485d5095343d5c397638e4dbeca0b4a4";
}) {};
nodeCleanSourceFilter = name: type: pkgs.lib.cleanSourceFilter name type &&
((baseNameOf name) != "node_modules");
nodeCleanSource = src: pkgs.lib.cleanSourceWith { filter = nodeCleanSourceFilter; inherit src; };
elmCleanSourceFilter = name: type: nodeCleanSourceFilter name type &&
((baseNameOf name) != "elm-stuff" && (baseNameOf name) != "dist");
elmCleanSource = src: pkgs.lib.cleanSourceWith { filter = elmCleanSourceFilter; inherit src; };
scrapeNodeDeps = nodePkg:
let
nodeDeps = (builtins.filter (x: builtins.hasAttr "nodejs" x) nodePkg.buildInputs);
in
pkgs.lib.unique (nodeDeps ++ builtins.concatLists (map scrapeNodeDeps nodeDeps));
findNodeDep = nodePkg: name:
(builtins.elemAt 0 (builtins.filter (x: x.pname == name) (scrapeNodeDeps nodePkg)));
builderPkg = pnpm2nix.mkPnpmPackage {
name = "builder-node-packages";
packageJSON = ./package.json;
pnpmLock = ./pnpm-lock.yaml;
src = nodeCleanSource ./.;
overrides = pnpm2nix.defaultPnpmOverrides // {
puppeteer = (drv: drv.overrideAttrs(oldAttrs: {
preBuild = ''
# Define the local chromium directory
local_chromium=$HOME/node_modules/puppeteer/.local-chromium/linux-686378
# Make sure that directory exists
mkdir -p $local_chromium
# Link pkgs' standard google chrome into place
cp -r --no-preserve=mode,ownership ${google-chrome}/share/google/chrome $local_chromium/chrome-linux
cp ${google-chrome}/bin/google-chrome-stable $local_chromium/chrome-linux/chrome
chmod +x $local_chromium/chrome-linux/chrome
'';
}));
};
};
mkWandardFront = {
name,
src,
nodePackages ? null,
}:
let
nodeSource = symlinkJoin {
name = "${name}-node-sources";
paths = [
builderPkg.lib
] ++ (if nodePackages != null then [ nodePackages ] else [ ]);
};
in
stdenv.mkDerivation {
inherit name;
src = elmCleanSource src;
buildInputs = with elmPackages; [
elm
elm-format
nodeSource
];
patchPhase = ''
ln -sf ${nodeSource}/node_modules .
'';
shellHook = ''
ln -sf ${nodeSource}/node_modules .
'';
buildPhase = elmPackages.fetchElmDeps {
elmPackages = import (src + "/elm-srcs.nix");
versionsDat = src + "/versions.dat";
};
installPhase = ''
mkdir -p $out
${nodeSource}/node_modules/webpack-cli/bin/cli.js --mode production
ls dist
cp -r dist/* $out
'';
};
in
{
inherit mkWandardFront;
}

22
package.json Normal file
View File

@ -0,0 +1,22 @@
{
"dependencies": {
"copy-webpack-plugin": "^5.1.0",
"elm-webpack-loader": "^6.0.1",
"html-webpack-plugin": "^3.2.0",
"jsdom": "^15.2.1",
"prerender-spa-plugin": "^3.4.0",
"tempy": "^0.3.0",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10",
"workbox-webpack-plugin": "^4.3.1"
},
"name": "wandard-front-utils",
"version": "1.0.0",
"main": "src/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "notgne2",
"license": "AGPL-3.0",
"description": ""
}

4947
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

64
webpack.config.js Normal file
View File

@ -0,0 +1,64 @@
const ROUTES = ['/', '/about', '/404', '/posts', '/posts/viveahk', '/posts/librebasics']
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer
const CopyPlugin = require('copy-webpack-plugin')
const { InjectManifest } = require('workbox-webpack-plugin')
const { JSDOM } = require('jsdom')
const tempy = require('tempy')
const fs = require('fs')
const magicFile = (text) => {
const p = tempy.file()
fs.writeFileSync(p, text)
return p
}
// const magicAppend = (orig, text, sep = '\n') => magicFile(fs.readFileSync(orig) + sep + text)
module.exports =
{
module: {
rules: [{
test: /\.elm$/,
exclude: [/elm-stuff/, /node_modules/],
loader: 'elm-webpack-loader'
}],
},
plugins: [
new HtmlWebpackPlugin(),
new CopyPlugin([{ from: 'data', to: 'data' }]),
new PrerenderSPAPlugin({
staticDir: path.join(__dirname, 'dist'),
routes: ROUTES,
minify: {
minifyCSS: true,
minifyJS: true,
removeComments: true,
},
renderer: new Renderer(),
postProcess(renderedRoute) {
const dom = new JSDOM(renderedRoute.html, { runScripts: 'outside-only' })
dom.window.eval(`
const sourceTarget = document.createElement('script')
sourceTarget.src = '/main.js'
document.body.appendChild(sourceTarget)
`)
return {
...renderedRoute,
html: dom.serialize(),
}
},
}),
new InjectManifest({
importWorkboxFrom: 'local',
swSrc: magicFile(`
workbox.routing.registerNavigationRoute('/index.html');
workbox.precaching.precacheAndRoute(self.__precacheManifest);
`),
swDest: 'sw.js',
}),
]
}