@seifer-webapp-factory/authentication 0.1.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 (113) hide show
  1. package/README.md +8 -0
  2. package/backend/templates/config/config-fragment.ts +73 -0
  3. package/backend/templates/mail/templates.ts +84 -0
  4. package/backend/templates/nestjs/auth.controller.ts +274 -0
  5. package/backend/templates/nestjs/auth.module.ts +207 -0
  6. package/backend/templates/nestjs/tokens.ts +24 -0
  7. package/backend/templates/persistence/migrations/0001_auth.sql +36 -0
  8. package/backend/templates/persistence/migrations/index.ts +75 -0
  9. package/backend/templates/persistence/pg-single-use-store.ts +64 -0
  10. package/backend/templates/persistence/pg-token-store.ts +75 -0
  11. package/backend/templates/persistence/pg-user-store.ts +53 -0
  12. package/backend/templates/security/cookies.ts +89 -0
  13. package/backend/templates/security/csrf.ts +44 -0
  14. package/backend/templates/security/headers.ts +30 -0
  15. package/backend/templates/security/redaction.ts +38 -0
  16. package/dist/backend/src/errors.d.ts +12 -0
  17. package/dist/backend/src/errors.d.ts.map +1 -0
  18. package/dist/backend/src/errors.js +55 -0
  19. package/dist/backend/src/errors.js.map +1 -0
  20. package/dist/backend/src/index.d.ts +9 -0
  21. package/dist/backend/src/index.d.ts.map +1 -0
  22. package/dist/backend/src/index.js +8 -0
  23. package/dist/backend/src/index.js.map +1 -0
  24. package/dist/backend/src/ports.d.ts +60 -0
  25. package/dist/backend/src/ports.d.ts.map +1 -0
  26. package/dist/backend/src/ports.js +2 -0
  27. package/dist/backend/src/ports.js.map +1 -0
  28. package/dist/backend/src/services.d.ts +49 -0
  29. package/dist/backend/src/services.d.ts.map +1 -0
  30. package/dist/backend/src/services.js +178 -0
  31. package/dist/backend/src/services.js.map +1 -0
  32. package/dist/contract/endpoints.d.ts +259 -0
  33. package/dist/contract/endpoints.d.ts.map +1 -0
  34. package/dist/contract/endpoints.js +42 -0
  35. package/dist/contract/endpoints.js.map +1 -0
  36. package/dist/contract/errors.d.ts +23 -0
  37. package/dist/contract/errors.d.ts.map +1 -0
  38. package/dist/contract/errors.js +31 -0
  39. package/dist/contract/errors.js.map +1 -0
  40. package/dist/contract/events.d.ts +40 -0
  41. package/dist/contract/events.d.ts.map +1 -0
  42. package/dist/contract/events.js +14 -0
  43. package/dist/contract/events.js.map +1 -0
  44. package/dist/contract/index.d.ts +9 -0
  45. package/dist/contract/index.d.ts.map +1 -0
  46. package/dist/contract/index.js +9 -0
  47. package/dist/contract/index.js.map +1 -0
  48. package/dist/contract/schemas.d.ts +150 -0
  49. package/dist/contract/schemas.d.ts.map +1 -0
  50. package/dist/contract/schemas.js +43 -0
  51. package/dist/contract/schemas.js.map +1 -0
  52. package/dist/frontend/src/client.d.ts +38 -0
  53. package/dist/frontend/src/client.d.ts.map +1 -0
  54. package/dist/frontend/src/client.js +88 -0
  55. package/dist/frontend/src/client.js.map +1 -0
  56. package/dist/frontend/src/composables.d.ts +46 -0
  57. package/dist/frontend/src/composables.d.ts.map +1 -0
  58. package/dist/frontend/src/composables.js +111 -0
  59. package/dist/frontend/src/composables.js.map +1 -0
  60. package/dist/frontend/src/guards.d.ts +10 -0
  61. package/dist/frontend/src/guards.d.ts.map +1 -0
  62. package/dist/frontend/src/guards.js +9 -0
  63. package/dist/frontend/src/guards.js.map +1 -0
  64. package/dist/frontend/src/index.d.ts +12 -0
  65. package/dist/frontend/src/index.d.ts.map +1 -0
  66. package/dist/frontend/src/index.js +9 -0
  67. package/dist/frontend/src/index.js.map +1 -0
  68. package/dist/manifest.d.ts +80 -0
  69. package/dist/manifest.d.ts.map +1 -0
  70. package/dist/manifest.js +126 -0
  71. package/dist/manifest.js.map +1 -0
  72. package/dist/scaffolder/core/config.d.ts +213 -0
  73. package/dist/scaffolder/core/config.d.ts.map +1 -0
  74. package/dist/scaffolder/core/config.js +132 -0
  75. package/dist/scaffolder/core/config.js.map +1 -0
  76. package/dist/scaffolder/core/errors.d.ts +37 -0
  77. package/dist/scaffolder/core/errors.d.ts.map +1 -0
  78. package/dist/scaffolder/core/errors.js +46 -0
  79. package/dist/scaffolder/core/errors.js.map +1 -0
  80. package/dist/scaffolder/core/extend.d.ts +115 -0
  81. package/dist/scaffolder/core/extend.d.ts.map +1 -0
  82. package/dist/scaffolder/core/extend.js +116 -0
  83. package/dist/scaffolder/core/extend.js.map +1 -0
  84. package/dist/scaffolder/core/materialize.d.ts +71 -0
  85. package/dist/scaffolder/core/materialize.d.ts.map +1 -0
  86. package/dist/scaffolder/core/materialize.js +47 -0
  87. package/dist/scaffolder/core/materialize.js.map +1 -0
  88. package/dist/scaffolder/core/ports.d.ts +39 -0
  89. package/dist/scaffolder/core/ports.d.ts.map +1 -0
  90. package/dist/scaffolder/core/ports.js +33 -0
  91. package/dist/scaffolder/core/ports.js.map +1 -0
  92. package/dist/scaffolder/core/three-way-merge.d.ts +113 -0
  93. package/dist/scaffolder/core/three-way-merge.d.ts.map +1 -0
  94. package/dist/scaffolder/core/three-way-merge.js +184 -0
  95. package/dist/scaffolder/core/three-way-merge.js.map +1 -0
  96. package/dist/scaffolder/index.d.ts +21 -0
  97. package/dist/scaffolder/index.d.ts.map +1 -0
  98. package/dist/scaffolder/index.js +20 -0
  99. package/dist/scaffolder/index.js.map +1 -0
  100. package/frontend/templates/components/AuthField.vue +68 -0
  101. package/frontend/templates/i18n/en.json +70 -0
  102. package/frontend/templates/i18n/nl.json +70 -0
  103. package/frontend/templates/middleware/auth.ts +25 -0
  104. package/frontend/templates/middleware/guest.ts +25 -0
  105. package/frontend/templates/pages/forgot-password.vue +89 -0
  106. package/frontend/templates/pages/login.vue +90 -0
  107. package/frontend/templates/pages/logout.vue +46 -0
  108. package/frontend/templates/pages/register.vue +100 -0
  109. package/frontend/templates/pages/reset-password.vue +105 -0
  110. package/frontend/templates/pages/verify-email.vue +76 -0
  111. package/frontend/templates/plugins/auth.client.ts +111 -0
  112. package/frontend/templates/runtime.ts +60 -0
  113. package/package.json +71 -0
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Kleine, test-veilige runtime-helpers voor de auth-surface-pagina's. Géén mechanisme — puur
3
+ * glue die de pagina's los-koppelt van het host-framework (Nuxt) zodat ze óók bloot in vitest
4
+ * renderen. Alle helpers zijn per-instance / injectie-gebaseerd: geen module-globale mutable state.
5
+ *
6
+ * - `useTranslate()` — leest de i18n-kit-instance als die geprovide is, valt anders veilig terug op
7
+ * de sleutel zelf (zodat een pagina zonder i18n-provider tóch rendert; tests zien de sleutel).
8
+ * - `useNavigate()` / `provideNavigate()` — injecteerbare navigatie; de Nuxt-plugin wired hier
9
+ * `navigateTo`; zonder provider is het een no-op (tests hoeven geen router).
10
+ * - `readQueryParam()` — leest een query-parameter (bv. `token`, `redirect`) uit `window.location`,
11
+ * test-veilig (happy-dom) en client-safe.
12
+ * - `useOptionalToasts()` — leest de notifications-toast-store als die geprovide is, anders `undefined`.
13
+ */
14
+ import { inject, type App, type InjectionKey } from 'vue';
15
+ import { I18N_KEY } from '@seifer-webapp-factory/kits/frontend/i18n/vue';
16
+ import { TOAST_STORE_KEY } from '@seifer-webapp-factory/kits/frontend/notifications/vue';
17
+ import type { UseToasts } from '@seifer-webapp-factory/kits/frontend/notifications/vue';
18
+
19
+ /** Vertaal-functie: sleutel (+ optionele interpolatie-params) → gelokaliseerde tekst. */
20
+ export type TranslateFn = (key: string, params?: Readonly<Record<string, unknown>>) => string;
21
+
22
+ /**
23
+ * Levert een vertaal-functie. Met geprovide i18n-kit: echte vertaling. Zonder: identiteit (de
24
+ * sleutel zelf), zodat een surface-pagina ook zonder i18n-provider rendert.
25
+ */
26
+ export function useTranslate(): TranslateFn {
27
+ const i18n = inject(I18N_KEY, undefined);
28
+ return (key, params) => (i18n !== undefined ? i18n.t(key, params) : key);
29
+ }
30
+
31
+ /** Navigatie-functie: stuurt de gebruiker naar een pad (bv. na een geslaagde login). */
32
+ export type NavigateFn = (to: string) => void;
33
+
34
+ /** Injectie-sleutel voor de navigator. Module-constante (geen mutable state). */
35
+ export const AUTH_NAVIGATE_KEY: InjectionKey<NavigateFn> = Symbol('auth.navigate');
36
+
37
+ /** Registreer de navigator op een app-instance (de Nuxt-plugin wired hier `navigateTo`). */
38
+ export function provideNavigate(app: App, navigate: NavigateFn): void {
39
+ app.provide(AUTH_NAVIGATE_KEY, navigate);
40
+ }
41
+
42
+ /** Haal de navigator op binnen setup(). Zonder provider: een veilige no-op. */
43
+ export function useNavigate(): NavigateFn {
44
+ return inject(AUTH_NAVIGATE_KEY, () => {});
45
+ }
46
+
47
+ /**
48
+ * Lees een query-parameter uit de huidige URL. Test-veilig (happy-dom levert `window.location`) en
49
+ * client-safe. Zonder `window` (SSR): lege string.
50
+ */
51
+ export function readQueryParam(name: string): string {
52
+ if (typeof window === 'undefined' || window.location == null) return '';
53
+ return new URLSearchParams(window.location.search).get(name) ?? '';
54
+ }
55
+
56
+ /** Haal de (optionele) toast-store op; `undefined` als notifications niet geprovide is. */
57
+ export function useOptionalToasts(): UseToasts['success'] | undefined {
58
+ const store = inject(TOAST_STORE_KEY, undefined);
59
+ return store?.success;
60
+ }
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@seifer-webapp-factory/authentication",
3
+ "version": "0.1.0",
4
+ "description": "authentication — eerste capability-module: verticale, pluggable full-stack auth-feature (register/login/logout/verify/refresh/reset) die de backend- en frontend-kits samenbindt via één contract.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "exports": {
8
+ "./contract": {
9
+ "types": "./dist/contract/index.d.ts",
10
+ "import": "./dist/contract/index.js"
11
+ },
12
+ "./backend": {
13
+ "types": "./dist/backend/src/index.d.ts",
14
+ "import": "./dist/backend/src/index.js"
15
+ },
16
+ "./frontend": {
17
+ "types": "./dist/frontend/src/index.d.ts",
18
+ "import": "./dist/frontend/src/index.js"
19
+ },
20
+ "./manifest": {
21
+ "types": "./dist/manifest.d.ts",
22
+ "import": "./dist/manifest.js"
23
+ },
24
+ "./scaffolder": {
25
+ "types": "./dist/scaffolder/index.d.ts",
26
+ "import": "./dist/scaffolder/index.js"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsc -p tsconfig.build.json",
31
+ "typecheck": "tsc -p tsconfig.json --noEmit",
32
+ "test": "vitest run"
33
+ },
34
+ "peerDependencies": {
35
+ "vue": "^3.4.0",
36
+ "zod": "^3.23.0",
37
+ "@seifer-webapp-factory/kits": "^0.1.0"
38
+ },
39
+ "devDependencies": {
40
+ "@nestjs/common": "^10.4.22",
41
+ "@nestjs/core": "^10.4.22",
42
+ "@nestjs/platform-express": "^10.4.22",
43
+ "@nestjs/testing": "^10.4.22",
44
+ "@playwright/test": "^1.50.0",
45
+ "@types/pg": "^8.20.0",
46
+ "@types/supertest": "^6.0.0",
47
+ "@vitejs/plugin-vue": "^5.2.0",
48
+ "@vue/test-utils": "^2.4.0",
49
+ "happy-dom": "^15.0.0",
50
+ "pg": "^8.22.0",
51
+ "reflect-metadata": "^0.2.2",
52
+ "rxjs": "^7.8.2",
53
+ "supertest": "^7.0.0",
54
+ "testcontainers": "^10.28.0",
55
+ "tsx": "^4.23.0",
56
+ "typescript": "^5.7.0",
57
+ "vitest": "^2.1.0",
58
+ "vue": "^3.4.0",
59
+ "zod": "^3.24.0",
60
+ "@seifer-webapp-factory/kits": "^0.1.0"
61
+ },
62
+ "engines": {
63
+ "node": ">=20"
64
+ },
65
+ "files": [
66
+ "dist",
67
+ "backend/templates",
68
+ "frontend/templates",
69
+ "README.md"
70
+ ]
71
+ }