@maronn-openid-connect/cli 0.4.0 → 0.7.0

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.
Files changed (43) hide show
  1. package/README.md +102 -5
  2. package/dist/features.d.ts +9 -3
  3. package/dist/features.d.ts.map +1 -1
  4. package/dist/features.js +28 -2
  5. package/dist/features.js.map +1 -1
  6. package/dist/frameworks/express/index.d.ts.map +1 -1
  7. package/dist/frameworks/express/index.js +1 -1
  8. package/dist/frameworks/express/index.js.map +1 -1
  9. package/dist/frameworks/fastify/index.d.ts.map +1 -1
  10. package/dist/frameworks/fastify/index.js +1 -1
  11. package/dist/frameworks/fastify/index.js.map +1 -1
  12. package/dist/frameworks/hono/index.d.ts.map +1 -1
  13. package/dist/frameworks/hono/index.js +37 -8
  14. package/dist/frameworks/hono/index.js.map +1 -1
  15. package/dist/frameworks/hono/pages.d.ts +10 -0
  16. package/dist/frameworks/hono/pages.d.ts.map +1 -0
  17. package/dist/frameworks/hono/pages.js +806 -0
  18. package/dist/frameworks/hono/pages.js.map +1 -0
  19. package/dist/frameworks/hono/templates.d.ts +21 -9
  20. package/dist/frameworks/hono/templates.d.ts.map +1 -1
  21. package/dist/frameworks/hono/templates.js +13311 -8856
  22. package/dist/frameworks/hono/templates.js.map +1 -1
  23. package/dist/frameworks/nextjs/index.d.ts.map +1 -1
  24. package/dist/frameworks/nextjs/index.js +1 -1
  25. package/dist/frameworks/nextjs/index.js.map +1 -1
  26. package/dist/frameworks/types.d.ts +1 -0
  27. package/dist/frameworks/types.d.ts.map +1 -1
  28. package/dist/frameworks/web-standard/templates.d.ts +6 -6
  29. package/dist/frameworks/web-standard/templates.d.ts.map +1 -1
  30. package/dist/frameworks/web-standard/templates.js +332 -56
  31. package/dist/frameworks/web-standard/templates.js.map +1 -1
  32. package/dist/generator.d.ts +1 -0
  33. package/dist/generator.d.ts.map +1 -1
  34. package/dist/generator.js +2 -2
  35. package/dist/generator.js.map +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +130 -20
  38. package/dist/index.js.map +1 -1
  39. package/dist/scopes.d.ts +5 -0
  40. package/dist/scopes.d.ts.map +1 -0
  41. package/dist/scopes.js +38 -0
  42. package/dist/scopes.js.map +1 -0
  43. package/package.json +4 -3
package/README.md CHANGED
@@ -50,8 +50,17 @@ maronn-oidc setup <framework> [options]
50
50
  | `--entry, -e <file>` | setup 時にパッチするエントリファイル(既定: `./src/index.ts`) |
51
51
  | `--enable <features>` | 有効化する機能(カンマ区切り・複数回指定可) |
52
52
  | `--disable <features>` | 既定セットから外す機能(カンマ区切り・複数回指定可) |
53
+ | `--scope <scopes>` | 生成 OP が受け付けるカスタムスコープ(カンマ区切り・複数回指定可) |
54
+ | `--force` | 出力先に既にあるファイルを上書きする |
55
+ | `--dry-run` | 書き込みを行わず、出力予定のファイル一覧(新規か上書きか)を表示する |
53
56
  | `--help, -h` | ヘルプ表示 |
54
57
 
58
+ ### 既存ファイルの上書き保護
59
+
60
+ 出力先に生成対象と同名のファイルが 1 つでもある場合、`generate` / `setup` は**何も書き込まずに**そのファイル一覧を表示して終了コード 1 で終わる。改造済みの `config.ts` や `store.ts` を再実行で失わないためで、上書きするには `--force` を明示する(ログは新規が `Created:`、上書きが `Overwritten:` になる)。事前に結果を確認したいときは `--dry-run` を使う。
61
+
62
+ 再生成する予定があるなら、生成直後にコミットしてから改造すること。`--force` で上書きしても、自分の変更を `git diff` で取り戻せる。
63
+
55
64
  ## 生成されるもの
56
65
 
