@o3co/create-auth-provider 0.17.0 → 0.18.0-rc.1

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 (114) hide show
  1. package/README.md +2 -198
  2. package/main.js +4 -0
  3. package/package.json +8 -30
  4. package/README.ja.md +0 -200
  5. package/dist/cli.d.mts +0 -3
  6. package/dist/cli.d.mts.map +0 -1
  7. package/dist/cli.mjs +0 -18
  8. package/dist/index.d.mts +0 -48
  9. package/dist/index.d.mts.map +0 -1
  10. package/dist/index.mjs +0 -325
  11. package/dist/internal/template-filter.d.mts +0 -14
  12. package/dist/internal/template-filter.d.mts.map +0 -1
  13. package/dist/internal/template-filter.mjs +0 -42
  14. package/templates/standalone/.dockerignore +0 -23
  15. package/templates/standalone/.env.example +0 -152
  16. package/templates/standalone/Dockerfile +0 -125
  17. package/templates/standalone/Makefile +0 -12
  18. package/templates/standalone/README.ja.md +0 -912
  19. package/templates/standalone/README.md +0 -1536
  20. package/templates/standalone/config/application.conf +0 -351
  21. package/templates/standalone/config/clients.yaml +0 -4
  22. package/templates/standalone/config/clients.yaml.example +0 -124
  23. package/templates/standalone/config/development.conf +0 -17
  24. package/templates/standalone/config/mailpit.conf +0 -13
  25. package/templates/standalone/config/production.conf +0 -15
  26. package/templates/standalone/config/reference.conf +0 -427
  27. package/templates/standalone/docker-compose.mailpit.yml +0 -39
  28. package/templates/standalone/docker-compose.production.yml +0 -229
  29. package/templates/standalone/docker-compose.test.yml +0 -16
  30. package/templates/standalone/docker-compose.yml +0 -67
  31. package/templates/standalone/gitignore +0 -23
  32. package/templates/standalone/package.json +0 -56
  33. package/templates/standalone/src/__tests__/adapters.test.mts +0 -425
  34. package/templates/standalone/src/__tests__/admission-lifecycle.test.mts +0 -87
  35. package/templates/standalone/src/__tests__/all-modules-composition.fixture.mts +0 -1188
  36. package/templates/standalone/src/__tests__/all-modules-composition.multi.test.mts +0 -285
  37. package/templates/standalone/src/__tests__/all-modules-composition.test.mts +0 -1154
  38. package/templates/standalone/src/__tests__/audit-sink.test.mts +0 -355
  39. package/templates/standalone/src/__tests__/backchannel-peer.fixture.mts +0 -64
  40. package/templates/standalone/src/__tests__/config-notices.test.mts +0 -157
  41. package/templates/standalone/src/__tests__/configPath.test.mts +0 -69
  42. package/templates/standalone/src/__tests__/configured-mfa-mode.fixture.mts +0 -48
  43. package/templates/standalone/src/__tests__/core-federations.test.mts +0 -252
  44. package/templates/standalone/src/__tests__/core-sections.test.mts +0 -192
  45. package/templates/standalone/src/__tests__/device-code-store-client-module.test.mts +0 -95
  46. package/templates/standalone/src/__tests__/documented-env-overrides.test.mts +0 -1291
  47. package/templates/standalone/src/__tests__/federation-grants-composition.test.mts +0 -787
  48. package/templates/standalone/src/__tests__/federation-grants-survive-logout.test.mts +0 -464
  49. package/templates/standalone/src/__tests__/federation-token-refresh-outage.test.mts +0 -141
  50. package/templates/standalone/src/__tests__/federation-types.test.mts +0 -239
  51. package/templates/standalone/src/__tests__/frontchannel-logout-csp.test.mts +0 -168
  52. package/templates/standalone/src/__tests__/google-session.fixture.mts +0 -318
  53. package/templates/standalone/src/__tests__/host-routes.test.mts +0 -134
  54. package/templates/standalone/src/__tests__/library-reference-resolution.smoke.test.mts +0 -29
  55. package/templates/standalone/src/__tests__/library-references.fixture.mts +0 -188
  56. package/templates/standalone/src/__tests__/lifecycle-pending-close.test.mts +0 -217
  57. package/templates/standalone/src/__tests__/listen.test.mts +0 -121
  58. package/templates/standalone/src/__tests__/logger-projection.test.mts +0 -77
  59. package/templates/standalone/src/__tests__/logout-session-cookie.test.mts +0 -113
  60. package/templates/standalone/src/__tests__/mail-sender.test.mts +0 -134
  61. package/templates/standalone/src/__tests__/mailpit-compose.test.mts +0 -393
  62. package/templates/standalone/src/__tests__/metrics.test.mts +0 -253
  63. package/templates/standalone/src/__tests__/mfa-routes-budget.test.mts +0 -122
  64. package/templates/standalone/src/__tests__/mfa-switch.redis.test.mts +0 -127
  65. package/templates/standalone/src/__tests__/mfa-switch.test.mts +0 -883
  66. package/templates/standalone/src/__tests__/own-modules.test.mts +0 -1480
  67. package/templates/standalone/src/__tests__/post-logout-redirect.test.mts +0 -183
  68. package/templates/standalone/src/__tests__/redis-assume-noeviction.test.mts +0 -283
  69. package/templates/standalone/src/__tests__/redis-connection-error-log.test.mts +0 -135
  70. package/templates/standalone/src/__tests__/redis-rate-limiter-config-survives.test.mts +0 -214
  71. package/templates/standalone/src/__tests__/redis-stand-in.fixture.mts +0 -98
  72. package/templates/standalone/src/__tests__/refresh-token-family-client-module.test.mts +0 -249
  73. package/templates/standalone/src/__tests__/replica-safety.test.mts +0 -657
  74. package/templates/standalone/src/__tests__/repositories-logger.test.mts +0 -119
  75. package/templates/standalone/src/__tests__/router-error-answers.test.mts +0 -146
  76. package/templates/standalone/src/__tests__/scaffold-assets.test.mts +0 -610
  77. package/templates/standalone/src/__tests__/sections.test.mts +0 -516
  78. package/templates/standalone/src/__tests__/session-lifecycle.test.mts +0 -213
  79. package/templates/standalone/src/__tests__/session-logout-invalidates-token.test.mts +0 -305
  80. package/templates/standalone/src/__tests__/session-logout-lifecycle.test.mts +0 -130
  81. package/templates/standalone/src/__tests__/session-requirements.test.mts +0 -382
  82. package/templates/standalone/src/__tests__/shipped-config-notices.test.mts +0 -274
  83. package/templates/standalone/src/__tests__/shutdown.test.mts +0 -622
  84. package/templates/standalone/src/__tests__/smoke.test.mts +0 -642
  85. package/templates/standalone/src/__tests__/startup-log-lines.test.mts +0 -164
  86. package/templates/standalone/src/__tests__/store-credential.test.mts +0 -314
  87. package/templates/standalone/src/__tests__/supertest-loopback.test.mts +0 -296
  88. package/templates/standalone/src/__tests__/three-tier-resolution.test.mts +0 -265
  89. package/templates/standalone/src/__tests__/two-phase-config.test.mts +0 -605
  90. package/templates/standalone/src/__tests__/upstream-amr.acceptance.test.mts +0 -385
  91. package/templates/standalone/src/adapters.mts +0 -162
  92. package/templates/standalone/src/app.mts +0 -127
  93. package/templates/standalone/src/bootRefusal.mts +0 -117
  94. package/templates/standalone/src/buildModules.mts +0 -358
  95. package/templates/standalone/src/configPath.mts +0 -487
  96. package/templates/standalone/src/listen.mts +0 -60
  97. package/templates/standalone/src/logger.mts +0 -80
  98. package/templates/standalone/src/metrics.mts +0 -167
  99. package/templates/standalone/src/mfaSwitch.mts +0 -284
  100. package/templates/standalone/src/modules.mts +0 -705
  101. package/templates/standalone/src/rootRenames.mts +0 -95
  102. package/templates/standalone/src/routes.mts +0 -89
  103. package/templates/standalone/src/sections.mts +0 -378
  104. package/templates/standalone/src/securityHeaders.mts +0 -36
  105. package/templates/standalone/src/shutdown.mts +0 -213
  106. package/templates/standalone/tests/Makefile +0 -5
  107. package/templates/standalone/tests/index.test.js +0 -283
  108. package/templates/standalone/tests/package-lock.json +0 -1617
  109. package/templates/standalone/tests/package.json +0 -16
  110. package/templates/standalone/tests/vitest.config.mjs +0 -26
  111. package/templates/standalone/tsconfig.json +0 -31
  112. package/templates/standalone/vitest.config.mts +0 -31
  113. package/templates/standalone/vitest.supertest-loopback.mts +0 -278
  114. package/templates/versions.json +0 -20
