diff --git a/packages/facade/cfg/config.json b/packages/facade/cfg/config.json index b98627a1..e49d5634 100644 --- a/packages/facade/cfg/config.json +++ b/packages/facade/cfg/config.json @@ -91,5 +91,12 @@ "maxFiles": 20 }, "endpoint": "os" + }, + "odic": { + "templates": { + "layout": "./node_modules/@restorecommerce/facade/templates/layout.hbs", + "login": "./node_modules/@restorecommerce/facade/templates/login.hbs", + "consent": "./node_modules/@restorecommerce/facade/templates/consent.hbs" + } } } diff --git a/packages/facade/cfg/config_test.json b/packages/facade/cfg/config_test.json new file mode 100644 index 00000000..a1b36a26 --- /dev/null +++ b/packages/facade/cfg/config_test.json @@ -0,0 +1,9 @@ +{ + "odic": { + "templates": { + "layout": "./templates/layout.hbs", + "login": "./templates/login.hbs", + "consent": "./templates/consent.hbs" + } + } +} \ No newline at end of file diff --git a/packages/facade/copy-hbs.sh b/packages/facade/copy-hbs.sh deleted file mode 100644 index 73346a1b..00000000 --- a/packages/facade/copy-hbs.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env sh - -set -ex - -find ./src -type f -name "*.hbs" | cut -d'/' -f3- | xargs -I{} dirname {} | xargs -I{} mkdir -p ./dist/{} -find ./src -type f -name "*.hbs" | cut -d'/' -f3- | xargs -I{} cp -u ./src/{} ./dist/{} diff --git a/packages/facade/package.json b/packages/facade/package.json index 00117c99..0320c5b3 100644 --- a/packages/facade/package.json +++ b/packages/facade/package.json @@ -103,7 +103,7 @@ "vitest": "^3.2.4" }, "scripts": { - "build": "npm-run-all build:clean generate build:compile build:codegen:clean build:codegen:compile copyhbs", + "build": "npm-run-all build:clean generate build:compile build:codegen:clean build:codegen:compile", "build:clean": "rimraf -rf ./dist", "build:compile": "tsc -p tsconfig.lib.json", "build:codegen:clean": "rimraf -rf ./codegen", @@ -117,7 +117,6 @@ "generate": "tsx --tsconfig tsconfig.generate.json generate.ts", "prepublishOnly": "npm run build", "debug-run": "tsx --tsconfig tsconfig.debug.json debug-run.ts", - "copyhbs": "sh copy-hbs.sh", "lint": "eslint './**/*.ts'" }, "publishConfig": { diff --git a/packages/facade/src/modules/identity/oidc/index.ts b/packages/facade/src/modules/identity/oidc/index.ts index 0a5396b1..c9c64e4c 100644 --- a/packages/facade/src/modules/identity/oidc/index.ts +++ b/packages/facade/src/modules/identity/oidc/index.ts @@ -1,5 +1,4 @@ import Provider from 'oidc-provider'; -import helmet from 'koa-helmet'; import { type Logger } from 'winston'; import { type IdentityContext } from '../interfaces.js'; import type { OIDCConfig } from './interfaces.js'; diff --git a/packages/facade/src/modules/identity/oidc/router.ts b/packages/facade/src/modules/identity/oidc/router.ts index 2b06bf6d..368f0ef3 100644 --- a/packages/facade/src/modules/identity/oidc/router.ts +++ b/packages/facade/src/modules/identity/oidc/router.ts @@ -3,7 +3,7 @@ import { type InteractionResults } from 'oidc-provider'; import type Provider from 'oidc-provider'; import { type Logger } from 'winston'; import { type IdentityContext } from '../interfaces.js'; -import { OIDCTemplateEngine, OIDCTemplateError } from './templates.js'; +import { OIDCTemplateEngine } from './templates.js'; // import { AuthUser, loginUser } from './user/index.js'; import { type OIDCError, type OIDCHbsTemplates, type OIDCBodyLoginFn } from './interfaces.js'; import { koaBody } from 'koa-body'; diff --git a/packages/facade/src/modules/identity/oidc/templates.ts b/packages/facade/src/modules/identity/oidc/templates.ts index 3a9d0e7f..c6fb67b2 100644 --- a/packages/facade/src/modules/identity/oidc/templates.ts +++ b/packages/facade/src/modules/identity/oidc/templates.ts @@ -1,11 +1,8 @@ import path from 'node:path'; import fs from 'node:fs'; -import { IdentityContext } from '../interfaces.js'; import hbs from 'handlebars'; import { type OIDCHbsTemplates } from './interfaces.js'; -const __dirname = import.meta.dirname; - export interface OIDCTemplateError { key: string; message?: string; @@ -38,51 +35,41 @@ hbs.registerHelper('json', (object) => { }); export class OIDCTemplateEngine { - private layoutHbs?: HandlebarsTemplateDelegate; private loginHbs?: HandlebarsTemplateDelegate; private consentHbs?: HandlebarsTemplateDelegate; constructor(private templates: OIDCHbsTemplates | undefined) { } - async layout(context: OIDCTemplateContext & { body: string }) { - if (!this.layoutHbs) { - const layoutTpl = this.templates?.login ?? await new Promise((resolve, reject) => { - fs.readFile(path.resolve(__dirname, 'views/layout.hbs'), (err, data) => err ? reject(err) : resolve(data.toString())); + async load(target: string) { + const template = this.templates?.[target]; + if (template) { + const layout = await new Promise((resolve, reject) => { + fs.readFile( + path.resolve(template), + (err, data) => err ? reject(err) : resolve(data.toString()) + ); }); - this.layoutHbs = hbs.compile(layoutTpl); + return hbs.compile(layout); + } + else { + throw new Error(`OIDC 'odic.template.${target}' not configured!`); } - return this.layoutHbs(context); } + async layout(context: OIDCTemplateContext & { body: string }) { + this.layoutHbs ??= await this.load('layout'); + return this.layoutHbs(context); + } async login(context: OIDCTemplateLoginContext) { - if (!this.loginHbs) { - const loginTpl = this.templates?.login ?? await new Promise((resolve, reject) => { - fs.readFile(path.resolve(__dirname, 'views/login.hbs'), (err, data) => err ? reject(err) : resolve(data.toString())); - }); - this.loginHbs = hbs.compile(loginTpl); - } - - let html = this.loginHbs(context); - return this.layout({ - ...context, - body: html - }); + this.loginHbs ??= await this.load('login'); + return this.loginHbs(context); } - async consent(context: OIDCTemplateConsentContext) { - if (!this.consentHbs) { - const consentTpl = this.templates?.consent ?? await new Promise((resolve, reject) => { - fs.readFile(path.resolve(__dirname, 'views/consent.hbs'), (err, data) => err ? reject(err) : resolve(data.toString())); - }); - this.consentHbs = hbs.compile(consentTpl); - } - let html = this.consentHbs(context); - return this.layout({ - ...context, - body: html - }); + async consent(context: OIDCTemplateConsentContext) { + this.consentHbs ??= await this.load('consent'); + return this.consentHbs(context); } } diff --git a/packages/facade/src/modules/identity/oidc/views/consent.hbs b/packages/facade/templates/consent.hbs similarity index 100% rename from packages/facade/src/modules/identity/oidc/views/consent.hbs rename to packages/facade/templates/consent.hbs diff --git a/packages/facade/src/modules/identity/oidc/views/layout.hbs b/packages/facade/templates/layout.hbs similarity index 100% rename from packages/facade/src/modules/identity/oidc/views/layout.hbs rename to packages/facade/templates/layout.hbs diff --git a/packages/facade/src/modules/identity/oidc/views/login.hbs b/packages/facade/templates/login.hbs similarity index 100% rename from packages/facade/src/modules/identity/oidc/views/login.hbs rename to packages/facade/templates/login.hbs