57
66
  ```
@@ -60,11 +69,15 @@ oidc-provider/
60
69
  ├── config.ts # ProviderConfig・クライアント登録(既定値はローカル検証専用)
61
70
  ├── store.ts # インメモリストア(認可コード・トークン・セッション等)
62
71
  ├── resolvers.ts # セッション・同意状態の resolver
63
- ├── views.ts # ログイン / 同意 / エラー画面のデフォルト UI
64
- ├── routes/ # 各エンドポイントのルート実装
65
- └── conformance.test.ts # 生成 OP の想定挙動を固定する契約テスト
72
+ ├── views.ts # ログイン / 同意 / エラー画面のデフォルト HTML
73
+ ├── pages/ # 画面用ルーティング(ブラウザ向けの GET/POST。描画・リダイレクト・Cookie 付与はすべてここ。UI カスタマイズはここ)
74
+ ├── routes/ # API ルーティング(ロジック本体。ブラウザ向けステップは Response を返さず結果(outcome)を返す関数)
75
+ ├── conformance.test.ts # 生成 OP の想定挙動を固定する契約テスト
76
+ └── .maronn-openid-connect.json # 生成元の CLI バージョンと機能構成の記録
66
77
  ```
67
78
 
79
+ `.maronn-openid-connect.json` は、どの CLI バージョン・どの機能構成(`framework` / `features` / `scopes`)から生成されたかを記録するマニフェスト。テンプレートへ仕様修正が入ったとき、リリースノートと突き合わせて「自分のコードがどの版から生成されたか」を特定する起点になる。利用者が編集するファイルではないため、上書き保護の対象外として毎回更新される(生成日時は含めず、同じ入力からは同じ出力になる)。
80
+
68
81
  生成される OP のエンドポイント:
69
82
 
70
83
  | パス | 役割 |
@@ -72,12 +85,35 @@ oidc-provider/
72
85
  | `/authorize` | 認可エンドポイント(`response_type=code`、PKCE S256、`prompt` / `max_age` / `claims` / Request Object 対応) |
73
86
  | `/token` | トークンエンドポイント(`authorization_code` / `refresh_token` グラント、`client_secret_basic` / `client_secret_post` / public client) |
74
87
  | `/userinfo` | UserInfo エンドポイント(Bearer トークン、scope 別クレーム) |
75
- | `/login`, `/consent` | ログイン・同意画面(差し替え可能なデフォルト UI 付き) |
88
+ | `/login`, `/consent` | ログイン・同意画面。ルート(GET / POST)と描画は `pages/`、認証・同意の判断は `routes/` の関数が担当する(差し替え可能なデフォルト UI 付き) |
89
+ | `/login/google` | Sign in with Google の `login_uri`(Google が ID トークンを POST する先。`google-login` 有効時) |
76
90
  | `/.well-known/openid-configuration` | Discovery メタデータ |
77
91
  | `/.well-known/jwks.json` | JWKS(公開鍵) |
78
92
  | `/introspect` | RFC 7662 Token Introspection(`introspection` 有効時) |
79
93
  | `/revoke` | RFC 7009 Token Revocation(`revocation` 有効時) |
80
94
 
