keycloak-express-middleware 6.3.1 → 6.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [6.3.2] - 2026-03-18
6
+
7
+ ### Added
8
+ - Automatic test config bootstrap via `test/helpers/ensure-test-config.js`.
9
+ - `npm run setup-keycloak` now ensures missing test config files are recreated before interactive setup:
10
+ - `test/config/secrets.json`
11
+ - `test/docker-keycloak/.env`
12
+
13
+ ### Changed
14
+ - npm package `files` whitelist keeps `test/` assets available on install while excluding sensitive/generated files (`test/config/secrets.json`, `test/docker-keycloak/.env`, local cert files).
15
+
5
16
  ## [6.3.1] - 2026-03-18
6
17
 
7
18
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keycloak-express-middleware",
3
- "version": "6.3.1",
3
+ "version": "6.3.2",
4
4
  "description": "Adapter API to integrate Node.js (Express) applications with Keycloak. Provides middleware for authentication, authorization, token validation, and route protection via OpenID Connect.",
5
5
  "main": "index.js",
6
6
  "typings": "index.d.ts",
@@ -26,14 +26,20 @@
26
26
  "test/*.test.js",
27
27
  "test/package.json",
28
28
  "test/package-lock.json",
29
- "test/config/**",
29
+ "test/config/default.json",
30
+ "test/config/secrets.json.example",
30
31
  "test/helpers/**",
31
32
  "test/support/**",
32
- "test/docker-keycloak/**"
33
+ "test/docker-keycloak/README.md",
34
+ "test/docker-keycloak/docker-compose.yml",
35
+ "test/docker-keycloak/docker-compose-https.yml",
36
+ "test/docker-keycloak/setup-keycloak.js",
37
+ "test/docker-keycloak/certs/README.md",
38
+ "test/docker-keycloak/certs/.gitkeep"
33
39
  ],
34
40
  "scripts": {
35
- "test": "npm --prefix test install && npm --prefix test run setup-keycloak && NODE_PATH=./test/node_modules npm --prefix test test",
36
- "setup-keycloak": "eval \"$(ssh-agent -s)\" && ssh-add ~/.ssh/id_ed25519 && NODE_ENV=test node test/docker-keycloak/setup-keycloak.js"
41
+ "test": "node test/helpers/ensure-test-config.js && npm --prefix test install && npm --prefix test run setup-keycloak && NODE_PATH=./test/node_modules npm --prefix test test",
42
+ "setup-keycloak": "node test/helpers/ensure-test-config.js && eval \"$(ssh-agent -s)\" && ssh-add ~/.ssh/id_ed25519 && NODE_ENV=test node test/docker-keycloak/setup-keycloak.js"
37
43
  },
38
44
  "dependencies": {
39
45
  "express-session": "^1.19.0",
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Ensures local test configuration files exist with valid defaults.
5
+ *
6
+ * Generated files (if missing):
7
+ * - test/config/secrets.json
8
+ * - test/docker-keycloak/.env
9
+ *
10
+ * Usage:
11
+ * node test/helpers/ensure-test-config.js
12
+ * node test/helpers/ensure-test-config.js --regenerate
13
+ */
14
+
15
+ const fs = require('fs');
16
+ const path = require('path');
17
+
18
+ const force = process.argv.includes('--regenerate');
19
+
20
+ const repoRoot = path.join(__dirname, '..', '..');
21
+ const secretsPath = path.join(repoRoot, 'test', 'config', 'secrets.json');
22
+ const dockerEnvPath = path.join(repoRoot, 'test', 'docker-keycloak', '.env');
23
+
24
+ function ensureDir(filePath) {
25
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
26
+ }
27
+
28
+ function readJsonSafe(filePath) {
29
+ try {
30
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
31
+ } catch (_err) {
32
+ return null;
33
+ }
34
+ }
35
+
36
+ function writeJson(filePath, data) {
37
+ ensureDir(filePath);
38
+ fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf8');
39
+ }
40
+
41
+ function ensureSecrets() {
42
+ const defaults = {
43
+ test: {
44
+ keycloak: {
45
+ adminPassword: 'admin',
46
+ clientSecret: 'test-client-secret',
47
+ testPassword: 'test-password'
48
+ }
49
+ }
50
+ };
51
+
52
+ if (!fs.existsSync(secretsPath) || force) {
53
+ writeJson(secretsPath, defaults);
54
+ console.log(`[ensure-test-config] ${force ? 'Regenerated' : 'Created'} test/config/secrets.json`);
55
+ return;
56
+ }
57
+
58
+ const current = readJsonSafe(secretsPath);
59
+ if (!current) {
60
+ writeJson(secretsPath, defaults);
61
+ console.log('[ensure-test-config] Repaired invalid test/config/secrets.json');
62
+ return;
63
+ }
64
+
65
+ const merged = {
66
+ ...current,
67
+ test: {
68
+ ...(current.test || {}),
69
+ keycloak: {
70
+ ...defaults.test.keycloak,
71
+ ...((current.test && current.test.keycloak) || {})
72
+ }
73
+ }
74
+ };
75
+
76
+ // Update only if required keys are missing.
77
+ const currentString = JSON.stringify(current);
78
+ const mergedString = JSON.stringify(merged);
79
+ if (currentString !== mergedString) {
80
+ writeJson(secretsPath, merged);
81
+ console.log('[ensure-test-config] Added missing keys in test/config/secrets.json');
82
+ } else {
83
+ console.log('[ensure-test-config] test/config/secrets.json already valid');
84
+ }
85
+ }
86
+
87
+ function ensureDockerEnv() {
88
+ const content = [
89
+ 'KEYCLOAK_CERT_PATH=./certs',
90
+ 'KEYCLOAK_HOSTNAME=localhost'
91
+ ].join('\n') + '\n';
92
+
93
+ if (!fs.existsSync(dockerEnvPath) || force) {
94
+ ensureDir(dockerEnvPath);
95
+ fs.writeFileSync(dockerEnvPath, content, 'utf8');
96
+ console.log(`[ensure-test-config] ${force ? 'Regenerated' : 'Created'} test/docker-keycloak/.env`);
97
+ return;
98
+ }
99
+
100
+ const existing = fs.readFileSync(dockerEnvPath, 'utf8');
101
+ if (!existing.includes('KEYCLOAK_CERT_PATH=') || !existing.includes('KEYCLOAK_HOSTNAME=')) {
102
+ fs.writeFileSync(dockerEnvPath, content, 'utf8');
103
+ console.log('[ensure-test-config] Repaired test/docker-keycloak/.env');
104
+ } else {
105
+ console.log('[ensure-test-config] test/docker-keycloak/.env already valid');
106
+ }
107
+ }
108
+
109
+ function main() {
110
+ ensureSecrets();
111
+ ensureDockerEnv();
112
+ }
113
+
114
+ main();
@@ -1,9 +0,0 @@
1
- {
2
- "test": {
3
- "keycloak": {
4
- "adminPassword": "admin",
5
- "clientSecret": "test-client-secret",
6
- "testPassword": "test-password"
7
- }
8
- }
9
- }
@@ -1,2 +0,0 @@
1
- KEYCLOAK_CERT_PATH=./certs
2
- KEYCLOAK_HOSTNAME=smart-dell-sml.crs4.it