diff --git a/.woodpecker.yml b/.woodpecker.yml
index 5664fb3..ae600e4 100644
--- a/.woodpecker.yml
+++ b/.woodpecker.yml
@@ -1,7 +1,8 @@
pipeline:
build:
- image: node:18-slim
+ image: node:18-alpine
commands:
+ - apk add --no-cache git
- npm ci
- npm run build
prepare_release:
diff --git a/esbuildconf.js b/esbuildconf.js
index 43e48a8..cf725e5 100644
--- a/esbuildconf.js
+++ b/esbuildconf.js
@@ -3,12 +3,15 @@ import { createRequire } from 'module';
import alias from 'esbuild-plugin-alias';
import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill';
+import { replaceOnCopyPlugin } from './tools/esbuild-helper.js'
+
// see docs at https://esbuild.github.io/api/
export const options = {
entryPoints: [
'src/main.js',
'src/main.css',
'src/index.html',
+ 'src/about.html',
'src/assets/bubble.svg',
'src/assets/comment.svg',
'src/assets/heart-fill.svg',
@@ -32,7 +35,8 @@ export const options = {
// cipher-base require's "stream"
stream: createRequire(import.meta.url).resolve('readable-stream')
}),
- NodeGlobalsPolyfillPlugin({buffer: true})
+ NodeGlobalsPolyfillPlugin({buffer: true}),
+ replaceOnCopyPlugin(/about\.html$/),
]
};
diff --git a/src/about.html b/src/about.html
new file mode 100644
index 0000000..e4710f5
--- /dev/null
+++ b/src/about.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+ about / nostr
+
+
+
+
+ this is a nostr web client.
+ source code is at git.qcode.ch/nostr/nostrweb.
+
+ you are looking at version #[PKG_VERSION]#, built at git commit
+ #[GIT_COMMIT]#.
+
+
+
+
diff --git a/src/main.css b/src/main.css
index 5ba113b..3a45e30 100644
--- a/src/main.css
+++ b/src/main.css
@@ -83,6 +83,10 @@ time {
font-size: var(--font-small);
}
+main.text {
+ margin: 2rem;
+}
+
.danger {
background-color: var(--bgcolor-danger);
}
diff --git a/tools/esbuild-helper.js b/tools/esbuild-helper.js
new file mode 100644
index 0000000..6e00f53
--- /dev/null
+++ b/tools/esbuild-helper.js
@@ -0,0 +1,47 @@
+import { readFile } from 'node:fs/promises';
+import { spawn } from 'node:child_process';
+
+/**
+ * gitRevParse spawns a git rev-parse command and reports its stdout
+ * in a resolved promise or a rejected error on completion,
+ * depending on the exit code.
+ */
+const gitRevParse = (rev) => new Promise((resolve, reject) => {
+ let commit = '', err = '';
+ const proc = spawn('git', ['rev-parse', '--short', rev]);
+ proc.stdout.on('data', (data) => commit += data.toString().trim());
+ proc.stderr.on('data', (data) => err += err.toString());
+ proc.on('close', (code) => code === 0 ? resolve(commit) : reject(err));
+});
+
+/**
+ * replaceOnCopyPlugin is an esbuild plugin. it loads files as utf-8 text
+ * and replaces certain placeholders with their values computed on plugin setup.
+ * the fileFilter is a regexp matching names or extensions of the files to process,
+ * passed to esbuild's onLoad as is.
+ *
+ * the following placeholders are replaced:
+ *
+ * #[PKG_VERSION]# -> npm package version
+ * #[GIT_COMMIT]# -> short git commit at current HEAD
+ */
+export const replaceOnCopyPlugin = (fileFilter) => {
+ return {
+ name: 'replace-on-copy',
+ setup(build) {
+ const appVersion = process.env.npm_package_version;
+ const gitHeadCommit = gitRevParse('HEAD');
+
+ build.onLoad({filter: fileFilter}, async (args) => {
+ const gitCommitHash = await gitHeadCommit;
+ let text = await readFile(args.path, 'utf8');
+ text = text.replaceAll('#[PKG_VERSION]#', appVersion);
+ text = text.replaceAll('#[GIT_COMMIT]#', gitCommitHash);
+ return {
+ contents: text,
+ loader: 'copy',
+ }
+ });
+ }
+ }
+}