95
+ ## 画面用ルーティング(pages/)と API ルーティング(routes/)
96
+
97
+ 生成されるルーティングは 2 種類に分かれている。ブラウザに返すもの(画面の描画・リダイレクト・Cookie の付与)はすべて `pages/` が担当し、`routes/` は Response を一切作らない。UI をカスタマイズするときに触るのは `pages/`(と `views.ts`)だけで、`routes/` のロジックは読まなくてよい。
98
+
99
+ | 層 | ファイル | 役割 |
100
+ |---|---|---|
101
+ | 画面用ルーティング | `pages/authorize.ts` / `pages/login.ts` / `pages/consent.ts` / `pages/errors.ts` / `pages/respond.ts`(機能有効時: `pages/device.ts` / `pages/ciba.ts` / `pages/logout.ts`) | ブラウザ向けのルートは **GET も POST も** ここにある(`GET\|POST /authorize`・`GET\|POST /login`・`GET\|POST /consent` など)。リクエストを読み、`routes/` の関数を 1 回呼び、返ってきた結果(outcome)を画面かリダイレクトに変換する。ロジックは持たない |
102
+ | API ルーティング | `routes/*.ts` | OIDC のロジック本体。`token` / `userinfo` などの JSON エンドポイントはルーターのまま。ブラウザ向けの各ステップ(`authorize` / `login` / `consent` / `device` / `ciba-verification` / `logout`)は Response を返さない関数(`processAuthorizationRequest()` / `prepareLogin()` / `submitLogin()` / `submitConsent()` など)で、結果を `kind` 付きの outcome(リダイレクト先 `location`、付与する `cookies`、画面データ、またはエラー)として返す。描画・リダイレクト・`Set-Cookie`・`c.json()` は一切行わず、`views.ts` も `pages/` も import しない |
103
+
104
+ たとえば `POST /login` は `pages/login.ts` がフォームを読んで `submitLogin()` を呼び、`{ kind: 'authenticated', cookies }` なら Cookie を付けて `/consent` へ 302、`{ kind: 'invalid_credentials' }` ならフォームを再表示、`{ kind: 'locked_out' }` なら 429 のエラー画面、という変換だけを行う。ステータスコード・Cookie・リダイレクト先といった HTTP の契約は `conformance.test.ts` が固定している。
105
+
106
+ UI を変える場所は、変えたい範囲で選ぶ。
107
+
108
+ - **HTML だけ変える** → `views.ts` の `default*Page` を書き換えるか、`createApp` / `applyOidc` の `views` オプションで差し替える
109
+ - **描画の仕方を変える**(テンプレートエンジン、フレームワークネイティブの Response、別に用意した UI へのリダイレクト)→ `pages/*.ts` の `render*Page()` と outcome を変換している箇所を書き換える。画面を返す経路はすべて `pages/` を通るので、`GET /login` もログイン失敗時の再表示も一緒に変わる
110
+ - **画面遷移を変える**(ログイン後の遷移先、エラー時の見せ方など)→ `pages/*.ts` で `redirectWithCookies()` / `withCookies()`(`pages/respond.ts`)を呼んでいる箇所。付けるべき Cookie は outcome の `cookies` にそのまま入っている
111
+ - **非リダイレクトの認可エラー(OIDC Core 1.0 §3.1.2.2)の見せ方を変える** → `pages/errors.ts` の `renderAuthorizationErrorPage()`。`config.authorizationErrorRedirectPath` に OP 内のパスを設定すると、HTML を直接返す代わりにそのパスへ 303 する(Next.js の生成物は `/oidc-error` を使う)
112
+
113
+ フォームの `name`(`transaction_id` / `csrf_token` / `username` / `password`、同意の `action=approve|deny`)は `pages/` が `routes/` の関数へ渡す入力なので、画面を差し替えても維持する。transaction-binding の束縛チェック(`rejectUnboundTransaction()`)や google-login のボタン設定(`buildGoogleSignIn()`)は判断なので `routes/login.ts` / `routes/consent.ts` にあり、`pages/` は返ってきた結果を描くだけでよい。
114
+
115
+ Next.js はもともと `login/page.tsx`(画面)と `login/actions.ts`(Server Action = ロジック)に分かれており、この構造に対応する。`_oidc-provider/pages/` も生成されるが、Route Handler 経由で動く `/authorize` と device / CIBA の画面、契約テストが使うもので、ログイン・同意画面のカスタマイズは `page.tsx` で行う。
116
+
81
117
  ## 機能トグル(--enable / --disable)
82
118
 
83
119
  生成されるOPの機能は、既定の全部入り構成から機能単位で増減できる。
@@ -101,6 +137,67 @@ maronn-oidc generate express --disable pkce
101
137
  Basic OP に必須の機能(authorize / token / userinfo / discovery / jwks / login / consent)はトグル対象外で、常に生成される。
102
138
  未知の機能名や、同じ機能を `--enable` と `--disable` の両方に指定した場合はエラーになる。
103
139
 
