first commit
This commit is contained in:
commit
320bb65533
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
94
default.nix
Normal file
94
default.nix
Normal 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
22
package.json
Normal 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
4947
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
64
webpack.config.js
Normal file
64
webpack.config.js
Normal 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',
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user