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