140
+ ### 拡張機能(--enable google-login)
141
+
142
+ 拡張機能は、OAuth / OIDC の仕様ではなく**ログイン手段**を生成コードに足すカテゴリで、既定では無効。実装は別 package にあり、有効にしたときだけ import される。
143
+
144
+ ```bash
145
+ maronn-oidc generate express --enable google-login
146
+ pnpm add express @maronn-openid-connect/core @maronn-openid-connect/google-login
147
+ ```
148
+
149
+ | 機能名 | 既定 | 内容 | 実装 package |
150
+ |---|---|---|---|
151
+ | `google-login` | 無効 | ログイン画面に「Google でログイン」(Google Identity Services の redirect mode)を追加し、Google が ID トークンを POST する `POST /login/google` を生成する。ID トークンの検証は Google 公式の `google-auth-library` に委ね、CSRF(`g_csrf_token` の Double Submit Cookie)、nonce による認証トランザクションへの束縛、`google:<sub>` を subject にした Google ユーザーの JIT 登録を生成コードが行う | `@maronn-openid-connect/google-login`(Node.js 22 以上限定。Cloudflare Workers などのエッジでは動かない) |
152
+
153
+ 有効化しても `config.googleLogin` を渡すまでボタンは表示されず、`/login/google` は 404 を返す。設定は `ProviderConfig.googleLogin = { clientId, hostedDomain?, requireVerifiedEmail? }` で、Google Cloud コンソールの OAuth クライアントには `<issuer>/login/google` を「承認済みのリダイレクト URI」に、ログイン画面のオリジンを「承認済みの JavaScript 生成元」に登録する。生成される Next.js の `runtime.ts` と本リポジトリの samples は `GOOGLE_CLIENT_ID` / `GOOGLE_HOSTED_DOMAIN` からこれを読む。詳細は [`@maronn-openid-connect/google-login` の README](../google-login/README.md) を参照。
154
+
155
+ ## カスタムスコープ(--scope)
156
+
157
+ 標準スコープ(`openid` / `profile` / `email` / `address` / `phone` / `offline_access`)以外に受け付けるスコープを、生成時に宣言できる。
158
+
159
+ ```bash
160
+ maronn-oidc generate hono --scope reports.read,reports.write
161
+ ```
162
+
163
+ 宣言すると `scopes.ts`(スコープポリシー)が生成され、生成 OP は次のようになる。
164
+
165
+ - discovery の `scopes_supported` に宣言したスコープが載る
166
+ - **宣言していないスコープ値は `invalid_scope` で拒否される**(RFC 6749 §3.3 / §4.1.2.1)。宣言が 1 つも無ければこのチェック自体を生成しないので、既定の生成物の挙動は変わらない
167
+ - ユーザーごとの絞り込みは、生成された `scopes.ts` に書く
168
+
169
+ ### ユーザーごとの絞り込みは生成コードに書く
170
+
171
+ 「誰にどのスコープを許すか」は CLI のオプションにしていない。運用ごとに条件(ロール、テナント、DB 参照)が違い、生成コードを改造して検証するというこのライブラリの使い方に合わないためである。代わりに、生成される `scopes.ts` に絞り込みの入口を用意し、判断が必要な全ステップから呼び出した状態で生成する。
172
+
173
+ ```typescript
174
+ // scopes.ts
175
+ export const RESTRICTED_SCOPE_SUBJECTS: Record<string, readonly string[]> = {
176
+ 'reports.read': ['alice'], // ← 手早く絞るならここに書く
177
+ };
178
+
179
+ export async function resolveGrantableScopes(
180
+ requested: readonly string[],
181
+ subject: string,
182
+ ): Promise<string[]> {
183
+ // ← ロール・テナント・DB 参照など、複雑な条件はここに書く(async なので
184
+ // DB / KV 参照を入れても呼び出し側の変更は不要)
185
+ return requested.filter((scope) => { /* ... */ });
186
+ }
187
+ ```
188
+
189
+ `resolveGrantableScopes()` は End-User が確定した後に呼ばれ、生成コードの次の箇所からすでに `await` されている。
190
+
191
+ | 呼び出し元 | タイミング |
192
+ |---|---|
193
+ | `routes/consent.ts` | 同意画面の表示内容と、承認時の付与スコープ |
194
+ | `routes/authorize.ts` | SSO fast path と `prompt=none`(同意画面を出さずに付与する経路)。どちらも**保存済み同意を引く前**に適用する。絞る前の scope で同意を探すと、そのユーザーが持てないスコープをキーに検索することになり永久に一致しない |
195
+ | `routes/device.ts` / `routes/ciba-verification.ts` | device / CIBA の承認ステップ(該当機能を有効にした場合) |
196
+
197
+ 落としたスコープはリクエストを失敗させず、付与スコープを狭めるだけになる(RFC 6749 §3.3 は要求より狭いスコープの発行を認めており、トークンレスポンスの `scope` に実際の付与内容が載る)。リクエストごと拒否したい場合は、呼び出し元で throw する。
198
+
199
+ カスタムスコープに対応する UserInfo クレームは無い(OIDC Core 1.0 §5.4 が定義するのは profile / email / address / phone のみ)。独自クレームを返す場合は `routes/userinfo.ts` を編集する。
200
+
104
201
  ### conformance.test.ts との関係
105
202
 
106
203
  生成物には `conformance.test.ts`(契約テスト)が含まれ、選択した機能構成に合わせた内容で生成される。