@@ -1,229 +0,0 @@
1
- # Production compose example (#293 item 16).
2
- #
3
- # `docker-compose.yml` is a DEVELOPMENT file: it builds the `develop` target
4
- # and bind-mounts ./src and ./config into the container, so copy-paste
5
- # deploying it ships a hot-reload server running your working tree. This file
6
- # is the deployable shape: the `runtime` target (compiled JS only, tini,
7
- # healthcheck), no source mounts, restart policies, and a Redis that is
8
- # reachable from the app network only and persists to a volume.
9
- #
10
- # openssl genpkey -algorithm ed25519 -out jwt-private.pem
11
- # openssl pkey -in jwt-private.pem -pubout -out jwt-public.pem
12
- # chmod 600 jwt-private.pem
13
- # docker compose -f docker-compose.production.yml up -d --build
14
- #
15
- # The pem pair is required: EdDSA is the default and there is no key-material
16
- # default, so a deployment that generates none fails at boot naming the keys to
17
- # set. It reaches the container as a compose secret rather than through
18
- # `config/`, which the image COPYs — see the `secrets:` block below. So does
19
- # the client registry, `config/clients.yaml` (#705): it is per-deployment, so
20
- # `.gitignore` keeps it out of git and `.dockerignore` out of the image, and
21
- # the image carries no registry of its own. Create it from
22
- # `config/clients.yaml.example` before the first `up`.
23
- #
24
- # What this file deliberately does NOT do:
25
- #
26
- # - **TLS.** Terminate it in front (reverse proxy / load balancer). The
27
- # HTTP_TRUST_PROXY entry below then needs that hop's address so `req.ip` —
28
- # and every IP-keyed rate limit — means the client, not the proxy; compose
29
- # refuses to start until you supply it. See README "Multi-replica
30
- # deployments".
31
- # - **Scale out.** This is one replica (CORE_DEPLOYMENT_MODE=single). Before
32
- # `--scale app=N`, set CORE_DEPLOYMENT_MODE=multi and read that same README
33
- # section — boot will then refuse any in-memory store that must be shared.
34
- # - **Invent secrets.** SESSION_STORE_SECRET comes from `.env`, which is required
35
- # here — chmod 600 it, keep it out of git (`git local-files` or your secret
36
- # manager of choice), and never bake it into the image. The client
37
- # registry's secrets are yours to write too; give them as bcrypt hashes.
38
-
39
- services:
40
- app:
41
- build:
42
- context: .
43
- target: runtime
44
- restart: unless-stopped
45
- ports:
46
- # Loopback-bound on purpose (#407). This file assumes TLS is terminated
47
- # in front, and the README says to keep `/metrics` off the public
48
- # listener — a bare "3000:3000" publishes on every interface and
49
- # contradicts both. A reverse proxy on the same host reaches it here.
50
- #
51
- # If your load balancer is on another host, publish it instead
52
- # (`- "3000:3000"`) and put the access control somewhere real: a
53
- # security group, a firewall rule, or the proxy's own network. Do not
54
- # widen this line and call it done.
55
- - "127.0.0.1:3000:3000"
56
- # Compose's default grace is ten seconds — the HTTP drain
57
- # budget alone. With federation grants on, `src/app.mts` gives cleanup 45
58
- # more for the drain of a rotated upstream credential's write, and SIGKILL
59
- # has to arrive after that: drain (10) + cleanup (45) + an exit margin.
60
- # The cleanup allowance grows by itself with `federation-grants.upstreamHardTimeoutMs`,
61
- # `persistRetryBudgetMs` and `lockWaitMs`; raise this to match when you raise them.
62
- stop_grace_period: 60s
63
- depends_on:
64
- redis:
65
- condition: service_healthy
66
- env_file:
67
- # Required, unlike the dev file: a production boot without
68
- # SESSION_STORE_SECRET (or with the sample one) must fail loudly here, not
69
- # serve quietly with a guessable secret.
70
- - path: .env
71
- required: true
72
- secrets:
73
- # The signing keys. EdDSA is the default algorithm and there is no key
74
- # material default, so the process needs the pem pair at boot — and the
75
- # `runtime` image deliberately does not contain it: `Dockerfile` COPYs
76
- # `config/`, so a key parked there is baked into a layer that travels
77
- # with every image push. Compose secrets mount read-only under
78
- # /run/secrets and are the reason the env below overrides the
79
- # `./jwt-*.pem` paths in `.env.example`.
80
- #
81
- # Generate them next to this file before the first `up`:
82
- # openssl genpkey -algorithm ed25519 -out jwt-private.pem
83
- # openssl pkey -in jwt-private.pem -pubout -out jwt-public.pem
84
- # chmod 600 jwt-private.pem
85
- - jwt_private_key
86
- - jwt_public_key
87
- # The client registry (#705), for the same reason: `config/clients.yaml`
88
- # is per-deployment and may hold client secrets, so it is kept out of the
89
- # image and mounted here. REPOSITORIES_CLIENT_YAML_PATH below points the process at it.
90
- - client_registry
91
- environment:
92
- NODE_ENV: production
93
- # One replica. Under `single` the replica-safety guard is SILENT by
94
- # design — you have told it there are no peers — so it will not tell you
95
- # that a store below is on memory while its sibling is on Redis. That is
96
- # why the adapter block further down states every one of them explicitly
97
- # instead of leaving them to inherit. Before `--scale app=N`, set `multi`
98
- # and read the README's "Multi-replica deployments".
99
- CORE_DEPLOYMENT_MODE: single
100
- # Behind the TLS terminator this file assumes, `req.ip` is the proxy's
101
- # address and `req.protocol` reads `http` until this names the hop. The
102
- # README calls it required for exactly that reason, and the cost of
103
- # leaving it unset is three failures at once: the Secure cookie pinned
104
- # below is never set, the CSRF origin check 403s every browser POST
105
- # (the browser sends `Origin: https://…`, the process believes it is
106
- # serving http), and every IP-keyed rate limit — the OAuth endpoint
107
- # limiters and the /session/login brute-force guard — shares ONE bucket
108
- # across all users.
109
- #
110
- # It cannot be guessed and it is not defaulted: only you know what sits
111
- # in front, and a default here would silently trust a hop you never
112
- # chose. Put your edge's address or CIDR range in `.env` — `10.0.0.0/8`,
113
- # or `loopback` for a sidecar on this host. Prefer that over `true`,
114
- # which believes a forwarded client address from anyone able to reach
115
- # this process. The `:?` form makes compose refuse to start until it is
116
- # set, rather than starting wrong.
117
- HTTP_TRUST_PROXY: ${HTTP_TRUST_PROXY:?set to your TLS terminator's address or CIDR range (e.g. 10.0.0.0/8, or `loopback` for a same-host sidecar) — never `true` behind an open network}
118
- # Point the process at the mounted secrets rather than the working-copy
119
- # paths `.env` carries for local runs.
120
- KEY_STORE_LOCAL_PRIVATE_KEY_PATH: /run/secrets/jwt_private_key
121
- KEY_STORE_LOCAL_PUBLIC_KEY_PATH: /run/secrets/jwt_public_key
122
- REPOSITORIES_CLIENT_YAML_PATH: /run/secrets/client_registry
123
- # `environment` wins over `env_file`, which is the point here:
124
- # `.env.example` ships SESSION_STORE_SECURE=false / SESSION_STORE_NAME=auth.sid so a
125
- # plain-HTTP local run works, and this file requires that same `.env`.
126
- # Behind the TLS this compose assumes, a non-Secure session cookie is the
127
- # session handed to anyone who can read one plaintext hop. The default
128
- # `__Host-` cookie name is restored with it — the prefix browsers only
129
- # honour on a Secure cookie.
130
- SESSION_STORE_SECURE: "true"
131
- SESSION_STORE_NAME: __Host-auth.session
132
- # Every Redis-backed store shares the compose-network Redis below.
133
- #
134
- # These are stated in full rather than inherited from
135
- # `config/reference.conf`, so that the deployable file names its own
136
- # topology: an operator reading only this one can see which stores
137
- # survive a restart. `ADAPTERS_CODE_REPOSITORY` and
138
- # `ADAPTERS_ACCESS_TOKEN_DENYLIST` already ship as `redis` in that file
139
- # and are left there on purpose — restating a value that agrees is
140
- # a second place to forget to change.
141
- REDIS_CLIENTS_URL: redis://redis:6379
142
- SESSION_STORE_STORAGE_TYPE: redis
143
- SESSION_STORE_STORAGE_REDIS_URL: redis://redis:6379
144
- # The UserSession stores: the provider's own record of who is signed in,
145
- # the subject index and revocation boundaries beside it, and the session
146
- # lifecycle records. They MUST be on Redis whenever the express-session
147
- # store above is, and this line is the fix for what happens when they
148
- # are not.
149
- #
150
- # express-session on Redis survives a restart; a memory UserSession store
151
- # does not. So every browser comes back holding a session cookie whose
152
- # express-session record still says `isAuthenticated: true`, while the
153
- # `UserSession` that record points at is gone — /authorize sees an
154
- # authenticated session, finds no user session behind it, and sends the
155
- # browser to log in again, where the still-valid cookie puts it straight
156
- # back. A login loop that clears only when the user deletes the cookie.
157
- # `CORE_DEPLOYMENT_MODE: single` says nothing about it: the replica guard
158
- # answers "can these stores be shared", not "do these two stores have the
159
- # same lifetime".
160
- ADAPTERS_USER_SESSION_STORES: redis
161
- # The memory rate limiter is per-process and evadable under bucket
162
- # exhaustion (see README) — production points it at Redis.
163
- ADAPTERS_RATE_LIMITER: redis
164
- # The counter behind the login's own attempt limit: on Redis, a restart
165
- # does not reset it. Redis must keep `maxmemory-policy noeviction`.
166
- ADAPTERS_ATTEMPT_COUNTER: redis
167
- # The federation token store is deliberately left at its `memory`
168
- # default, and that is coherent here rather than an oversight: this
169
- # template ships every federation disabled, so nothing writes to the
170
- # store, and switching it on would need a 32-byte AES key
171
- # (REDIS_FEDERATION_TOKEN_STORE_ENCRYPTION_KEY) that this file must not
172
- # invent — the records are long-lived upstream refresh tokens. Enabling
173
- # a federation means setting BOTH, together:
174
- # ADAPTERS_FEDERATION_TOKEN_STORE: redis
175
- # REDIS_FEDERATION_TOKEN_STORE_ENCRYPTION_KEY: <openssl rand -base64 32, from .env>
176
- #
177
- # MFA is on by default (MFA_MODE, `required`): every password login
178
- # needs a second factor. Its two stores are left at their `memory`
179
- # default, which the template refuses in production before boot; that
180
- # refusal names everything MFA needs and the opt-out, so it is the first
181
- # thing a deployment that has decided nothing about MFA meets. Decide in
182
- # `.env`: either turn it on with all of
183
- # ADAPTERS_MFA_FACTOR_STORE=redis (or `store`, the factors in your Store)
184
- # ADAPTERS_MFA_TRANSACTION_STORE=redis
185
- # MFA_ENCRYPTION_KEY=<openssl rand -base64 32>
186
- # STANDARD_SMTP_MAIL_SENDER_HOST=... and STANDARD_SMTP_MAIL_SENDER_FROM=...
187
- # MFA_PAGE_URL=<your MFA page, /mfa by default>
188
- # or keep the provider without MFA:
189
- # MFA_MODE=off
190
- # The Redis below persists (appendonly), as the MFA stores need: a lost
191
- # factor lets whoever holds the password bind one of their own.
192
-
193
- redis:
194
- # Tag-pinned, not digest-pinned. The Dockerfile argues for digests (#289)
195
- # and that argument holds here too — a tag is mutable, so two `up`s a month
196
- # apart can run different Redis builds. Pin the digest for a production
197
- # deployment you need to reproduce:
198
- # image: redis:7.2-alpine@sha256:<digest>
199
- # Left as a tag in the template because a digest goes stale the week it is
200
- # written and a scaffold that ships a stale one teaches nothing (#407).
201
- image: redis:7.2-alpine
202
- restart: unless-stopped
203
- # No `ports:`, deliberately — the app reaches Redis over the compose
204
- # network, and nothing else should. The dev file publishes 6379 to
205
- # loopback for redis-cli convenience; a published production Redis with
206
- # no AUTH is an incident.
207
- command: ["redis-server", "--appendonly", "yes"]
208
- volumes:
209
- - redis-data:/data
210
- healthcheck:
211
- test: ["CMD", "redis-cli", "ping"]
212
- interval: 5s
213
- timeout: 3s
214
- retries: 5
215
-
216
- volumes:
217
- redis-data:
218
-
219
- secrets:
220
- # File-backed, so the pem pair and the client registry stay on the host and
221
- # reach the container read-only at /run/secrets. Keep them out of git
222
- # alongside `.env`; a key committed or COPYed into the image is a key you
223
- # have to rotate.
224
- jwt_private_key:
225
- file: ./jwt-private.pem
226
- jwt_public_key:
227
- file: ./jwt-public.pem
228
- client_registry:
229
- file: ./config/clients.yaml
@@ -1,16 +0,0 @@
1
- services:
2
- test:
3
- build:
4
- context: .
5
- target: test
6
- depends_on:
7
- redis:
8
- condition: service_healthy
9
-
10
- redis:
11
- image: redis:7.2-alpine
12
- healthcheck:
13
- test: ["CMD", "redis-cli", "ping"]
14
- interval: 5s
15
- timeout: 3s
16
- retries: 5
@@ -1,67 +0,0 @@
1
- services:
2
- app:
3
- build:
4
- context: .
5
- target: develop
6
- ports:
7
- - "3000:3000"
8
- volumes:
9
- - ./src:/home/node/src
10
- - ./config:/home/node/config
11
- # Compose's default grace is ten seconds — the HTTP drain
12
- # budget alone. With federation grants on, `src/app.mts` gives cleanup 45
13
- # more for the drain of a rotated upstream credential's write, and SIGKILL
14
- # has to arrive after that: drain (10) + cleanup (45) + an exit margin.
15
- # The cleanup allowance grows by itself with `federation-grants.upstreamHardTimeoutMs`,
16
- # `persistRetryBudgetMs` and `lockWaitMs`; raise this to match when you raise them.
17
- stop_grace_period: 60s
18
- depends_on:
19
- redis:
20
- condition: service_healthy
21
- env_file:
22
- - path: .env
23
- required: false
24
- environment:
25
- # The same coherence the production file states, for the same reason,
26
- # and it matters MORE here. `config/application.conf` already puts
27
- # express-session, the authorization codes and the access-token denylist
28
- # on the Redis this compose runs; only the UserSession stores were left
29
- # on their `memory` default. That combination survives a restart on one
30
- # side and not the other, so every browser comes back holding an
31
- # express-session that still says `isAuthenticated` with no `UserSession`
32
- # behind it and /authorize loops.
33
- #
34
- # A dev container restarts on every save (`target: develop` is hot
35
- # reload), so the developer meets that loop constantly — and meets it
36
- # while changing something else, which is the worst possible time to
37
- # debug it. Redis is already running and already required by three other
38
- # stores, so this costs nothing: the shared ioredis socket is open
39
- # either way.
40
- ADAPTERS_USER_SESSION_STORES: redis
41
- # MFA is on by default (MFA_MODE). Its two stores ship in memory, which
42
- # this run would empty on every save: every enrolled factor gone while
43
- # the sessions above survive, so each password login after a save binds
44
- # a factor anew. On the Redis above they last as the sessions do. These
45
- # lines, like ADAPTERS_USER_SESSION_STORES above, override `.env`:
46
- # compose's `environment:` wins over `env_file`. The key ring is
47
- # config/development.conf's sample key and the mail sender logs each
48
- # code; MFA_MODE=off in .env runs without MFA.
49
- ADAPTERS_MFA_FACTOR_STORE: redis
50
- ADAPTERS_MFA_TRANSACTION_STORE: redis
51
-
52
- redis:
53
- # Tag-pinned, not digest-pinned. The Dockerfile argues for digests (#289)
54
- # and that argument holds here too — a tag is mutable, so two `up`s a month
55
- # apart can run different Redis builds. Pin the digest for a production
56
- # deployment you need to reproduce:
57
- # image: redis:7.2-alpine@sha256:<digest>
58
- # Left as a tag in the template because a digest goes stale the week it is
59
- # written and a scaffold that ships a stale one teaches nothing (#407).
60
- image: redis:7.2-alpine
61
- ports:
62
- - "127.0.0.1:6379:6379"
63
- healthcheck:
64
- test: ["CMD", "redis-cli", "ping"]
65
- interval: 5s
66
- timeout: 3s
67
- retries: 5
@@ -1,23 +0,0 @@
1
- # #407: without this file, the first `git add .` in a scaffolded project
2
- # commits the two things a local setup creates right here — the signing key
3
- # pair the README's Usage generates, and the `.env` (holding SESSION_SECRET)
4
- # the compose files read.
5
-
6
- # Secrets and per-machine configuration
7
- # `.dockerignore` keeps the same out of the image (#705); change both together.
8
- .env
9
- .env.*
10
- !.env.example
11
- *.pem
12
- *.key
13
- config/clients.yaml
14
- config/*.local.conf
15
-
16
- # Build output and dependencies
17
- node_modules/
18
- dist/
19
- coverage/
20
-
21
- # Editor / OS noise
22
- .DS_Store
23
- *.log
@@ -1,56 +0,0 @@
1
- {
2
- "name": "@o3co/auth-provider-standalone",
3
- "version": "0.17.0",
4
- "private": true,
5
- "license": "Apache-2.0",
6
- "engines": {
7
- "node": ">=22.0.0"
8
- },
9
- "packageManager": "pnpm@10.29.3",
10
- "type": "module",
11
- "scripts": {
12
- "build": "tsc",
13
- "start": "node dist/app.mjs",
14
- "debug": "NODE_OPTIONS='--conditions=development' tsx watch src/app.mts",
15
- "test": "tsc --noEmit && vitest run --passWithNoTests"
16
- },
17
- "imports": {
18
- "#/*": {
19
- "development": "./src/*",
20
- "default": "./dist/*"
21
- }
22
- },
23
- "dependencies": {
24
- "@o3co/auth-provider-core": "workspace:*",
25
- "@o3co/auth-provider-federation-google": "workspace:*",
26
- "@o3co/auth-provider-federation-grants": "workspace:*",
27
- "@o3co/auth-provider-federation-oidc": "workspace:*",
28
- "@o3co/auth-provider-foundation": "workspace:*",
29
- "@o3co/auth-provider-mfa": "workspace:*",
30
- "@o3co/auth-provider-oauth": "workspace:*",
31
- "@o3co/auth-provider-redis": "workspace:*",
32
- "@o3co/auth-provider-session": "workspace:*",
33
- "@o3co/auth-provider-standard": "workspace:*",
34
- "@o3co/ts.hocon": "^1.13.0",
35
- "connect-redis": "^10.0.0",
36
- "express": "^5.2.1",
37
- "express-session": "^1.19.0",
38
- "helmet": "^8.3.0",
39
- "ioredis": "^6.0.0",
40
- "pino": "^10.4.0",
41
- "prom-client": "^15.1.3",
42
- "redis": "^6.3.0",
43
- "zod": "^4.6.5"
44
- },
45
- "devDependencies": {
46
- "@o3co/auth-provider-test-kit": "workspace:*",
47
- "@types/express": "^5.0.6",
48
- "@types/express-session": "^1",
49
- "@types/node": "^26.6.4",
50
- "@types/supertest": "^7.2.1",
51
- "supertest": "^7.3.1",
52
- "tsx": "^4.23.15",
53
- "typescript": "^6.0.3",
54
- "vitest": "^5.0.3"
55
- }
56
- }