@stackframe/stack-shared 2.8.8 → 2.8.11
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 +14 -0
- package/dist/config/format.d.cts +39 -0
- package/dist/config/format.d.ts +14 -13
- package/dist/config/format.js +147 -206
- package/dist/config/format.js.map +1 -0
- package/dist/config/schema.d.cts +729 -0
- package/dist/config/schema.d.ts +59 -51
- package/dist/config/schema.js +232 -172
- package/dist/config/schema.js.map +1 -0
- package/dist/crud.d.cts +102 -0
- package/dist/crud.d.ts +15 -13
- package/dist/crud.js +83 -128
- package/dist/crud.js.map +1 -0
- package/dist/esm/config/format.js +135 -0
- package/dist/esm/config/format.js.map +1 -0
- package/dist/esm/config/schema.js +201 -0
- package/dist/esm/config/schema.js.map +1 -0
- package/dist/esm/crud.js +60 -0
- package/dist/esm/crud.js.map +1 -0
- package/dist/esm/global.d.js +1 -0
- package/dist/esm/global.d.js.map +1 -0
- package/dist/esm/helpers/password.js +17 -0
- package/dist/esm/helpers/password.js.map +1 -0
- package/dist/esm/helpers/production-mode.js +50 -0
- package/dist/esm/helpers/production-mode.js.map +1 -0
- package/dist/esm/hooks/use-async-callback.js +38 -0
- package/dist/esm/hooks/use-async-callback.js.map +1 -0
- package/dist/esm/hooks/use-async-external-store.js +23 -0
- package/dist/esm/hooks/use-async-external-store.js.map +1 -0
- package/dist/esm/hooks/use-hash.js +17 -0
- package/dist/esm/hooks/use-hash.js.map +1 -0
- package/dist/esm/hooks/use-strict-memo.js +61 -0
- package/dist/esm/hooks/use-strict-memo.js.map +1 -0
- package/dist/esm/index.js +22 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interface/adminInterface.js +244 -0
- package/dist/esm/interface/adminInterface.js.map +1 -0
- package/dist/esm/interface/clientInterface.js +2041 -0
- package/dist/esm/interface/clientInterface.js.map +1 -0
- package/dist/esm/interface/crud/contact-channels.js +77 -0
- package/dist/esm/interface/crud/contact-channels.js.map +1 -0
- package/dist/esm/interface/crud/current-user.js +65 -0
- package/dist/esm/interface/crud/current-user.js.map +1 -0
- package/dist/esm/interface/crud/email-templates.js +52 -0
- package/dist/esm/interface/crud/email-templates.js.map +1 -0
- package/dist/esm/interface/crud/emails.js +20 -0
- package/dist/esm/interface/crud/emails.js.map +1 -0
- package/dist/esm/interface/crud/internal-api-keys.js +69 -0
- package/dist/esm/interface/crud/internal-api-keys.js.map +1 -0
- package/dist/esm/interface/crud/oauth.js +24 -0
- package/dist/esm/interface/crud/oauth.js.map +1 -0
- package/dist/esm/interface/crud/project-api-keys.js +93 -0
- package/dist/esm/interface/crud/project-api-keys.js.map +1 -0
- package/dist/esm/interface/crud/project-permissions.js +113 -0
- package/dist/esm/interface/crud/project-permissions.js.map +1 -0
- package/dist/esm/interface/crud/projects.js +180 -0
- package/dist/esm/interface/crud/projects.js.map +1 -0
- package/dist/esm/interface/crud/sessions.js +62 -0
- package/dist/esm/interface/crud/sessions.js.map +1 -0
- package/dist/esm/interface/crud/svix-token.js +22 -0
- package/dist/esm/interface/crud/svix-token.js.map +1 -0
- package/dist/esm/interface/crud/team-invitation-details.js +23 -0
- package/dist/esm/interface/crud/team-invitation-details.js.map +1 -0
- package/dist/esm/interface/crud/team-invitation.js +36 -0
- package/dist/esm/interface/crud/team-invitation.js.map +1 -0
- package/dist/esm/interface/crud/team-member-profiles.js +62 -0
- package/dist/esm/interface/crud/team-member-profiles.js.map +1 -0
- package/dist/esm/interface/crud/team-memberships.js +60 -0
- package/dist/esm/interface/crud/team-memberships.js.map +1 -0
- package/dist/esm/interface/crud/team-permissions.js +114 -0
- package/dist/esm/interface/crud/team-permissions.js.map +1 -0
- package/dist/esm/interface/crud/teams.js +143 -0
- package/dist/esm/interface/crud/teams.js.map +1 -0
- package/dist/esm/interface/crud/users.js +139 -0
- package/dist/esm/interface/crud/users.js.map +1 -0
- package/dist/esm/interface/serverInterface.js +485 -0
- package/dist/esm/interface/serverInterface.js.map +1 -0
- package/dist/esm/interface/webhooks.js +21 -0
- package/dist/esm/interface/webhooks.js.map +1 -0
- package/dist/esm/known-errors.js +1238 -0
- package/dist/esm/known-errors.js.map +1 -0
- package/dist/esm/schema-fields.js +484 -0
- package/dist/esm/schema-fields.js.map +1 -0
- package/dist/esm/sessions.js +168 -0
- package/dist/esm/sessions.js.map +1 -0
- package/dist/esm/utils/api-keys.js +79 -0
- package/dist/esm/utils/api-keys.js.map +1 -0
- package/dist/esm/utils/arrays.js +78 -0
- package/dist/esm/utils/arrays.js.map +1 -0
- package/dist/esm/utils/base64.js +18 -0
- package/dist/esm/utils/base64.js.map +1 -0
- package/dist/esm/utils/booleans.js +12 -0
- package/dist/esm/utils/booleans.js.map +1 -0
- package/dist/esm/utils/browser-compat.js +21 -0
- package/dist/esm/utils/browser-compat.js.map +1 -0
- package/dist/esm/utils/bytes.js +160 -0
- package/dist/esm/utils/bytes.js.map +1 -0
- package/dist/esm/utils/caches.js +167 -0
- package/dist/esm/utils/caches.js.map +1 -0
- package/dist/esm/utils/compile-time.js +11 -0
- package/dist/esm/utils/compile-time.js.map +1 -0
- package/dist/esm/utils/crypto.js +25 -0
- package/dist/esm/utils/crypto.js.map +1 -0
- package/dist/esm/utils/dates.js +64 -0
- package/dist/esm/utils/dates.js.map +1 -0
- package/dist/esm/utils/dom.js +11 -0
- package/dist/esm/utils/dom.js.map +1 -0
- package/dist/esm/utils/env.js +58 -0
- package/dist/esm/utils/env.js.map +1 -0
- package/dist/esm/utils/errors.js +174 -0
- package/dist/esm/utils/errors.js.map +1 -0
- package/dist/esm/utils/fs.js +37 -0
- package/dist/esm/utils/fs.js.map +1 -0
- package/dist/esm/utils/functions.js +12 -0
- package/dist/esm/utils/functions.js.map +1 -0
- package/dist/esm/utils/geo.js +15 -0
- package/dist/esm/utils/geo.js.map +1 -0
- package/dist/esm/utils/globals.js +18 -0
- package/dist/esm/utils/globals.js.map +1 -0
- package/dist/esm/utils/hashes.js +55 -0
- package/dist/esm/utils/hashes.js.map +1 -0
- package/dist/esm/utils/html.js +13 -0
- package/dist/esm/utils/html.js.map +1 -0
- package/dist/esm/utils/http.js +60 -0
- package/dist/esm/utils/http.js.map +1 -0
- package/dist/esm/utils/ips.js +15 -0
- package/dist/esm/utils/ips.js.map +1 -0
- package/dist/esm/utils/json.js +31 -0
- package/dist/esm/utils/json.js.map +1 -0
- package/dist/esm/utils/jwt.js +87 -0
- package/dist/esm/utils/jwt.js.map +1 -0
- package/dist/esm/utils/locks.js +57 -0
- package/dist/esm/utils/locks.js.map +1 -0
- package/dist/esm/utils/maps.js +181 -0
- package/dist/esm/utils/maps.js.map +1 -0
- package/dist/esm/utils/math.js +8 -0
- package/dist/esm/utils/math.js.map +1 -0
- package/dist/esm/utils/node-http.js +42 -0
- package/dist/esm/utils/node-http.js.map +1 -0
- package/dist/esm/utils/numbers.js +32 -0
- package/dist/esm/utils/numbers.js.map +1 -0
- package/dist/esm/utils/oauth.js +10 -0
- package/dist/esm/utils/oauth.js.map +1 -0
- package/dist/esm/utils/objects.js +177 -0
- package/dist/esm/utils/objects.js.map +1 -0
- package/dist/esm/utils/passkey.js +1 -0
- package/dist/esm/utils/passkey.js.map +1 -0
- package/dist/esm/utils/promises.js +233 -0
- package/dist/esm/utils/promises.js.map +1 -0
- package/dist/esm/utils/proxies.js +128 -0
- package/dist/esm/utils/proxies.js.map +1 -0
- package/dist/esm/utils/react.js +78 -0
- package/dist/esm/utils/react.js.map +1 -0
- package/dist/esm/utils/results.js +141 -0
- package/dist/esm/utils/results.js.map +1 -0
- package/dist/esm/utils/sentry.js +20 -0
- package/dist/esm/utils/sentry.js.map +1 -0
- package/dist/esm/utils/stores.js +195 -0
- package/dist/esm/utils/stores.js.map +1 -0
- package/dist/esm/utils/strings.js +295 -0
- package/dist/esm/utils/strings.js.map +1 -0
- package/dist/esm/utils/strings.nicify.test.js +222 -0
- package/dist/esm/utils/strings.nicify.test.js.map +1 -0
- package/dist/esm/utils/types.js +1 -0
- package/dist/esm/utils/types.js.map +1 -0
- package/dist/esm/utils/unicode.js +11 -0
- package/dist/esm/utils/unicode.js.map +1 -0
- package/dist/esm/utils/urls.js +53 -0
- package/dist/esm/utils/urls.js.map +1 -0
- package/dist/esm/utils/uuids.js +16 -0
- package/dist/esm/utils/uuids.js.map +1 -0
- package/dist/global.d.d.cts +1 -0
- package/dist/global.d.d.ts +1 -0
- package/dist/global.d.js +2 -0
- package/dist/global.d.js.map +1 -0
- package/dist/helpers/password.d.cts +11 -0
- package/dist/helpers/password.d.ts +11 -2
- package/dist/helpers/password.js +41 -11
- package/dist/helpers/password.js.map +1 -0
- package/dist/helpers/production-mode.d.cts +12 -0
- package/dist/helpers/production-mode.d.ts +9 -3
- package/dist/helpers/production-mode.js +72 -45
- package/dist/helpers/production-mode.js.map +1 -0
- package/dist/hooks/use-async-callback.d.cts +6 -0
- package/dist/hooks/use-async-callback.d.ts +6 -3
- package/dist/hooks/use-async-callback.js +72 -30
- package/dist/hooks/use-async-callback.js.map +1 -0
- package/dist/hooks/use-async-external-store.d.cts +7 -0
- package/dist/hooks/use-async-external-store.d.ts +5 -2
- package/dist/hooks/use-async-external-store.js +47 -19
- package/dist/hooks/use-async-external-store.js.map +1 -0
- package/dist/hooks/use-hash.d.cts +3 -0
- package/dist/hooks/use-hash.d.ts +3 -1
- package/dist/hooks/use-hash.js +41 -8
- package/dist/hooks/use-hash.js.map +1 -0
- package/dist/hooks/use-strict-memo.d.cts +8 -0
- package/dist/hooks/use-strict-memo.d.ts +3 -1
- package/dist/hooks/use-strict-memo.js +78 -131
- package/dist/hooks/use-strict-memo.js.map +1 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -4
- package/dist/index.js +42 -4
- package/dist/index.js.map +1 -0
- package/dist/interface/adminInterface.d.cts +94 -0
- package/dist/interface/adminInterface.d.ts +38 -15
- package/dist/interface/adminInterface.js +269 -174
- package/dist/interface/adminInterface.js.map +1 -0
- package/dist/interface/clientInterface.d.cts +260 -0
- package/dist/interface/clientInterface.d.ts +25 -18
- package/dist/interface/clientInterface.js +2054 -995
- package/dist/interface/clientInterface.js.map +1 -0
- package/dist/interface/crud/contact-channels.d.cts +180 -0
- package/dist/interface/crud/contact-channels.d.ts +30 -25
- package/dist/interface/crud/contact-channels.js +101 -59
- package/dist/interface/crud/contact-channels.js.map +1 -0
- package/dist/interface/crud/current-user.d.cts +205 -0
- package/dist/interface/crud/current-user.d.ts +17 -12
- package/dist/interface/crud/current-user.js +86 -56
- package/dist/interface/crud/current-user.js.map +1 -0
- package/dist/interface/crud/email-templates.d.cts +84 -0
- package/dist/interface/crud/email-templates.d.ts +24 -19
- package/dist/interface/crud/email-templates.js +77 -37
- package/dist/interface/crud/email-templates.js.map +1 -0
- package/dist/interface/crud/emails.d.cts +69 -0
- package/dist/interface/crud/emails.d.ts +12 -7
- package/dist/interface/crud/emails.js +54 -12
- package/dist/interface/crud/emails.js.map +1 -0
- package/dist/interface/crud/internal-api-keys.d.cts +139 -0
- package/dist/interface/crud/internal-api-keys.d.ts +22 -17
- package/dist/interface/crud/internal-api-keys.js +92 -54
- package/dist/interface/crud/internal-api-keys.js.map +1 -0
- package/dist/interface/crud/oauth.d.cts +34 -0
- package/dist/interface/crud/oauth.d.ts +16 -11
- package/dist/interface/crud/oauth.js +48 -14
- package/dist/interface/crud/oauth.js.map +1 -0
- package/dist/interface/crud/project-api-keys.d.cts +196 -0
- package/dist/interface/crud/project-api-keys.d.ts +20 -12
- package/dist/interface/crud/project-api-keys.js +121 -74
- package/dist/interface/crud/project-api-keys.js.map +1 -0
- package/dist/interface/crud/project-permissions.d.cts +160 -0
- package/dist/interface/crud/project-permissions.d.ts +38 -33
- package/dist/interface/crud/project-permissions.js +148 -90
- package/dist/interface/crud/project-permissions.js.map +1 -0
- package/dist/interface/crud/projects.d.cts +627 -0
- package/dist/interface/crud/projects.d.ts +43 -51
- package/dist/interface/crud/projects.js +210 -156
- package/dist/interface/crud/projects.js.map +1 -0
- package/dist/interface/crud/sessions.d.cts +149 -0
- package/dist/interface/crud/sessions.d.ts +21 -16
- package/dist/interface/crud/sessions.js +86 -50
- package/dist/interface/crud/sessions.js.map +1 -0
- package/dist/interface/crud/svix-token.d.cts +26 -0
- package/dist/interface/crud/svix-token.d.ts +14 -9
- package/dist/interface/crud/svix-token.js +46 -12
- package/dist/interface/crud/svix-token.js.map +1 -0
- package/dist/interface/crud/team-invitation-details.d.cts +30 -0
- package/dist/interface/crud/team-invitation-details.d.ts +12 -7
- package/dist/interface/crud/team-invitation-details.js +57 -15
- package/dist/interface/crud/team-invitation-details.js.map +1 -0
- package/dist/interface/crud/team-invitation.d.cts +49 -0
- package/dist/interface/crud/team-invitation.d.ts +13 -8
- package/dist/interface/crud/team-invitation.js +69 -27
- package/dist/interface/crud/team-invitation.js.map +1 -0
- package/dist/interface/crud/team-member-profiles.d.cts +229 -0
- package/dist/interface/crud/team-member-profiles.d.ts +20 -15
- package/dist/interface/crud/team-member-profiles.js +95 -49
- package/dist/interface/crud/team-member-profiles.js.map +1 -0
- package/dist/interface/crud/team-memberships.d.cts +74 -0
- package/dist/interface/crud/team-memberships.d.ts +22 -17
- package/dist/interface/crud/team-memberships.js +85 -45
- package/dist/interface/crud/team-memberships.js.map +1 -0
- package/dist/interface/crud/team-permissions.d.cts +168 -0
- package/dist/interface/crud/team-permissions.d.ts +38 -33
- package/dist/interface/crud/team-permissions.js +149 -91
- package/dist/interface/crud/team-permissions.js.map +1 -0
- package/dist/interface/crud/teams.d.cts +298 -0
- package/dist/interface/crud/teams.d.ts +45 -40
- package/dist/interface/crud/teams.js +177 -119
- package/dist/interface/crud/teams.js.map +1 -0
- package/dist/interface/crud/users.d.cts +469 -0
- package/dist/interface/crud/users.d.ts +31 -26
- package/dist/interface/crud/users.js +172 -118
- package/dist/interface/crud/users.js.map +1 -0
- package/dist/interface/serverInterface.d.cts +128 -0
- package/dist/interface/serverInterface.d.ts +29 -17
- package/dist/interface/serverInterface.js +506 -339
- package/dist/interface/serverInterface.js.map +1 -0
- package/dist/interface/webhooks.d.cts +292 -0
- package/dist/interface/webhooks.d.ts +6 -3
- package/dist/interface/webhooks.js +45 -15
- package/dist/interface/webhooks.js.map +1 -0
- package/dist/known-errors.d.cts +447 -0
- package/dist/known-errors.d.ts +15 -9
- package/dist/known-errors.js +1104 -562
- package/dist/known-errors.js.map +1 -0
- package/dist/schema-fields.d.cts +163 -0
- package/dist/schema-fields.d.ts +116 -114
- package/dist/schema-fields.js +593 -427
- package/dist/schema-fields.js.map +1 -0
- package/dist/sessions.d.cts +109 -0
- package/dist/sessions.d.ts +6 -3
- package/dist/sessions.js +201 -172
- package/dist/sessions.js.map +1 -0
- package/dist/utils/api-keys.d.cts +24 -0
- package/dist/utils/api-keys.d.ts +5 -4
- package/dist/utils/api-keys.js +106 -66
- package/dist/utils/api-keys.js.map +1 -0
- package/dist/utils/arrays.d.cts +18 -0
- package/dist/utils/arrays.d.ts +15 -13
- package/dist/utils/arrays.js +101 -168
- package/dist/utils/arrays.js.map +1 -0
- package/dist/utils/base64.d.cts +4 -0
- package/dist/utils/base64.d.ts +4 -2
- package/dist/utils/base64.js +41 -20
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/booleans.d.cts +6 -0
- package/dist/utils/booleans.d.ts +6 -4
- package/dist/utils/booleans.js +35 -27
- package/dist/utils/booleans.js.map +1 -0
- package/dist/utils/browser-compat.d.cts +8 -0
- package/dist/utils/browser-compat.d.ts +3 -1
- package/dist/utils/browser-compat.js +45 -16
- package/dist/utils/browser-compat.js.map +1 -0
- package/dist/utils/bytes.d.cts +15 -0
- package/dist/utils/bytes.d.ts +15 -13
- package/dist/utils/bytes.js +182 -270
- package/dist/utils/bytes.js.map +1 -0
- package/dist/utils/caches.d.cts +98 -0
- package/dist/utils/caches.d.ts +17 -14
- package/dist/utils/caches.js +188 -193
- package/dist/utils/caches.js.map +1 -0
- package/dist/utils/compile-time.d.cts +8 -0
- package/dist/utils/compile-time.d.ts +3 -1
- package/dist/utils/compile-time.js +35 -10
- package/dist/utils/compile-time.js.map +1 -0
- package/dist/utils/crypto.d.cts +8 -0
- package/dist/utils/crypto.d.ts +4 -2
- package/dist/utils/crypto.js +49 -21
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/dates.d.cts +15 -0
- package/dist/utils/dates.d.ts +6 -4
- package/dist/utils/dates.js +83 -105
- package/dist/utils/dates.js.map +1 -0
- package/dist/utils/dom.d.cts +3 -0
- package/dist/utils/dom.d.ts +3 -1
- package/dist/utils/dom.js +35 -7
- package/dist/utils/dom.js.map +1 -0
- package/dist/utils/env.d.cts +9 -0
- package/dist/utils/env.d.ts +6 -4
- package/dist/utils/env.js +70 -43
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/errors.d.cts +223 -0
- package/dist/utils/errors.d.ts +14 -11
- package/dist/utils/errors.js +148 -126
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fs.d.cts +7 -0
- package/dist/utils/fs.d.ts +5 -3
- package/dist/utils/fs.js +70 -27
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/functions.d.cts +4 -0
- package/dist/utils/functions.d.ts +4 -2
- package/dist/utils/functions.js +35 -18
- package/dist/utils/functions.js.map +1 -0
- package/dist/utils/geo.d.cts +22 -0
- package/dist/utils/geo.d.ts +6 -3
- package/dist/utils/geo.js +39 -9
- package/dist/utils/geo.js.map +1 -0
- package/dist/utils/globals.d.cts +5 -0
- package/dist/utils/globals.d.ts +4 -2
- package/dist/utils/globals.js +41 -14
- package/dist/utils/globals.js.map +1 -0
- package/dist/utils/hashes.d.cts +7 -0
- package/dist/utils/hashes.d.ts +7 -5
- package/dist/utils/hashes.js +87 -41
- package/dist/utils/hashes.js.map +1 -0
- package/dist/utils/html.d.cts +4 -0
- package/dist/utils/html.d.ts +4 -2
- package/dist/utils/html.js +36 -37
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/http.d.cts +43 -0
- package/dist/utils/http.d.ts +6 -4
- package/dist/utils/http.js +83 -83
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/ips.d.cts +6 -0
- package/dist/utils/ips.d.ts +6 -4
- package/dist/utils/ips.js +48 -35
- package/dist/utils/ips.js.map +1 -0
- package/dist/utils/json.d.cts +13 -0
- package/dist/utils/json.d.ts +9 -6
- package/dist/utils/json.js +54 -157
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/jwt.d.cts +44 -0
- package/dist/utils/jwt.d.ts +14 -11
- package/dist/utils/jwt.js +119 -84
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/locks.d.cts +15 -0
- package/dist/utils/locks.d.ts +3 -2
- package/dist/utils/locks.js +76 -56
- package/dist/utils/locks.js.map +1 -0
- package/dist/utils/maps.d.cts +59 -0
- package/dist/utils/maps.d.ts +6 -4
- package/dist/utils/maps.js +207 -343
- package/dist/utils/maps.js.map +1 -0
- package/dist/utils/math.d.cts +6 -0
- package/dist/utils/math.d.ts +3 -1
- package/dist/utils/math.js +31 -16
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/node-http.d.cts +15 -0
- package/dist/utils/node-http.d.ts +5 -5
- package/dist/utils/node-http.js +65 -36
- package/dist/utils/node-http.js.map +1 -0
- package/dist/utils/numbers.d.cts +5 -0
- package/dist/utils/numbers.d.ts +5 -3
- package/dist/utils/numbers.js +53 -66
- package/dist/utils/numbers.js.map +1 -0
- package/dist/utils/oauth.d.cts +8 -0
- package/dist/utils/oauth.d.ts +8 -6
- package/dist/utils/oauth.js +37 -4
- package/dist/utils/oauth.js.map +1 -0
- package/dist/utils/objects.d.cts +69 -0
- package/dist/utils/objects.d.ts +37 -32
- package/dist/utils/objects.js +224 -374
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/passkey.d.cts +1 -0
- package/dist/utils/passkey.d.ts +1 -1
- package/dist/utils/passkey.js +19 -1
- package/dist/utils/passkey.js.map +1 -0
- package/dist/utils/promises.d.cts +74 -0
- package/dist/utils/promises.d.ts +20 -18
- package/dist/utils/promises.js +252 -393
- package/dist/utils/promises.js.map +1 -0
- package/dist/utils/proxies.d.cts +4 -0
- package/dist/utils/proxies.d.ts +4 -2
- package/dist/utils/proxies.js +150 -161
- package/dist/utils/proxies.js.map +1 -0
- package/dist/utils/react.d.cts +25 -0
- package/dist/utils/react.d.ts +9 -6
- package/dist/utils/react.js +88 -134
- package/dist/utils/react.js.map +1 -0
- package/dist/utils/results.d.cts +78 -0
- package/dist/utils/results.d.ts +10 -9
- package/dist/utils/results.js +143 -324
- package/dist/utils/results.js.map +1 -0
- package/dist/utils/sentry.d.cts +5 -0
- package/dist/utils/sentry.d.ts +5 -2
- package/dist/utils/sentry.js +44 -14
- package/dist/utils/sentry.js.map +1 -0
- package/dist/utils/stores.d.cts +102 -0
- package/dist/utils/stores.d.ts +12 -9
- package/dist/utils/stores.js +219 -189
- package/dist/utils/stores.js.map +1 -0
- package/dist/utils/strings.d.cts +72 -0
- package/dist/utils/strings.d.ts +22 -20
- package/dist/utils/strings.js +300 -580
- package/dist/utils/strings.js.map +1 -0
- package/dist/utils/strings.nicify.test.d.cts +2 -0
- package/dist/utils/strings.nicify.test.d.ts +2 -1
- package/dist/utils/strings.nicify.test.js +168 -158
- package/dist/utils/strings.nicify.test.js.map +1 -0
- package/dist/utils/types.d.cts +23 -0
- package/dist/utils/types.d.ts +8 -6
- package/dist/utils/types.js +19 -1
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/unicode.d.cts +3 -0
- package/dist/utils/unicode.d.ts +3 -1
- package/dist/utils/unicode.js +34 -21
- package/dist/utils/unicode.js.map +1 -0
- package/dist/utils/urls.d.cts +20 -0
- package/dist/utils/urls.d.ts +10 -8
- package/dist/utils/urls.js +76 -165
- package/dist/utils/urls.js.map +1 -0
- package/dist/utils/uuids.d.cts +4 -0
- package/dist/utils/uuids.d.ts +4 -2
- package/dist/utils/uuids.js +39 -35
- package/dist/utils/uuids.js.map +1 -0
- package/package.json +5 -5
package/dist/crud.js
CHANGED
|
@@ -1,130 +1,85 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/crud.tsx
|
|
21
|
+
var crud_exports = {};
|
|
22
|
+
__export(crud_exports, {
|
|
23
|
+
createCrud: () => createCrud
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(crud_exports);
|
|
26
|
+
var import_schema_fields = require("./schema-fields");
|
|
27
|
+
var import_objects = require("./utils/objects");
|
|
28
|
+
function createCrud(options) {
|
|
29
|
+
const docs = options.docs ?? {};
|
|
30
|
+
const client = {
|
|
31
|
+
createSchema: options.clientCreateSchema,
|
|
32
|
+
createDocs: docs.clientCreate,
|
|
33
|
+
readSchema: options.clientReadSchema,
|
|
34
|
+
readDocs: docs.clientRead,
|
|
35
|
+
listDocs: docs.clientList,
|
|
36
|
+
updateSchema: options.clientUpdateSchema,
|
|
37
|
+
updateDocs: docs.clientUpdate,
|
|
38
|
+
deleteSchema: options.clientDeleteSchema,
|
|
39
|
+
deleteDocs: docs.clientDelete
|
|
40
|
+
};
|
|
41
|
+
const serverOverrides = (0, import_objects.filterUndefined)({
|
|
42
|
+
createSchema: options.serverCreateSchema,
|
|
43
|
+
createDocs: docs.serverCreate,
|
|
44
|
+
readSchema: options.serverReadSchema,
|
|
45
|
+
readDocs: docs.serverRead,
|
|
46
|
+
listDocs: docs.serverList,
|
|
47
|
+
updateSchema: options.serverUpdateSchema,
|
|
48
|
+
updateDocs: docs.serverUpdate,
|
|
49
|
+
deleteSchema: options.serverDeleteSchema,
|
|
50
|
+
deleteDocs: docs.serverDelete
|
|
51
|
+
});
|
|
52
|
+
const server = {
|
|
53
|
+
...client,
|
|
54
|
+
...serverOverrides
|
|
55
|
+
};
|
|
56
|
+
const adminOverrides = (0, import_objects.filterUndefined)({
|
|
57
|
+
createSchema: options.adminCreateSchema,
|
|
58
|
+
createDocs: docs.adminCreate,
|
|
59
|
+
readSchema: options.adminReadSchema,
|
|
60
|
+
readDocs: docs.adminRead,
|
|
61
|
+
listDocs: docs.adminList,
|
|
62
|
+
updateSchema: options.adminUpdateSchema,
|
|
63
|
+
updateDocs: docs.adminUpdate,
|
|
64
|
+
deleteSchema: options.adminDeleteSchema,
|
|
65
|
+
deleteDocs: docs.adminDelete
|
|
66
|
+
});
|
|
67
|
+
const admin = {
|
|
68
|
+
...server,
|
|
69
|
+
...adminOverrides
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
client,
|
|
73
|
+
server,
|
|
74
|
+
admin,
|
|
75
|
+
hasCreate: !!admin.createSchema,
|
|
76
|
+
hasRead: !!admin.readSchema,
|
|
77
|
+
hasUpdate: !!admin.updateSchema,
|
|
78
|
+
hasDelete: !!admin.deleteSchema
|
|
79
|
+
};
|
|
55
80
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
expect(emptyCrud.hasCreate).toBe(false);
|
|
60
|
-
expect(emptyCrud.hasRead).toBe(false);
|
|
61
|
-
expect(emptyCrud.hasUpdate).toBe(false);
|
|
62
|
-
expect(emptyCrud.hasDelete).toBe(false);
|
|
63
|
-
expect(emptyCrud.client.createSchema).toBeUndefined();
|
|
64
|
-
expect(emptyCrud.server.createSchema).toBeUndefined();
|
|
65
|
-
expect(emptyCrud.admin.createSchema).toBeUndefined();
|
|
66
|
-
// Test with client schemas only
|
|
67
|
-
const mockSchema = yupObject().shape({
|
|
68
|
-
name: yupString().defined(),
|
|
69
|
-
});
|
|
70
|
-
const clientOnlyCrud = createCrud({
|
|
71
|
-
clientCreateSchema: mockSchema,
|
|
72
|
-
clientReadSchema: mockSchema,
|
|
73
|
-
});
|
|
74
|
-
expect(clientOnlyCrud.hasCreate).toBe(true);
|
|
75
|
-
expect(clientOnlyCrud.hasRead).toBe(true);
|
|
76
|
-
expect(clientOnlyCrud.hasUpdate).toBe(false);
|
|
77
|
-
expect(clientOnlyCrud.hasDelete).toBe(false);
|
|
78
|
-
expect(clientOnlyCrud.client.createSchema).toBe(mockSchema);
|
|
79
|
-
expect(clientOnlyCrud.server.createSchema).toBe(mockSchema);
|
|
80
|
-
expect(clientOnlyCrud.admin.createSchema).toBe(mockSchema);
|
|
81
|
-
// Test with server overrides
|
|
82
|
-
const serverSchema = yupObject().shape({
|
|
83
|
-
name: yupString().defined(),
|
|
84
|
-
internalField: yupString().defined(),
|
|
85
|
-
});
|
|
86
|
-
const serverOverrideCrud = createCrud({
|
|
87
|
-
clientCreateSchema: mockSchema,
|
|
88
|
-
serverCreateSchema: serverSchema,
|
|
89
|
-
});
|
|
90
|
-
expect(serverOverrideCrud.hasCreate).toBe(true);
|
|
91
|
-
expect(serverOverrideCrud.client.createSchema).toBe(mockSchema);
|
|
92
|
-
expect(serverOverrideCrud.server.createSchema).toBe(serverSchema);
|
|
93
|
-
expect(serverOverrideCrud.admin.createSchema).toBe(serverSchema);
|
|
94
|
-
// Test with admin overrides
|
|
95
|
-
const adminSchema = yupObject().shape({
|
|
96
|
-
name: yupString().defined(),
|
|
97
|
-
internalField: yupString().defined(),
|
|
98
|
-
adminField: yupString().defined(),
|
|
99
|
-
});
|
|
100
|
-
const fullOverrideCrud = createCrud({
|
|
101
|
-
clientCreateSchema: mockSchema,
|
|
102
|
-
serverCreateSchema: serverSchema,
|
|
103
|
-
adminCreateSchema: adminSchema,
|
|
104
|
-
});
|
|
105
|
-
expect(fullOverrideCrud.hasCreate).toBe(true);
|
|
106
|
-
expect(fullOverrideCrud.client.createSchema).toBe(mockSchema);
|
|
107
|
-
expect(fullOverrideCrud.server.createSchema).toBe(serverSchema);
|
|
108
|
-
expect(fullOverrideCrud.admin.createSchema).toBe(adminSchema);
|
|
109
|
-
// Test with documentation
|
|
110
|
-
const crudWithDocs = createCrud({
|
|
111
|
-
clientCreateSchema: mockSchema,
|
|
112
|
-
docs: {
|
|
113
|
-
clientCreate: {
|
|
114
|
-
summary: "Create a resource",
|
|
115
|
-
description: "Creates a new resource",
|
|
116
|
-
tags: ["resources"],
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
expect(crudWithDocs.client.createDocs).toEqual({
|
|
121
|
-
summary: "Create a resource",
|
|
122
|
-
description: "Creates a new resource",
|
|
123
|
-
tags: ["resources"],
|
|
124
|
-
});
|
|
125
|
-
expect(crudWithDocs.server.createDocs).toEqual({
|
|
126
|
-
summary: "Create a resource",
|
|
127
|
-
description: "Creates a new resource",
|
|
128
|
-
tags: ["resources"],
|
|
129
|
-
});
|
|
81
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
82
|
+
0 && (module.exports = {
|
|
83
|
+
createCrud
|
|
130
84
|
});
|
|
85
|
+
//# sourceMappingURL=crud.js.map
|
package/dist/crud.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crud.tsx"],"sourcesContent":["import * as yup from 'yup';\nimport { yupObject, yupString } from './schema-fields';\nimport { filterUndefined } from './utils/objects';\nimport { NullishCoalesce } from './utils/types';\n\nexport type AccessType = \"client\" | \"server\" | \"admin\";\nexport type CrudOperation = \"create\" | \"read\" | \"update\" | \"delete\";\nexport type CrudlOperation = \"create\" | \"read\" | \"update\" | \"delete\" | \"list\";\nexport type AccessTypeXCrudOperation = `${AccessType}${Capitalize<CrudOperation>}`;\nexport type AccessTypeXCrudlOperation = `${AccessType}${Capitalize<CrudlOperation>}`;\n\ndeclare module 'yup' {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface CustomSchemaMetadata {\n openapiField?: {\n description?: string,\n exampleValue?: any,\n hidden?: boolean,\n onlyShowInOperations?: Capitalize<CrudlOperation>[],\n },\n }\n}\n\ntype ShownEndpointDocumentation = {\n summary: string,\n description: string,\n tags?: string[],\n crudOperation?: Capitalize<CrudlOperation>,\n};\nexport type EndpointDocumentation =\n | ({ hidden: true } & Partial<ShownEndpointDocumentation>)\n | ({ hidden?: boolean } & ShownEndpointDocumentation);\n\n\ntype InnerCrudSchema<\n CreateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n ReadSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n UpdateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n DeleteSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n> = {\n createSchema: CreateSchema,\n createDocs: EndpointDocumentation | undefined,\n\n readSchema: ReadSchema,\n readDocs: EndpointDocumentation | undefined,\n listDocs: EndpointDocumentation | undefined,\n\n updateSchema: UpdateSchema,\n updateDocs: EndpointDocumentation | undefined,\n\n deleteSchema: DeleteSchema,\n deleteDocs: EndpointDocumentation | undefined,\n};\n\nexport type CrudSchema<\n ClientSchema extends InnerCrudSchema = InnerCrudSchema,\n ServerSchema extends InnerCrudSchema = InnerCrudSchema,\n AdminSchema extends InnerCrudSchema = InnerCrudSchema,\n> = {\n client: ClientSchema,\n server: ServerSchema,\n admin: AdminSchema,\n\n hasCreate: boolean,\n hasRead: boolean,\n hasUpdate: boolean,\n hasDelete: boolean,\n};\n\nexport type CrudSchemaCreationOptions = {\n [K in AccessTypeXCrudOperation as `${K}Schema`]?: yup.AnySchema\n};\n\ntype FillInOptionalsPrepareStep<O extends CrudSchemaCreationOptions> =\n & { [K in keyof Required<CrudSchemaCreationOptions>]: K extends keyof O ? O[K] : undefined };\n\ntype FillInOptionalsStep<O extends FillInOptionalsPrepareStep<CrudSchemaCreationOptions>> = {\n clientCreateSchema: NullishCoalesce<O['clientCreateSchema'], undefined>,\n clientReadSchema: NullishCoalesce<O['clientReadSchema'], undefined>,\n clientUpdateSchema: NullishCoalesce<O['clientUpdateSchema'], undefined>,\n clientDeleteSchema: NullishCoalesce<O['clientDeleteSchema'], undefined>,\n\n serverCreateSchema: NullishCoalesce<O['serverCreateSchema'], O['clientCreateSchema']>,\n serverReadSchema: NullishCoalesce<O['serverReadSchema'], O['clientReadSchema']>,\n serverUpdateSchema: NullishCoalesce<O['serverUpdateSchema'], O['clientUpdateSchema']>,\n serverDeleteSchema: NullishCoalesce<O['serverDeleteSchema'], O['clientDeleteSchema']>,\n\n adminCreateSchema: NullishCoalesce<O['adminCreateSchema'], O['serverCreateSchema']>,\n adminReadSchema: NullishCoalesce<O['adminReadSchema'], O['serverReadSchema']>,\n adminUpdateSchema: NullishCoalesce<O['adminUpdateSchema'], O['serverUpdateSchema']>,\n adminDeleteSchema: NullishCoalesce<O['adminDeleteSchema'], O['serverDeleteSchema']>,\n};\n\ntype FillInOptionals<O extends CrudSchemaCreationOptions> = FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsPrepareStep<O>>>>;\n\ntype CrudSchemaFromOptionsInner<O extends FillInOptionals<any>> = CrudSchema<\n InnerCrudSchema<O['clientCreateSchema'], O['clientReadSchema'], O['clientUpdateSchema'], O['clientDeleteSchema']>,\n InnerCrudSchema<O['serverCreateSchema'], O['serverReadSchema'], O['serverUpdateSchema'], O['serverDeleteSchema']>,\n InnerCrudSchema<O['adminCreateSchema'], O['adminReadSchema'], O['adminUpdateSchema'], O['adminDeleteSchema']>\n>;\n\nexport type CrudSchemaFromOptions<O extends CrudSchemaCreationOptions> = CrudSchemaFromOptionsInner<FillInOptionals<O>>;\n\ntype InnerCrudTypeOf<S extends InnerCrudSchema> =\n & (S['createSchema'] extends {} ? { Create: yup.InferType<S['createSchema']> } : {})\n & (S['readSchema'] extends {} ? { Read: yup.InferType<S['readSchema']> } : {})\n & (S['updateSchema'] extends {} ? { Update: yup.InferType<S['updateSchema']> } : {})\n & (S['deleteSchema'] extends {} ? { Delete: yup.InferType<S['deleteSchema']> } : {})\n & (S['readSchema'] extends {} ? { List: {\n items: yup.InferType<S['readSchema']>[],\n is_paginated: boolean,\n pagination?: {\n next_cursor: string | null,\n },\n }, } : {});\n\nexport type CrudTypeOf<S extends CrudSchema> = {\n Client: InnerCrudTypeOf<S['client']>,\n Server: InnerCrudTypeOf<S['server']>,\n Admin: InnerCrudTypeOf<S['admin']>,\n}\n\ntype CrudDocsCreationOptions<SO extends CrudSchemaCreationOptions> = {\n [X in AccessTypeXCrudlOperation]?: EndpointDocumentation\n};\n\nexport function createCrud<SO extends CrudSchemaCreationOptions>(options: SO & { docs?: CrudDocsCreationOptions<SO> }): CrudSchemaFromOptions<SO> {\n const docs = options.docs ?? {};\n const client = {\n createSchema: options.clientCreateSchema,\n createDocs: docs.clientCreate,\n\n readSchema: options.clientReadSchema,\n readDocs: docs.clientRead,\n listDocs: docs.clientList,\n\n updateSchema: options.clientUpdateSchema,\n updateDocs: docs.clientUpdate,\n\n deleteSchema: options.clientDeleteSchema,\n deleteDocs: docs.clientDelete,\n };\n\n const serverOverrides = filterUndefined({\n createSchema: options.serverCreateSchema,\n createDocs: docs.serverCreate,\n\n readSchema: options.serverReadSchema,\n readDocs: docs.serverRead,\n listDocs: docs.serverList,\n\n updateSchema: options.serverUpdateSchema,\n updateDocs: docs.serverUpdate,\n\n deleteSchema: options.serverDeleteSchema,\n deleteDocs: docs.serverDelete,\n });\n const server = {\n ...client,\n ...serverOverrides,\n };\n\n const adminOverrides = filterUndefined({\n createSchema: options.adminCreateSchema,\n createDocs: docs.adminCreate,\n\n readSchema: options.adminReadSchema,\n readDocs: docs.adminRead,\n listDocs: docs.adminList,\n\n updateSchema: options.adminUpdateSchema,\n updateDocs: docs.adminUpdate,\n\n deleteSchema: options.adminDeleteSchema,\n deleteDocs: docs.adminDelete,\n });\n const admin = {\n ...server,\n ...adminOverrides,\n };\n\n return {\n client: client as any,\n server: server as any,\n admin: admin as any,\n\n hasCreate: !!admin.createSchema,\n hasRead: !!admin.readSchema,\n hasUpdate: !!admin.updateSchema,\n hasDelete: !!admin.deleteSchema,\n };\n}\n\nundefined?.test(\"createCrud\", ({ expect }) => {\n // Test with empty options\n const emptyCrud = createCrud({});\n expect(emptyCrud.hasCreate).toBe(false);\n expect(emptyCrud.hasRead).toBe(false);\n expect(emptyCrud.hasUpdate).toBe(false);\n expect(emptyCrud.hasDelete).toBe(false);\n expect(emptyCrud.client.createSchema).toBeUndefined();\n expect(emptyCrud.server.createSchema).toBeUndefined();\n expect(emptyCrud.admin.createSchema).toBeUndefined();\n\n // Test with client schemas only\n const mockSchema = yupObject().shape({\n name: yupString().defined(),\n });\n\n const clientOnlyCrud = createCrud({\n clientCreateSchema: mockSchema,\n clientReadSchema: mockSchema,\n });\n expect(clientOnlyCrud.hasCreate).toBe(true);\n expect(clientOnlyCrud.hasRead).toBe(true);\n expect(clientOnlyCrud.hasUpdate).toBe(false);\n expect(clientOnlyCrud.hasDelete).toBe(false);\n expect(clientOnlyCrud.client.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.server.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.admin.createSchema).toBe(mockSchema);\n\n // Test with server overrides\n const serverSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n });\n\n const serverOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n });\n expect(serverOverrideCrud.hasCreate).toBe(true);\n expect(serverOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(serverOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(serverOverrideCrud.admin.createSchema).toBe(serverSchema);\n\n // Test with admin overrides\n const adminSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n adminField: yupString().defined(),\n });\n\n const fullOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n adminCreateSchema: adminSchema,\n });\n expect(fullOverrideCrud.hasCreate).toBe(true);\n expect(fullOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(fullOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(fullOverrideCrud.admin.createSchema).toBe(adminSchema);\n\n // Test with documentation\n const crudWithDocs = createCrud({\n clientCreateSchema: mockSchema,\n docs: {\n clientCreate: {\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n },\n },\n });\n expect(crudWithDocs.client.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n expect(crudWithDocs.server.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,2BAAqC;AACrC,qBAAgC;AA4HzB,SAAS,WAAiD,SAAiF;AAChJ,QAAM,OAAO,QAAQ,QAAQ,CAAC;AAC9B,QAAM,SAAS;AAAA,IACb,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB;AAEA,QAAM,sBAAkB,gCAAgB;AAAA,IACtC,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,qBAAiB,gCAAgB;AAAA,IACrC,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IAEA,WAAW,CAAC,CAAC,MAAM;AAAA,IACnB,SAAS,CAAC,CAAC,MAAM;AAAA,IACjB,WAAW,CAAC,CAAC,MAAM;AAAA,IACnB,WAAW,CAAC,CAAC,MAAM;AAAA,EACrB;AACF;","names":[]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// src/config/format.ts
|
|
2
|
+
import { StackAssertionError, throwErr } from "../utils/errors";
|
|
3
|
+
import { deleteKey, filterUndefined, get, hasAndNotUndefined, set } from "../utils/objects";
|
|
4
|
+
function isValidConfig(c) {
|
|
5
|
+
return getInvalidConfigReason(c) === void 0;
|
|
6
|
+
}
|
|
7
|
+
function getInvalidConfigReason(c, options = {}) {
|
|
8
|
+
const configName = options.configName ?? "config";
|
|
9
|
+
if (c === null || typeof c !== "object") return `${configName} must be a non-null object`;
|
|
10
|
+
for (const [key, value] of Object.entries(c)) {
|
|
11
|
+
if (value === void 0) continue;
|
|
12
|
+
if (typeof key !== "string") return `${configName} must have only string keys (found: ${typeof key})`;
|
|
13
|
+
if (!key.match(/^[a-zA-Z0-9_:$][a-zA-Z_:$0-9\-]*(?:\.[a-zA-Z0-9_:$][a-zA-Z_:$0-9\-]*)*$/)) return `All keys of ${configName} must consist of only alphanumeric characters, dots, underscores, colons, dollar signs, or hyphens and start with a character other than a hyphen (found: ${key})`;
|
|
14
|
+
const entryName = `${configName}.${key}`;
|
|
15
|
+
const reason = getInvalidConfigValueReason(value, { valueName: entryName });
|
|
16
|
+
if (reason) return reason;
|
|
17
|
+
}
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
function getInvalidConfigValueReason(value, options = {}) {
|
|
21
|
+
const valueName = options.valueName ?? "value";
|
|
22
|
+
switch (typeof value) {
|
|
23
|
+
case "string":
|
|
24
|
+
case "number":
|
|
25
|
+
case "boolean": {
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case "object": {
|
|
29
|
+
if (value === null) {
|
|
30
|
+
break;
|
|
31
|
+
} else if (Array.isArray(value)) {
|
|
32
|
+
for (const [index, v] of value.entries()) {
|
|
33
|
+
const reason = getInvalidConfigValueReason(v, { valueName: `${valueName}[${index}]` });
|
|
34
|
+
if (reason) return reason;
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
const reason = getInvalidConfigReason(value, { configName: valueName });
|
|
38
|
+
if (reason) return reason;
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
default: {
|
|
43
|
+
return `${valueName} has an invalid value type ${typeof value} (value: ${value})`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return void 0;
|
|
47
|
+
}
|
|
48
|
+
function assertValidConfig(c) {
|
|
49
|
+
const reason = getInvalidConfigReason(c);
|
|
50
|
+
if (reason) throw new StackAssertionError(`Invalid config: ${reason}`, { c });
|
|
51
|
+
}
|
|
52
|
+
function override(c1, ...configs) {
|
|
53
|
+
if (configs.length === 0) return c1;
|
|
54
|
+
if (configs.length > 1) return override(override(c1, configs[0]), ...configs.slice(1));
|
|
55
|
+
const c2 = configs[0];
|
|
56
|
+
assertValidConfig(c1);
|
|
57
|
+
assertValidConfig(c2);
|
|
58
|
+
let result = c1;
|
|
59
|
+
for (const key of Object.keys(filterUndefined(c2))) {
|
|
60
|
+
result = Object.fromEntries(
|
|
61
|
+
Object.entries(result).filter(([k]) => k !== key && !k.startsWith(key + "."))
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
...result,
|
|
66
|
+
...filterUndefined(c2)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
var NormalizationError = class extends Error {
|
|
70
|
+
constructor(...args) {
|
|
71
|
+
super(...args);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
NormalizationError.prototype.name = "NormalizationError";
|
|
75
|
+
function normalize(c, options = {}) {
|
|
76
|
+
assertValidConfig(c);
|
|
77
|
+
const onDotIntoNull = options.onDotIntoNull ?? "empty";
|
|
78
|
+
const countDots = (s) => s.match(/\./g)?.length ?? 0;
|
|
79
|
+
const result = {};
|
|
80
|
+
const keysByDepth = Object.keys(c).sort((a, b) => countDots(a) - countDots(b));
|
|
81
|
+
outer: for (const key of keysByDepth) {
|
|
82
|
+
const keySegmentsWithoutLast = key.split(".");
|
|
83
|
+
const last = keySegmentsWithoutLast.pop() ?? throwErr("split returns empty array?");
|
|
84
|
+
const value = get(c, key);
|
|
85
|
+
if (value === void 0) continue;
|
|
86
|
+
let current = result;
|
|
87
|
+
for (const keySegment of keySegmentsWithoutLast) {
|
|
88
|
+
if (!hasAndNotUndefined(current, keySegment)) {
|
|
89
|
+
switch (onDotIntoNull) {
|
|
90
|
+
case "empty": {
|
|
91
|
+
set(current, keySegment, {});
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case "throw": {
|
|
95
|
+
throw new NormalizationError(`Tried to use dot notation to access ${JSON.stringify(key)}, but ${JSON.stringify(keySegment)} doesn't exist on the object (or is null). Maybe this config is not normalizable?`);
|
|
96
|
+
}
|
|
97
|
+
case "ignore": {
|
|
98
|
+
continue outer;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const value2 = get(current, keySegment);
|
|
103
|
+
if (typeof value2 !== "object") {
|
|
104
|
+
throw new NormalizationError(`Tried to use dot notation to access ${JSON.stringify(key)}, but ${JSON.stringify(keySegment)} is not an object. Maybe this config is not normalizable?`);
|
|
105
|
+
}
|
|
106
|
+
current = value2;
|
|
107
|
+
}
|
|
108
|
+
setNormalizedValue(current, last, value);
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
function normalizeValue(value) {
|
|
113
|
+
if (value === null) throw new NormalizationError("Tried to normalize a null value");
|
|
114
|
+
if (Array.isArray(value)) return value.map(normalizeValue);
|
|
115
|
+
if (typeof value === "object") return normalize(value);
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
function setNormalizedValue(result, key, value) {
|
|
119
|
+
if (value === null) {
|
|
120
|
+
if (hasAndNotUndefined(result, key)) {
|
|
121
|
+
deleteKey(result, key);
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
set(result, key, normalizeValue(value));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export {
|
|
128
|
+
NormalizationError,
|
|
129
|
+
assertValidConfig,
|
|
130
|
+
getInvalidConfigReason,
|
|
131
|
+
isValidConfig,
|
|
132
|
+
normalize,
|
|
133
|
+
override
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/config/format.ts"],"sourcesContent":["// see https://github.com/stack-auth/info/blob/main/eng-handbook/random-thoughts/config-json-format.md\n\nimport { StackAssertionError, throwErr } from \"../utils/errors\";\nimport { deleteKey, filterUndefined, get, hasAndNotUndefined, set } from \"../utils/objects\";\n\n\nexport type ConfigValue = string | number | boolean | null | ConfigValue[] | Config;\nexport type Config = {\n [keyOrDotNotation: string]: ConfigValue | undefined, // must support undefined for optional values\n};\n\nexport type NormalizedConfigValue = string | number | boolean | NormalizedConfig | NormalizedConfigValue[];\nexport type NormalizedConfig = {\n [key: string]: NormalizedConfigValue | undefined, // must support undefined for optional values\n};\n\nexport type _NormalizesTo<N> = N extends object ? (\n & Config\n & { [K in keyof N]?: _NormalizesTo<N[K]> | null }\n & { [K in `${string}.${string}`]: ConfigValue }\n) : N;\nexport type NormalizesTo<N extends NormalizedConfig> = _NormalizesTo<N>;\n\n/**\n * Note that a config can both be valid and not normalizable.\n */\nexport function isValidConfig(c: unknown): c is Config {\n return getInvalidConfigReason(c) === undefined;\n}\n\nexport function getInvalidConfigReason(c: unknown, options: { configName?: string } = {}): string | undefined {\n const configName = options.configName ?? 'config';\n if (c === null || typeof c !== 'object') return `${configName} must be a non-null object`;\n for (const [key, value] of Object.entries(c)) {\n if (value === undefined) continue;\n if (typeof key !== 'string') return `${configName} must have only string keys (found: ${typeof key})`;\n if (!key.match(/^[a-zA-Z0-9_:$][a-zA-Z_:$0-9\\-]*(?:\\.[a-zA-Z0-9_:$][a-zA-Z_:$0-9\\-]*)*$/)) return `All keys of ${configName} must consist of only alphanumeric characters, dots, underscores, colons, dollar signs, or hyphens and start with a character other than a hyphen (found: ${key})`;\n\n const entryName = `${configName}.${key}`;\n const reason = getInvalidConfigValueReason(value, { valueName: entryName });\n if (reason) return reason;\n }\n return undefined;\n}\n\nfunction getInvalidConfigValueReason(value: unknown, options: { valueName?: string } = {}): string | undefined {\n const valueName = options.valueName ?? 'value';\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean': {\n break;\n }\n case 'object': {\n if (value === null) {\n break;\n } else if (Array.isArray(value)) {\n for (const [index, v] of value.entries()) {\n const reason = getInvalidConfigValueReason(v, { valueName: `${valueName}[${index}]` });\n if (reason) return reason;\n }\n } else {\n const reason = getInvalidConfigReason(value, { configName: valueName });\n if (reason) return reason;\n }\n break;\n }\n default: {\n return `${valueName} has an invalid value type ${typeof value} (value: ${value})`;\n }\n }\n return undefined;\n}\n\nexport function assertValidConfig(c: unknown) {\n const reason = getInvalidConfigReason(c);\n if (reason) throw new StackAssertionError(`Invalid config: ${reason}`, { c });\n}\n\nexport function override(c1: Config, ...configs: Config[]) {\n if (configs.length === 0) return c1;\n if (configs.length > 1) return override(override(c1, configs[0]), ...configs.slice(1));\n const c2 = configs[0];\n\n assertValidConfig(c1);\n assertValidConfig(c2);\n\n let result = c1;\n for (const key of Object.keys(filterUndefined(c2))) {\n result = Object.fromEntries(\n Object.entries(result).filter(([k]) => k !== key && !k.startsWith(key + '.'))\n );\n }\n\n return {\n ...result,\n ...filterUndefined(c2),\n };\n}\n\nundefined?.test(\"override(...)\", ({ expect }) => {\n expect(\n override(\n {\n a: 1,\n b: 2,\n \"c.d\": 3,\n \"c.e.f\": 4,\n \"c.g\": 5,\n h: [6, { i: 7 }, 8],\n k: 123,\n l: undefined,\n },\n {\n a: 9,\n \"c.d\": 10,\n \"c.e\": null,\n \"h.0\": 11,\n \"h.1\": {\n j: 12,\n },\n k: undefined,\n },\n )\n ).toEqual({\n a: 9,\n b: 2,\n \"c.d\": 10,\n \"c.e\": null,\n \"c.g\": 5,\n h: [6, { i: 7 }, 8],\n \"h.0\": 11,\n \"h.1\": {\n j: 12,\n },\n k: 123,\n l: undefined,\n });\n});\n\ntype NormalizeOptions = {\n /**\n * What to do if a dot notation is used on null.\n *\n * - \"empty\" (default): Replace the null with an empty object.\n * - \"throw\": Throw an error.\n * - \"ignore\": Ignore the dot notation field.\n */\n onDotIntoNull?: \"empty\" | \"throw\" | \"ignore\",\n}\n\nexport class NormalizationError extends Error {\n constructor(...args: ConstructorParameters<typeof Error>) {\n super(...args);\n }\n}\nNormalizationError.prototype.name = \"NormalizationError\";\n\nexport function normalize(c: Config, options: NormalizeOptions = {}): NormalizedConfig {\n assertValidConfig(c);\n const onDotIntoNull = options.onDotIntoNull ?? \"empty\";\n\n const countDots = (s: string) => s.match(/\\./g)?.length ?? 0;\n const result: NormalizedConfig = {};\n const keysByDepth = Object.keys(c).sort((a, b) => countDots(a) - countDots(b));\n\n outer: for (const key of keysByDepth) {\n const keySegmentsWithoutLast = key.split('.');\n const last = keySegmentsWithoutLast.pop() ?? throwErr('split returns empty array?');\n const value = get(c, key);\n if (value === undefined) continue;\n\n let current: NormalizedConfig = result;\n for (const keySegment of keySegmentsWithoutLast) {\n if (!hasAndNotUndefined(current, keySegment)) {\n switch (onDotIntoNull) {\n case \"empty\": {\n set(current, keySegment, {});\n break;\n }\n case \"throw\": {\n throw new NormalizationError(`Tried to use dot notation to access ${JSON.stringify(key)}, but ${JSON.stringify(keySegment)} doesn't exist on the object (or is null). Maybe this config is not normalizable?`);\n }\n case \"ignore\": {\n continue outer;\n }\n }\n }\n const value = get(current, keySegment);\n if (typeof value !== 'object') {\n throw new NormalizationError(`Tried to use dot notation to access ${JSON.stringify(key)}, but ${JSON.stringify(keySegment)} is not an object. Maybe this config is not normalizable?`);\n }\n current = value as NormalizedConfig;\n }\n setNormalizedValue(current, last, value);\n }\n return result;\n}\n\nfunction normalizeValue(value: ConfigValue): NormalizedConfigValue {\n if (value === null) throw new NormalizationError(\"Tried to normalize a null value\");\n if (Array.isArray(value)) return value.map(normalizeValue);\n if (typeof value === 'object') return normalize(value);\n return value;\n}\n\nfunction setNormalizedValue(result: NormalizedConfig, key: string, value: ConfigValue) {\n if (value === null) {\n if (hasAndNotUndefined(result, key)) {\n deleteKey(result, key);\n }\n } else {\n set(result, key, normalizeValue(value));\n }\n}\n\nundefined?.test(\"normalize(...)\", ({ expect }) => {\n expect(normalize({\n a: 9,\n b: 2,\n c: {},\n \"c.d\": 10,\n \"c.e\": null,\n \"c.g\": 5,\n h: [6, { i: 7 }, 8],\n \"h.0\": 11,\n \"h.1\": {\n j: 12,\n },\n k: { l: {} },\n \"k.l.m\": 13,\n n: undefined,\n })).toEqual({\n a: 9,\n b: 2,\n c: {\n d: 10,\n g: 5,\n },\n h: [11, { j: 12 }, 8],\n k: { l: { m: 13 } },\n });\n\n // dotting into null\n expect(normalize({\n \"b.c\": 2,\n })).toEqual({ b: { c: 2 } });\n expect(() => normalize({\n \"b.c\": 2,\n }, { onDotIntoNull: \"throw\" })).toThrow(`Tried to use dot notation to access \"b.c\", but \"b\" doesn't exist on the object (or is null). Maybe this config is not normalizable?`);\n expect(() => normalize({\n b: null,\n \"b.c\": 2,\n }, { onDotIntoNull: \"throw\" })).toThrow(`Tried to use dot notation to access \"b.c\", but \"b\" doesn't exist on the object (or is null). Maybe this config is not normalizable?`);\n expect(normalize({\n \"b.c\": 2,\n }, { onDotIntoNull: \"ignore\" })).toEqual({});\n\n // dotting into non-object\n expect(() => normalize({\n b: 1,\n \"b.c\": 2,\n })).toThrow(`Tried to use dot notation to access \"b.c\", but \"b\" is not an object. Maybe this config is not normalizable?`);\n});\n"],"mappings":"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","names":["value"]}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// src/config/schema.ts
|
|
2
|
+
import * as schemaFields from "../schema-fields";
|
|
3
|
+
import { yupBoolean, yupObject, yupRecord, yupString } from "../schema-fields";
|
|
4
|
+
import { allProviders } from "../utils/oauth";
|
|
5
|
+
import { get, has, isObjectLike, mapValues, set } from "../utils/objects";
|
|
6
|
+
var configLevels = ["project", "branch", "environment", "organization"];
|
|
7
|
+
var permissionRegex = /^\$?[a-z0-9_:]+$/;
|
|
8
|
+
var customPermissionRegex = /^[a-z0-9_:]+$/;
|
|
9
|
+
var projectConfigSchema = yupObject({});
|
|
10
|
+
var branchRbacDefaultPermissions = yupRecord(
|
|
11
|
+
yupString().optional().matches(permissionRegex),
|
|
12
|
+
yupBoolean().isTrue().optional()
|
|
13
|
+
).optional();
|
|
14
|
+
var branchRbacSchema = yupObject({
|
|
15
|
+
permissions: yupRecord(
|
|
16
|
+
yupString().optional().matches(customPermissionRegex),
|
|
17
|
+
yupObject({
|
|
18
|
+
description: yupString().optional(),
|
|
19
|
+
scope: yupString().oneOf(["team", "project"]).optional(),
|
|
20
|
+
containedPermissionIds: yupRecord(
|
|
21
|
+
yupString().optional().matches(permissionRegex),
|
|
22
|
+
yupBoolean().isTrue().optional()
|
|
23
|
+
).optional()
|
|
24
|
+
}).optional()
|
|
25
|
+
).optional(),
|
|
26
|
+
defaultPermissions: yupObject({
|
|
27
|
+
teamCreator: branchRbacDefaultPermissions,
|
|
28
|
+
teamMember: branchRbacDefaultPermissions,
|
|
29
|
+
signUp: branchRbacDefaultPermissions
|
|
30
|
+
}).optional()
|
|
31
|
+
}).optional();
|
|
32
|
+
var branchApiKeysSchema = yupObject({
|
|
33
|
+
enabled: yupObject({
|
|
34
|
+
team: yupBoolean().optional(),
|
|
35
|
+
user: yupBoolean().optional()
|
|
36
|
+
}).optional()
|
|
37
|
+
}).optional();
|
|
38
|
+
var branchAuthSchema = yupObject({
|
|
39
|
+
allowSignUp: yupBoolean().optional(),
|
|
40
|
+
password: yupObject({
|
|
41
|
+
allowSignIn: yupBoolean().optional()
|
|
42
|
+
}).optional(),
|
|
43
|
+
otp: yupObject({
|
|
44
|
+
allowSignIn: yupBoolean().optional()
|
|
45
|
+
}).optional(),
|
|
46
|
+
passkey: yupObject({
|
|
47
|
+
allowSignIn: yupBoolean().optional()
|
|
48
|
+
}).optional(),
|
|
49
|
+
oauth: yupObject({
|
|
50
|
+
accountMergeStrategy: yupString().oneOf(["link_method", "raise_error", "allow_duplicates"]).optional(),
|
|
51
|
+
providers: yupRecord(
|
|
52
|
+
yupString().optional().matches(permissionRegex),
|
|
53
|
+
yupObject({
|
|
54
|
+
type: yupString().oneOf(allProviders).optional(),
|
|
55
|
+
allowSignIn: yupBoolean().optional(),
|
|
56
|
+
allowConnectedAccounts: yupBoolean().optional()
|
|
57
|
+
}).defined()
|
|
58
|
+
).optional()
|
|
59
|
+
}).optional()
|
|
60
|
+
}).optional();
|
|
61
|
+
var branchDomain = yupObject({
|
|
62
|
+
allowLocalhost: yupBoolean().optional()
|
|
63
|
+
}).optional();
|
|
64
|
+
var branchConfigSchema = projectConfigSchema.concat(yupObject({
|
|
65
|
+
rbac: branchRbacSchema,
|
|
66
|
+
teams: yupObject({
|
|
67
|
+
createPersonalTeamOnSignUp: yupBoolean().optional(),
|
|
68
|
+
allowClientTeamCreation: yupBoolean().optional()
|
|
69
|
+
}).optional(),
|
|
70
|
+
users: yupObject({
|
|
71
|
+
allowClientUserDeletion: yupBoolean().optional()
|
|
72
|
+
}).optional(),
|
|
73
|
+
apiKeys: branchApiKeysSchema,
|
|
74
|
+
domains: branchDomain,
|
|
75
|
+
auth: branchAuthSchema,
|
|
76
|
+
emails: yupObject({})
|
|
77
|
+
}));
|
|
78
|
+
var environmentConfigSchema = branchConfigSchema.concat(yupObject({
|
|
79
|
+
auth: branchConfigSchema.getNested("auth").concat(yupObject({
|
|
80
|
+
oauth: branchConfigSchema.getNested("auth").getNested("oauth").concat(yupObject({
|
|
81
|
+
providers: yupRecord(
|
|
82
|
+
yupString().optional().matches(permissionRegex),
|
|
83
|
+
yupObject({
|
|
84
|
+
type: yupString().oneOf(allProviders).optional(),
|
|
85
|
+
isShared: yupBoolean().optional(),
|
|
86
|
+
clientId: schemaFields.oauthClientIdSchema.optional(),
|
|
87
|
+
clientSecret: schemaFields.oauthClientSecretSchema.optional(),
|
|
88
|
+
facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),
|
|
89
|
+
microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),
|
|
90
|
+
allowSignIn: yupBoolean().optional(),
|
|
91
|
+
allowConnectedAccounts: yupBoolean().optional()
|
|
92
|
+
})
|
|
93
|
+
).optional()
|
|
94
|
+
}).optional())
|
|
95
|
+
})),
|
|
96
|
+
emails: branchConfigSchema.getNested("emails").concat(yupObject({
|
|
97
|
+
server: yupObject({
|
|
98
|
+
isShared: yupBoolean().optional(),
|
|
99
|
+
host: schemaFields.emailHostSchema.optional().nonEmpty(),
|
|
100
|
+
port: schemaFields.emailPortSchema.optional(),
|
|
101
|
+
username: schemaFields.emailUsernameSchema.optional().nonEmpty(),
|
|
102
|
+
password: schemaFields.emailPasswordSchema.optional().nonEmpty(),
|
|
103
|
+
senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),
|
|
104
|
+
senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty()
|
|
105
|
+
})
|
|
106
|
+
}).optional()),
|
|
107
|
+
domains: branchConfigSchema.getNested("domains").concat(yupObject({
|
|
108
|
+
trustedDomains: yupRecord(
|
|
109
|
+
yupString().uuid().optional(),
|
|
110
|
+
yupObject({
|
|
111
|
+
baseUrl: schemaFields.urlSchema.optional(),
|
|
112
|
+
handlerPath: schemaFields.handlerPathSchema.optional()
|
|
113
|
+
})
|
|
114
|
+
).optional()
|
|
115
|
+
}))
|
|
116
|
+
}));
|
|
117
|
+
var organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));
|
|
118
|
+
var projectConfigDefaults = {};
|
|
119
|
+
var branchConfigDefaults = {};
|
|
120
|
+
var environmentConfigDefaults = {};
|
|
121
|
+
var organizationConfigDefaults = {
|
|
122
|
+
rbac: {
|
|
123
|
+
permissions: (key) => ({}),
|
|
124
|
+
defaultPermissions: {
|
|
125
|
+
teamCreator: {},
|
|
126
|
+
teamMember: {},
|
|
127
|
+
signUp: {}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
apiKeys: {
|
|
131
|
+
enabled: {
|
|
132
|
+
team: false,
|
|
133
|
+
user: false
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
teams: {
|
|
137
|
+
createPersonalTeamOnSignUp: false,
|
|
138
|
+
allowClientTeamCreation: false
|
|
139
|
+
},
|
|
140
|
+
users: {
|
|
141
|
+
allowClientUserDeletion: false
|
|
142
|
+
},
|
|
143
|
+
domains: {
|
|
144
|
+
allowLocalhost: false,
|
|
145
|
+
trustedDomains: (key) => ({
|
|
146
|
+
handlerPath: "/handler"
|
|
147
|
+
})
|
|
148
|
+
},
|
|
149
|
+
auth: {
|
|
150
|
+
allowSignUp: true,
|
|
151
|
+
password: {
|
|
152
|
+
allowSignIn: false
|
|
153
|
+
},
|
|
154
|
+
otp: {
|
|
155
|
+
allowSignIn: false
|
|
156
|
+
},
|
|
157
|
+
passkey: {
|
|
158
|
+
allowSignIn: false
|
|
159
|
+
},
|
|
160
|
+
oauth: {
|
|
161
|
+
accountMergeStrategy: "link_method",
|
|
162
|
+
providers: (key) => ({
|
|
163
|
+
isShared: true,
|
|
164
|
+
allowSignIn: false,
|
|
165
|
+
allowConnectedAccounts: false
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
emails: {
|
|
170
|
+
server: {
|
|
171
|
+
isShared: true
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
function applyDefaults(defaults, config) {
|
|
176
|
+
const res = typeof defaults === "function" ? {} : mapValues(defaults, (v) => typeof v === "function" ? {} : typeof v === "object" ? applyDefaults(v, {}) : v);
|
|
177
|
+
for (const [key, mergeValue] of Object.entries(config)) {
|
|
178
|
+
const baseValue = typeof defaults === "function" ? defaults(key) : has(defaults, key) ? get(defaults, key) : void 0;
|
|
179
|
+
if (baseValue !== void 0) {
|
|
180
|
+
if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {
|
|
181
|
+
set(res, key, applyDefaults(baseValue, mergeValue));
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
set(res, key, mergeValue);
|
|
186
|
+
}
|
|
187
|
+
return res;
|
|
188
|
+
}
|
|
189
|
+
export {
|
|
190
|
+
applyDefaults,
|
|
191
|
+
branchConfigDefaults,
|
|
192
|
+
branchConfigSchema,
|
|
193
|
+
configLevels,
|
|
194
|
+
environmentConfigDefaults,
|
|
195
|
+
environmentConfigSchema,
|
|
196
|
+
organizationConfigDefaults,
|
|
197
|
+
organizationConfigSchema,
|
|
198
|
+
projectConfigDefaults,
|
|
199
|
+
projectConfigSchema
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, DeepPartial, get, has, isObjectLike, mapValues, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { Config, NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\nconst customPermissionRegex = /^[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(customPermissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n isShared: true,\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = typeof defaults === 'function' ? {} : mapValues(defaults, v => typeof v === 'function' ? {} : (typeof v === 'object' ? applyDefaults(v as any, {}) : v));\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, {})).toEqual({ a: {} });\n expect(applyDefaults({ a: { b: (key: string) => ({ b: key }) } }, {})).toEqual({ a: { b: {} } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Override overrides (used to update the overrides)\nexport type ProjectConfigOverrideOverride = Config & DeepPartial<ProjectConfigOverride>;\nexport type BranchConfigOverrideOverride = Config & DeepPartial<BranchConfigOverride>;\nexport type EnvironmentConfigOverrideOverride = Config & DeepPartial<EnvironmentConfigOverride>;\nexport type OrganizationConfigOverrideOverride = Config & DeepPartial<OrganizationConfigOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
|