@@ -112,7 +209,7 @@ Basic OP に必須の機能(authorize / token / userinfo / discovery / jwks /
112
209
  1. ProviderConfig・署名鍵・クライアント resolver を環境変数 / DB / KV から供給する
113
210
  2. 生成される `JsonStoreBackend` を実装し、`createJsonProviderStores()` の結果を `storage` に渡す
114
211
  3. `config.ts` と未指定時のインメモリストアはローカル検証・契約テスト専用として扱う
115
- 4. 依存をインストールしてサーバーを起動する(例: `pnpm add hono @maronn-openid-connect/core`)
212
+ 4. 依存をインストールしてサーバーを起動する(例: `pnpm add hono @maronn-openid-connect/core`。`--enable google-login` 時は `@maronn-openid-connect/google-login` も)
116
213
 
117
214
  署名鍵は `SigningKeyProvider` として注入する。`createCachedSigningKeyProvider()`(core 提供)でラップすると、TTL 付きキャッシュで鍵ローテーションに追随できる。
118
215
 
@@ -1,9 +1,11 @@
1
- export declare const AVAILABLE_FEATURES: readonly ["pkce", "refresh-token", "introspection", "revocation", "request-object"];
1
+ export declare const AVAILABLE_FEATURES: readonly ['pkce', 'refresh-token', 'introspection', 'revocation', 'request-object'];
2
2
  export type FeatureName = (typeof AVAILABLE_FEATURES)[number];
3
- export declare const OPTIONAL_FEATURES: readonly ["transaction-binding"];
3
+ export declare const OPTIONAL_FEATURES: readonly ['transaction-binding'];
4
4
  export type OptionalFeatureName = (typeof OPTIONAL_FEATURES)[number];
5
- export declare const EXPERIMENTAL_FEATURES: readonly ["par", "token-exchange", "jarm", "device-authorization-grant", "id-jag"];
5
+ export declare const EXPERIMENTAL_FEATURES: readonly ['par', 'token-exchange', 'jarm', 'device-authorization-grant', 'id-jag', 'ciba', 'jwt-introspection-response', 'rp-initiated-logout'];
6
6
  export type ExperimentalFeatureName = (typeof EXPERIMENTAL_FEATURES)[number];
7
+ export declare const EXTENSION_FEATURES: readonly ['google-login'];
8
+ export type ExtensionFeatureName = (typeof EXTENSION_FEATURES)[number];
7
9
  export interface OidcFeatureConfig {
8
10
  pkce: boolean;
9
11
  refreshToken: boolean;
@@ -15,6 +17,10 @@ export interface OidcFeatureConfig {
15
17
  jarm: boolean;
16
18
  deviceAuthorizationGrant: boolean;
17
19
  idJag: boolean;
20
+ ciba: boolean;
21
+ jwtIntrospectionResponse: boolean;
22
+ rpInitiatedLogout: boolean;
23
+ googleLogin: boolean;
18
24
  transactionBinding: boolean;
19
25
  }
20
26
  export declare const DEFAULT_FEATURES: OidcFeatureConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,kBAAkB,qFAMrB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAiB9D,eAAO,MAAM,iBAAiB,kCAAmC,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAmBrE,eAAO,MAAM,qBAAqB,oFAMxB,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AA+C7E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB,EAAE,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AA6BD,eAAO,MAAM,gBAAgB,EAAE,iBAY9B,CAAC;AAwCF,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,iBAAiB,CA0BpB"}
1
+ {"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,kBAAkB,YAC7B,MAAM,EACN,eAAe,EACf,eAAe,EACf,YAAY,EACZ,gBAAgB,CACR,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAiB9D,eAAO,MAAM,iBAAiB,YAAI,qBAAqB,CAAU,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AA+BrE,eAAO,MAAM,qBAAqB,YAChC,KAAK,EACL,gBAAgB,EAChB,MAAM,EACN,4BAA4B,EAC5B,QAAQ,EACR,MAAM,EACN,4BAA4B,EAC5B,qBAAqB,CACb,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAkB7E,eAAO,MAAM,kBAAkB,YAAI,cAAc,CAAU,CAAC;AAE5D,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AA4EvE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB,EAAE,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB,EAAE,OAAO,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAqCD,eAAO,MAAM,gBAAgB,EAAE,iBAgB9B,CAAC;AA+CF,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,iBAAiB,CAqCpB"}
package/dist/features.js CHANGED
@@ -12,7 +12,11 @@ export const EXPERIMENTAL_FEATURES = [
12
12
  'jarm',
13
13
  'device-authorization-grant',
14
14
  'id-jag',
15
+ 'ciba',
16
+ 'jwt-introspection-response',
17
+ 'rp-initiated-logout',
15
18
  ];
19
+ export const EXTENSION_FEATURES = ['google-login'];
16
20
  const FEATURE_KEYS = {
17
21
  pkce: 'pkce',
18
22
  'refresh-token': 'refreshToken',
@@ -29,6 +33,12 @@ const EXPERIMENTAL_FEATURE_KEYS = {
29
33
  jarm: 'jarm',
30
34
  'device-authorization-grant': 'deviceAuthorizationGrant',
31
35
  'id-jag': 'idJag',
36
+ ciba: 'ciba',
37
+ 'jwt-introspection-response': 'jwtIntrospectionResponse',
38
+ 'rp-initiated-logout': 'rpInitiatedLogout',
39
+ };
40
+ const EXTENSION_FEATURE_KEYS = {
41
+ 'google-login': 'googleLogin',
32
42
  };
33
43
  export const DEFAULT_FEATURES = {
34
44
  pkce: true,
@@ -41,6 +51,10 @@ export const DEFAULT_FEATURES = {
41
51
  jarm: false,
42
52
  deviceAuthorizationGrant: false,
43
53
  idJag: false,
54
+ ciba: false,
55
+ jwtIntrospectionResponse: false,
56
+ rpInitiatedLogout: false,
57
+ googleLogin: false,
44
58
  transactionBinding: false,
45
59
  };
46
60
  function isOptionalFeature(name) {
@@ -49,18 +63,25 @@ function isOptionalFeature(name) {
49
63
  function isExperimentalFeature(name) {
50
64
  return EXPERIMENTAL_FEATURES.includes(name);
51
65
  }
66
+ function isExtensionFeature(name) {
67
+ return EXTENSION_FEATURES.includes(name);
68
+ }
52
69
  function assertKnownFeature(name) {
53
70
  if (!AVAILABLE_FEATURES.includes(name) &&
54
71
  !isOptionalFeature(name) &&
55
- !isExperimentalFeature(name)) {
72
+ !isExperimentalFeature(name) &&
73
+ !isExtensionFeature(name)) {
56
74
  throw new Error(`Unknown feature: "${name}". Available features: ${AVAILABLE_FEATURES.join(', ')}. ` +
57
75
  `Optional features (disabled by default): ${OPTIONAL_FEATURES.join(', ')}. ` +
58
- `Experimental features (disabled by default): ${EXPERIMENTAL_FEATURES.join(', ')}`);
76
+ `Experimental features (disabled by default): ${EXPERIMENTAL_FEATURES.join(', ')}. ` +
77
+ `Extension features (disabled by default): ${EXTENSION_FEATURES.join(', ')}`);
59
78
  }
60
79
  }
61
80
  function featureKey(name) {
62
81
  if (isOptionalFeature(name))
63
82
  return OPTIONAL_FEATURE_KEYS[name];
83
+ if (isExtensionFeature(name))
84
+ return EXTENSION_FEATURE_KEYS[name];
64
85
  return isExperimentalFeature(name) ? EXPERIMENTAL_FEATURE_KEYS[name] : FEATURE_KEYS[name];
65
86
  }
66
87
  export function resolveFeatures(options) {
@@ -83,6 +104,11 @@ export function resolveFeatures(options) {
83
104
  assertKnownFeature(name);
84
105
  features[featureKey(name)] = false;
85
106
  }
107
+ if (features.jwtIntrospectionResponse && !features.introspection) {
108
+ throw new Error('Feature "jwt-introspection-response" requires the introspection feature: ' +
109
+ 'the RFC 9701 JWT response is returned by the RFC 7662 introspection endpoint, ' +
110
+ 'which is not generated when introspection is disabled');
111
+ }
86
112
  return features;
87
113
  }
88
114
  //# sourceMappingURL=features.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,MAAM;IACN,eAAe;IACf,eAAe;IACf,YAAY;IACZ,gBAAgB;CACR,CAAC;AAmBX,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,qBAAqB,CAAU,CAAC;AAqBlE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK;IACL,gBAAgB;IAChB,MAAM;IACN,4BAA4B;IAC5B,QAAQ;CACA,CAAC;AAgEX,MAAM,YAAY,GAAiD;IACjE,IAAI,EAAE,MAAM;IACZ,eAAe,EAAE,cAAc;IAC/B,aAAa,EAAE,eAAe;IAC9B,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,eAAe;CAClC,CAAC;AAGF,MAAM,qBAAqB,GAAyD;IAClF,qBAAqB,EAAE,oBAAoB;CAC5C,CAAC;AAGF,MAAM,yBAAyB,GAA6D;IAC1F,GAAG,EAAE,KAAK;IACV,gBAAgB,EAAE,eAAe;IACjC,IAAI,EAAE,MAAM;IACZ,4BAA4B,EAAE,0BAA0B;IACxD,QAAQ,EAAE,OAAO;CAClB,CAAC;AAMF,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,IAAI,EAAE,IAAI;IACV,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IACnB,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,KAAK;IACpB,IAAI,EAAE,KAAK;IACX,wBAAwB,EAAE,KAAK;IAC/B,KAAK,EAAE,KAAK;IACZ,kBAAkB,EAAE,KAAK;CAC1B,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAQ,iBAAuC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAQ,qBAA2C,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CACzB,IAAY;IAEZ,IACE,CAAE,kBAAwC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACzD,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACxB,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAC5B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAClF,4CAA4C,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC5E,gDAAgD,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,IAAiE;IAEjE,IAAI,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5F,CAAC;AASD,MAAM,UAAU,eAAe,CAAC,OAG/B;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QAC3C,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,uCAAuC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACpC,CAAC;IAGD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../src/features.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGvF,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IAEjC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE;CAOrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGvF,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IAEjC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAOnD;CACF"}
@@ -3,7 +3,7 @@ export class ExpressGenerator {
3
3
  name = 'express';
4
4
  displayName = 'Express';
5
5
  generate(options) {
6
- return webGeneratedFiles(options.corePackageName, expressApplyTemplate(options.features), options.features);
6
+ return webGeneratedFiles(options.corePackageName, expressApplyTemplate(options.features), options.features, options.scopes);
7
7
  }
8
8
  }
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IAEjC,QAAQ,CAAC,OAAyB;QAChC,OAAO,iBAAiB,CACtB,OAAO,CAAC,eAAe,EACvB,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtC,OAAO,CAAC,QAAQ,CACjB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/express/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IAEjC,QAAQ,CAAC,OAAyB;QAChC,OAAO,iBAAiB,CACtB,OAAO,CAAC,eAAe,EACvB,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/fastify/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGvF,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IAEjC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE;CAOrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/fastify/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGvF,qBAAa,gBAAiB,YAAW,kBAAkB;IACzD,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IAEjC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAOnD;CACF"}
@@ -3,7 +3,7 @@ export class FastifyGenerator {
3
3
  name = 'fastify';
4
4
  displayName = 'Fastify';
5
5
  generate(options) {
6
- return webGeneratedFiles(options.corePackageName, fastifyApplyTemplate(options.features), options.features);
6
+ return webGeneratedFiles(options.corePackageName, fastifyApplyTemplate(options.features), options.features, options.scopes);
7
7
  }
8
8
  }
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/fastify/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IAEjC,QAAQ,CAAC,OAAyB;QAChC,OAAO,iBAAiB,CACtB,OAAO,CAAC,eAAe,EACvB,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtC,OAAO,CAAC,QAAQ,CACjB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/fastify/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IAEjC,QAAQ,CAAC,OAAyB;QAChC,OAAO,iBAAiB,CACtB,OAAO,CAAC,eAAe,EACvB,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/hono/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAyBvF,qBAAa,aAAc,YAAW,kBAAkB;IACtD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAE9B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE;CA6CrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/frameworks/hono/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAuCvF,qBAAa,aAAc,YAAW,kBAAkB;IACtD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAE9B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,EAAE,CAiFnD;CACF"}
@@ -1,23 +1,40 @@
1
1
  import { DEFAULT_FEATURES } from '../../features.js';
2
- import { appTemplate, applyTemplate, configTemplate, storeTemplate, resolversTemplate, viewsTemplate, authorizeRouteTemplate, tokenRouteTemplate, userinfoRouteTemplate, introspectionRouteTemplate, revocationRouteTemplate, jwksRouteTemplate, parRouteTemplate, deviceAuthorizationRouteTemplate, deviceVerificationRouteTemplate, jarmConfigTemplate, discoveryRouteTemplate, loginRouteTemplate, consentRouteTemplate, conformanceTestTemplate, } from './templates.js';
2
+ import { appTemplate, applyTemplate, configTemplate, customScopesTemplate, storeTemplate, resolversTemplate, viewsTemplate, authorizeRouteTemplate, tokenRouteTemplate, userinfoRouteTemplate, introspectionRouteTemplate, revocationRouteTemplate, jwksRouteTemplate, parRouteTemplate, deviceAuthorizationRouteTemplate, deviceVerificationRouteTemplate, backchannelAuthenticationRouteTemplate, cibaVerificationRouteTemplate, endSessionRouteTemplate, jarmConfigTemplate, discoveryRouteTemplate, loginRouteTemplate, consentRouteTemplate, conformanceTestTemplate, } from './templates.js';
3
+ import { authorizePageTemplate, cibaPageTemplate, consentPageTemplate, devicePageTemplate, errorPageTemplate, loginPageTemplate, logoutPageTemplate, respondTemplate, } from './pages.js';
3
4
  export class HonoGenerator {
4
5
  name = 'hono';
5
6
  displayName = 'Hono';
6
7
  generate(options) {
7
8
  const pkg = options.corePackageName;
8
9
  const features = options.features ?? DEFAULT_FEATURES;
10
+ const scopes = options.scopes ?? [];
9
11
  return [
10
12
  { path: 'app.ts', content: appTemplate(pkg, features) },
11
13
  { path: 'apply.ts', content: applyTemplate(pkg, features) },
12
14
  { path: 'config.ts', content: configTemplate(pkg, features) },
15
+ ...(scopes.length > 0
16
+ ? [{ path: 'scopes.ts', content: customScopesTemplate(scopes, features) }]
17
+ : []),
13
18
  { path: 'store.ts', content: storeTemplate(pkg, features) },
14
19
  { path: 'resolvers.ts', content: resolversTemplate(pkg, features) },
15
20
  { path: 'views.ts', content: viewsTemplate(features) },
16
- { path: 'routes/authorize.ts', content: authorizeRouteTemplate(pkg, features) },
21
+ { path: 'pages/respond.ts', content: respondTemplate() },
22
+ { path: 'pages/errors.ts', content: errorPageTemplate() },
23
+ { path: 'pages/authorize.ts', content: authorizePageTemplate() },
24
+ { path: 'pages/login.ts', content: loginPageTemplate(features) },
25
+ { path: 'pages/consent.ts', content: consentPageTemplate() },
26
+ ...(features.deviceAuthorizationGrant
27
+ ? [{ path: 'pages/device.ts', content: devicePageTemplate() }]
28
+ : []),
29
+ ...(features.ciba ? [{ path: 'pages/ciba.ts', content: cibaPageTemplate() }] : []),
30
+ ...(features.rpInitiatedLogout
31
+ ? [{ path: 'pages/logout.ts', content: logoutPageTemplate() }]
32
+ : []),
33
+ { path: 'routes/authorize.ts', content: authorizeRouteTemplate(pkg, features, scopes) },
17
34
  { path: 'routes/token.ts', content: tokenRouteTemplate(pkg, features) },
18
35
  { path: 'routes/userinfo.ts', content: userinfoRouteTemplate(pkg) },
19
36
  ...(features.introspection
20
- ? [{ path: 'routes/introspection.ts', content: introspectionRouteTemplate(pkg) }]
37
+ ? [{ path: 'routes/introspection.ts', content: introspectionRouteTemplate(pkg, features) }]
21
38
  : []),
22
39
  ...(features.revocation
23
40
  ? [{ path: 'routes/revocation.ts', content: revocationRouteTemplate(pkg) }]
@@ -29,19 +46,31 @@ export class HonoGenerator {
29
46
  ? [
30
47
  {
31
48
  path: 'routes/device-authorization.ts',
32
- content: deviceAuthorizationRouteTemplate(pkg, features),
49
+ content: deviceAuthorizationRouteTemplate(pkg, features, scopes),
50
+ },
51
+ { path: 'routes/device.ts', content: deviceVerificationRouteTemplate(pkg, scopes) },
52
+ ]
53
+ : []),
54
+ ...(features.ciba
55
+ ? [
56
+ {
57
+ path: 'routes/backchannel-authentication.ts',
58
+ content: backchannelAuthenticationRouteTemplate(pkg, features, scopes),
33
59
  },
34
- { path: 'routes/device.ts', content: deviceVerificationRouteTemplate(pkg) },
60
+ { path: 'routes/ciba-verification.ts', content: cibaVerificationRouteTemplate(pkg, scopes) },
35
61
  ]
36
62
  : []),
63
+ ...(features.rpInitiatedLogout
64
+ ? [{ path: 'routes/logout.ts', content: endSessionRouteTemplate(pkg) }]
65
+ : []),
37
66
  ...(features.jarm
38
67
  ? [{ path: 'routes/jarm.ts', content: jarmConfigTemplate() }]
39
68
  : []),
40
69
  { path: 'routes/jwks.ts', content: jwksRouteTemplate(pkg) },
41
- { path: 'routes/discovery.ts', content: discoveryRouteTemplate(pkg, features) },
70
+ { path: 'routes/discovery.ts', content: discoveryRouteTemplate(pkg, features, scopes) },
42
71
  { path: 'routes/login.ts', content: loginRouteTemplate(pkg, features) },
43
- { path: 'routes/consent.ts', content: consentRouteTemplate(pkg, features) },
44
- { path: 'conformance.test.ts', content: conformanceTestTemplate(pkg, features) },
72
+ { path: 'routes/consent.ts', content: consentRouteTemplate(pkg, features, scopes) },
73
+ { path: 'conformance.test.ts', content: conformanceTestTemplate(pkg, features, scopes) },
45
74
  ];
46
75
  }
47
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/hono/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/frameworks/hono/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { OidcFeatureConfig } from '../../features.js';
2
+ export declare function respondTemplate(): string;
3
+ export declare function errorPageTemplate(): string;
4
+ export declare function authorizePageTemplate(): string;
5
+ export declare function loginPageTemplate(features?: OidcFeatureConfig): string;
6
+ export declare function consentPageTemplate(): string;
7
+ export declare function devicePageTemplate(): string;
8
+ export declare function cibaPageTemplate(): string;
9
+ export declare function logoutPageTemplate(): string;
10
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../../src/frameworks/hono/pages.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAO3D,wBAAgB,eAAe,IAAI,MAAM,CA6CxC;AAUD,wBAAgB,iBAAiB,IAAI,MAAM,CA+D1C;AAOD,wBAAgB,qBAAqB,IAAI,MAAM,CAiF9C;AAOD,wBAAgB,iBAAiB,CAC/B,QAAQ,GAAE,iBAAoC,GAC7C,MAAM,CAwIR;AAMD,wBAAgB,mBAAmB,IAAI,MAAM,CAqF5C;AAOD,wBAAgB,kBAAkB,IAAI,MAAM,CAoK3C;AAOD,wBAAgB,gBAAgB,IAAI,MAAM,CAuIzC;AAOD,wBAAgB,kBAAkB,IAAI,MAAM,CAyF3C"}