@estifanos-sh/convex-auth 0.0.1-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -0
- package/dist/_generated/component.d.ts +2981 -0
- package/dist/bin.js +7194 -0
- package/dist/browser/index.d.ts +22 -0
- package/dist/browser/index.js +61 -0
- package/dist/browser/locks.js +20 -0
- package/dist/browser/navigation.js +14 -0
- package/dist/browser/runtime.js +90 -0
- package/dist/browser/webauthn.js +99 -0
- package/dist/client/core/types.d.ts +615 -0
- package/dist/client/core/types.js +23 -0
- package/dist/client/errors.js +30 -0
- package/dist/client/factors/device.js +100 -0
- package/dist/client/factors/totp.js +111 -0
- package/dist/client/factors/webauthn.js +69 -0
- package/dist/client/index.d.ts +60 -0
- package/dist/client/index.js +976 -0
- package/dist/client/runtime/invite.js +50 -0
- package/dist/client/runtime/mutex.js +25 -0
- package/dist/client/runtime/proxy.js +75 -0
- package/dist/client/runtime/storage.js +65 -0
- package/dist/component/_generated/api.js +26 -0
- package/dist/component/_generated/component.d.ts +2981 -0
- package/dist/component/_generated/component.js +1 -0
- package/dist/component/_generated/dataModel.js +1 -0
- package/dist/component/_generated/server.js +74 -0
- package/dist/component/account.js +197 -0
- package/dist/component/connection/audit.js +152 -0
- package/dist/component/connection/cache.js +205 -0
- package/dist/component/connection/domain/verification.js +63 -0
- package/dist/component/connection/domain.js +108 -0
- package/dist/component/connection/saml/assertion.js +41 -0
- package/dist/component/connection/saml/request.js +61 -0
- package/dist/component/connection/scim/config.js +55 -0
- package/dist/component/connection/scim/identity.js +162 -0
- package/dist/component/connection/secret.js +65 -0
- package/dist/component/connection/webhook/delivery.js +396 -0
- package/dist/component/connection/webhook/endpoint.js +77 -0
- package/dist/component/connection.js +204 -0
- package/dist/component/convex.config.d.ts +7 -0
- package/dist/component/convex.config.js +15 -0
- package/dist/component/crons.js +27 -0
- package/dist/component/event.js +341 -0
- package/dist/component/factor/device.js +141 -0
- package/dist/component/factor/passkey.js +385 -0
- package/dist/component/factor/totp.js +253 -0
- package/dist/component/functions.js +3 -0
- package/dist/component/group/active.js +63 -0
- package/dist/component/group/invite.js +300 -0
- package/dist/component/group/member.js +188 -0
- package/dist/component/group.js +431 -0
- package/dist/component/http.js +9 -0
- package/dist/component/index.d.ts +5 -0
- package/dist/component/index.js +3 -0
- package/dist/component/limits.js +103 -0
- package/dist/component/maintenance.js +205 -0
- package/dist/component/migrations.js +277 -0
- package/dist/component/model.d.ts +384 -0
- package/dist/component/model.js +709 -0
- package/dist/component/modules.js +53 -0
- package/dist/component/oauth/client.js +196 -0
- package/dist/component/oauth/code.js +97 -0
- package/dist/component/oauth/refresh.js +230 -0
- package/dist/component/schema.d.ts +1530 -0
- package/dist/component/schema.js +401 -0
- package/dist/component/session.js +134 -0
- package/dist/component/token/pkce.js +121 -0
- package/dist/component/token/refresh.js +189 -0
- package/dist/component/token/verification.js +155 -0
- package/dist/component/user/email.js +147 -0
- package/dist/component/user/key.js +273 -0
- package/dist/component/user.js +173 -0
- package/dist/core/index.d.ts +531 -0
- package/dist/core/index.js +81 -0
- package/dist/expo/index.d.ts +43 -0
- package/dist/expo/index.js +131 -0
- package/dist/expo/webauthn.js +88 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/NoopLogger.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/api/logs.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/index.d.ts +7 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/AnyValue.d.ts +21 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LogRecord.d.ts +36 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/Logger.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerOptions.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_api-logs@0.214.0/node_modules/@opentelemetry/api-logs/build/src/types/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/propagation/W3CBaggagePropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/baggage/utils.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/attributes.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/global-error-handler.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/logging-error-handler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/time.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/common/types.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/index.d.ts +13 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/propagation/composite.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/TraceState.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/W3CTraceContextPropagator.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_core@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/core/build/src/utils/configuration.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LogRecordProcessor.d.ts +24 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/LoggerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/config/LoggerConfigurators.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/BatchLogRecordProcessorBase.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ConsoleLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/InMemoryLogRecordExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/LogRecordExporter.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/ReadableLogRecord.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SdkLogRecord.d.ts +71 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/export/SimpleLogRecordProcessor.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/index.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/export/BatchLogRecordProcessor.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/platform/node/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-logs@0.214.0_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-logs/build/src/types.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/InstrumentDescriptor.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/MeterProvider.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Drop.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/ExponentialHistogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Histogram.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/LastValue.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/Sum.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/index.d.ts +6 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/aggregator/types.d.ts +53 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationSelector.d.ts +16 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/CardinalitySelector.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/ConsoleMetricExporter.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/InMemoryMetricExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricData.d.ts +148 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricProducer.d.ts +27 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/MetricReader.d.ts +138 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/PeriodicExportingMetricReader.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/index.d.ts +15 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/types.d.ts +10 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/utils.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/Aggregation.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AggregationOption.d.ts +41 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/AttributesProcessor.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/InstrumentSelector.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-metrics@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/view/View.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/BasicTracerProvider.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/IdGenerator.d.ts +11 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Sampler.d.ts +74 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/Span.d.ts +17 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/SpanProcessor.d.ts +43 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/TimedEvent.d.ts +19 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/BatchSpanProcessorBase.d.ts +6 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ConsoleSpanExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/InMemorySpanExporter.d.ts +3 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/NoopSpanProcessor.d.ts +4 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/ReadableSpan.d.ts +29 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SimpleSpanProcessor.d.ts +5 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/export/SpanExporter.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/index.d.ts +18 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/export/BatchSpanProcessor.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/platform/node/index.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOffSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/AlwaysOnSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/ParentBasedSampler.d.ts +2 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/sampler/TraceIdRatioBasedSampler.d.ts +1 -0
- package/dist/node_modules/.pnpm/@opentelemetry_sdk-trace-base@2.6.1_@opentelemetry_api@1.9.1/node_modules/@opentelemetry/sdk-trace-base/build/src/types.d.ts +66 -0
- package/dist/otel.d.ts +73 -0
- package/dist/otel.js +82 -0
- package/dist/permissions/index.d.ts +81 -0
- package/dist/permissions/index.js +18 -0
- package/dist/providers/anonymous.d.ts +35 -0
- package/dist/providers/anonymous.js +40 -0
- package/dist/providers/apple.d.ts +61 -0
- package/dist/providers/apple.js +57 -0
- package/dist/providers/connection.d.ts +30 -0
- package/dist/providers/connection.js +33 -0
- package/dist/providers/credentials.d.ts +78 -0
- package/dist/providers/credentials.js +31 -0
- package/dist/providers/custom.d.ts +96 -0
- package/dist/providers/custom.js +108 -0
- package/dist/providers/device.d.ts +33 -0
- package/dist/providers/device.js +30 -0
- package/dist/providers/email.d.ts +45 -0
- package/dist/providers/email.js +52 -0
- package/dist/providers/github.d.ts +56 -0
- package/dist/providers/github.js +79 -0
- package/dist/providers/google.d.ts +56 -0
- package/dist/providers/google.js +59 -0
- package/dist/providers/index.d.ts +16 -0
- package/dist/providers/index.js +16 -0
- package/dist/providers/microsoft.d.ts +59 -0
- package/dist/providers/microsoft.js +98 -0
- package/dist/providers/password.d.ts +68 -0
- package/dist/providers/password.js +348 -0
- package/dist/providers/phone.d.ts +33 -0
- package/dist/providers/phone.js +35 -0
- package/dist/providers/redirect.d.ts +1 -0
- package/dist/providers/redirect.js +11 -0
- package/dist/providers/totp.d.ts +29 -0
- package/dist/providers/totp.js +29 -0
- package/dist/providers/webauthn/attestation.d.ts +42 -0
- package/dist/providers/webauthn/attestation.js +167 -0
- package/dist/providers/webauthn.d.ts +83 -0
- package/dist/providers/webauthn.js +57 -0
- package/dist/react/index.d.ts +55 -0
- package/dist/react/index.js +80 -0
- package/dist/server/auth.d.ts +443 -0
- package/dist/server/auth.js +178 -0
- package/dist/server/cache/context.js +94 -0
- package/dist/server/component/api.d.ts +14 -0
- package/dist/server/component/api.js +13 -0
- package/dist/server/component/context.d.ts +16 -0
- package/dist/server/component/context.js +1 -0
- package/dist/server/component/factor/db.js +71 -0
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.js +78 -0
- package/dist/server/connection/config.js +101 -0
- package/dist/server/connection/domain.d.ts +878 -0
- package/dist/server/connection/domain.js +1122 -0
- package/dist/server/connection/group/service.d.ts +25 -0
- package/dist/server/connection/group/service.js +250 -0
- package/dist/server/connection/http.js +1485 -0
- package/dist/server/connection/oidc.js +366 -0
- package/dist/server/connection/policy/domain.js +59 -0
- package/dist/server/connection/policy.d.ts +1 -0
- package/dist/server/connection/policy.js +163 -0
- package/dist/server/connection/profile.js +22 -0
- package/dist/server/connection/provision.js +182 -0
- package/dist/server/connection/saml/api.js +70 -0
- package/dist/server/connection/saml/binding/post.js +140 -0
- package/dist/server/connection/saml/binding/redirect.js +139 -0
- package/dist/server/connection/saml/binding/shared.js +18 -0
- package/dist/server/connection/saml/c14n.js +224 -0
- package/dist/server/connection/saml/constants.js +100 -0
- package/dist/server/connection/saml/crypto.js +170 -0
- package/dist/server/connection/saml/dom/select.js +299 -0
- package/dist/server/connection/saml/encoding.js +93 -0
- package/dist/server/connection/saml/encryption.js +34 -0
- package/dist/server/connection/saml/entity.js +24 -0
- package/dist/server/connection/saml/extractor.js +408 -0
- package/dist/server/connection/saml/flow.js +150 -0
- package/dist/server/connection/saml/identity/provider.js +66 -0
- package/dist/server/connection/saml/index.js +5 -0
- package/dist/server/connection/saml/metadata.js +294 -0
- package/dist/server/connection/saml/service/provider.js +117 -0
- package/dist/server/connection/saml/signature.js +214 -0
- package/dist/server/connection/saml/template.js +68 -0
- package/dist/server/connection/saml/types.js +1 -0
- package/dist/server/connection/saml/validator.js +32 -0
- package/dist/server/connection/saml/xml/builder.js +68 -0
- package/dist/server/connection/saml/xmldsig.js +598 -0
- package/dist/server/connection/saml/xmlenc.js +162 -0
- package/dist/server/connection/saml.d.ts +56 -0
- package/dist/server/connection/saml.js +762 -0
- package/dist/server/connection/scim.js +115 -0
- package/dist/server/connection/shared.js +74 -0
- package/dist/server/connection/webhook.js +163 -0
- package/dist/server/context.d.ts +137 -0
- package/dist/server/context.js +108 -0
- package/dist/server/contract.d.ts +48 -0
- package/dist/server/contract.js +107 -0
- package/dist/server/cookies.js +90 -0
- package/dist/server/core.js +163 -0
- package/dist/server/cors.d.ts +22 -0
- package/dist/server/cors.js +93 -0
- package/dist/server/crypto.js +43 -0
- package/dist/server/db.js +88 -0
- package/dist/server/device.js +140 -0
- package/dist/server/domains/access.js +29 -0
- package/dist/server/domains/account.d.ts +16 -0
- package/dist/server/domains/account.js +92 -0
- package/dist/server/domains/factor.d.ts +28 -0
- package/dist/server/domains/factor.js +115 -0
- package/dist/server/domains/group.js +87 -0
- package/dist/server/domains/invite.js +76 -0
- package/dist/server/domains/key.js +253 -0
- package/dist/server/domains/member.js +149 -0
- package/dist/server/domains/session.js +29 -0
- package/dist/server/domains/user.js +119 -0
- package/dist/server/env.d.ts +46 -0
- package/dist/server/env.js +96 -0
- package/dist/server/errors.js +38 -0
- package/dist/server/events.d.ts +880 -0
- package/dist/server/events.js +406 -0
- package/dist/server/facade.d.ts +83 -0
- package/dist/server/facade.js +124 -0
- package/dist/server/http.d.ts +125 -0
- package/dist/server/http.js +566 -0
- package/dist/server/identity/claims.js +58 -0
- package/dist/server/identity/convex.d.ts +15 -0
- package/dist/server/identity/convex.js +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.js +11 -0
- package/dist/server/keys.js +60 -0
- package/dist/server/limits.js +41 -0
- package/dist/server/log.js +28 -0
- package/dist/server/mcp.d.ts +19 -0
- package/dist/server/mcp.js +250 -0
- package/dist/server/mutations/account.js +47 -0
- package/dist/server/mutations/calls.js +16 -0
- package/dist/server/mutations/code.js +91 -0
- package/dist/server/mutations/credentials/signin.js +210 -0
- package/dist/server/mutations/invalidate.js +60 -0
- package/dist/server/mutations/oauth.js +251 -0
- package/dist/server/mutations/refresh.js +152 -0
- package/dist/server/mutations/register.js +93 -0
- package/dist/server/mutations/retrieve.js +66 -0
- package/dist/server/mutations/signature.js +36 -0
- package/dist/server/mutations/signin.js +81 -0
- package/dist/server/mutations/signout.js +61 -0
- package/dist/server/mutations/store/refs.js +15 -0
- package/dist/server/mutations/store.js +82 -0
- package/dist/server/mutations/verifier.js +25 -0
- package/dist/server/mutations/verify.js +199 -0
- package/dist/server/oauth/authorize.js +98 -0
- package/dist/server/oauth/client.d.ts +93 -0
- package/dist/server/oauth/client.js +115 -0
- package/dist/server/oauth/code.d.ts +63 -0
- package/dist/server/oauth/code.js +124 -0
- package/dist/server/oauth/domain.d.ts +23 -0
- package/dist/server/oauth/domain.js +1 -0
- package/dist/server/oauth/factory.js +46 -0
- package/dist/server/oauth/grant.js +46 -0
- package/dist/server/oauth/handlers.js +108 -0
- package/dist/server/oauth/manage.js +121 -0
- package/dist/server/oauth/normalize.js +27 -0
- package/dist/server/oauth/refresh.d.ts +71 -0
- package/dist/server/oauth/refresh.js +132 -0
- package/dist/server/oauth/register.js +147 -0
- package/dist/server/oauth/runtime.js +280 -0
- package/dist/server/oauth/token.js +355 -0
- package/dist/server/payloads.d.ts +16 -0
- package/dist/server/payloads.js +30 -0
- package/dist/server/preload.d.ts +249 -0
- package/dist/server/preload.js +673 -0
- package/dist/server/random.js +25 -0
- package/dist/server/redirects.js +85 -0
- package/dist/server/runtime.d.ts +845 -0
- package/dist/server/runtime.js +387 -0
- package/dist/server/secret.js +46 -0
- package/dist/server/services/factors.js +117 -0
- package/dist/server/services/providers.js +23 -0
- package/dist/server/services/resolve.js +17 -0
- package/dist/server/session/lifecycle.d.ts +23 -0
- package/dist/server/session/lifecycle.js +139 -0
- package/dist/server/signin/flow.js +359 -0
- package/dist/server/telemetry.js +68 -0
- package/dist/server/templates.js +91 -0
- package/dist/server/token/refresh.js +35 -0
- package/dist/server/tokens.js +164 -0
- package/dist/server/totp.js +282 -0
- package/dist/server/types.d.ts +1154 -0
- package/dist/server/types.js +1 -0
- package/dist/server/url.js +43 -0
- package/dist/server/user/account.js +325 -0
- package/dist/server/utils/bearer.js +24 -0
- package/dist/server/utils/cache.js +51 -0
- package/dist/server/utils/retry.js +3 -0
- package/dist/server/utils/span.js +59 -0
- package/dist/server/validators.d.ts +2061 -0
- package/dist/server/validators.js +320 -0
- package/dist/server/webauthn.js +699 -0
- package/dist/server/wellknown.d.ts +74 -0
- package/dist/server/wellknown.js +195 -0
- package/dist/shared/brand.d.ts +28 -0
- package/dist/shared/brand.js +13 -0
- package/dist/shared/codes.d.ts +99 -0
- package/dist/shared/codes.js +98 -0
- package/dist/shared/compare.js +23 -0
- package/dist/shared/errors.js +24 -0
- package/dist/shared/event/kinds.d.ts +188 -0
- package/dist/shared/event/kinds.js +103 -0
- package/dist/shared/fetch/guard.js +189 -0
- package/dist/shared/log.js +62 -0
- package/dist/shared/results.d.ts +58 -0
- package/dist/shared/retry.js +27 -0
- package/dist/shared/webauthn.js +9 -0
- package/dist/svelte/AuthLoading.svelte +13 -0
- package/dist/svelte/AuthLoading.svelte.d.ts +8 -0
- package/dist/svelte/SignedIn.svelte +14 -0
- package/dist/svelte/SignedIn.svelte.d.ts +8 -0
- package/dist/svelte/SignedOut.svelte +13 -0
- package/dist/svelte/SignedOut.svelte.d.ts +8 -0
- package/dist/svelte/context.svelte.d.ts +26 -0
- package/dist/svelte/context.svelte.js +61 -0
- package/dist/svelte/index.d.ts +5 -0
- package/dist/svelte/index.js +4 -0
- package/dist/test.d.ts +48 -0
- package/dist/test.js +54 -0
- package/package.json +247 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { LOG_LEVELS } from "../../shared/log.js";
|
|
2
|
+
import { getAuthenticatedSessionIdOrNull } from "../identity/claims.js";
|
|
3
|
+
import { envOptionalNumber, readConfigSync } from "../env.js";
|
|
4
|
+
import { queueAuthEvent } from "../events.js";
|
|
5
|
+
import { authDb } from "../db.js";
|
|
6
|
+
import { log, maybeRedact } from "../log.js";
|
|
7
|
+
import { encodeRefreshToken, refreshTokenExpirationTime } from "../token/refresh.js";
|
|
8
|
+
import { withSpan } from "../utils/span.js";
|
|
9
|
+
import { generateToken } from "../tokens.js";
|
|
10
|
+
|
|
11
|
+
//#region src/server/session/lifecycle.ts
|
|
12
|
+
const DEFAULT_SESSION_TOTAL_DURATION_MS = 1e3 * 60 * 60 * 24 * 30;
|
|
13
|
+
/**
|
|
14
|
+
* Absolute expiration timestamp (ms) for a new session.
|
|
15
|
+
*
|
|
16
|
+
* Resolved from `config.session.totalDurationMs`, then the
|
|
17
|
+
* `AUTH_SESSION_TOTAL_DURATION_MS` env var, defaulting to 30 days.
|
|
18
|
+
*
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
const sessionExpirationTime = (config, now = Date.now()) => now + (config.session?.totalDurationMs ?? readConfigSync(envOptionalNumber("AUTH_SESSION_TOTAL_DURATION_MS")) ?? DEFAULT_SESSION_TOTAL_DURATION_MS);
|
|
22
|
+
/**
|
|
23
|
+
* Build the JWT identity-claim set for a session from the user document.
|
|
24
|
+
*
|
|
25
|
+
* Shared by {@link issueSession} and the refresh exchange so both mint
|
|
26
|
+
* identical claims from the same user fields.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
function buildSessionIdentity(userId, sessionId, user) {
|
|
31
|
+
return {
|
|
32
|
+
subject: userId,
|
|
33
|
+
sessionId,
|
|
34
|
+
...typeof user?.name === "string" ? { name: user.name } : null,
|
|
35
|
+
...typeof user?.email === "string" ? { email: user.email } : null,
|
|
36
|
+
...user?.emailVerificationTime !== void 0 ? { emailVerified: true } : user?.email !== void 0 ? { emailVerified: false } : null,
|
|
37
|
+
...typeof user?.image === "string" ? { picture: user.image } : null,
|
|
38
|
+
...typeof user?.phone === "string" ? { phoneNumber: user.phone } : null,
|
|
39
|
+
...user?.phoneVerificationTime !== void 0 ? { phoneNumberVerified: true } : user?.phone !== void 0 ? { phoneNumberVerified: false } : null
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Convert a {@link SessionIssuance} returned from a mutation into the
|
|
44
|
+
* external `SessionInfo` shape by signing the JWT on the action side.
|
|
45
|
+
*
|
|
46
|
+
* Must be called from an action context because `generateToken` performs
|
|
47
|
+
* RSA-2048 JWT signing that would otherwise block the mutation commit.
|
|
48
|
+
*
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
async function finalizeSessionIssuance(config, issuance) {
|
|
52
|
+
return withSpan("convex-auth.session.finalize", { hasRefreshToken: issuance.refreshToken !== null }, async () => {
|
|
53
|
+
if (issuance.refreshToken === null) return {
|
|
54
|
+
userId: issuance.userId,
|
|
55
|
+
sessionId: issuance.sessionId,
|
|
56
|
+
tokens: null
|
|
57
|
+
};
|
|
58
|
+
const token = await generateToken({ identity: issuance.identity }, config);
|
|
59
|
+
log(LOG_LEVELS.DEBUG, `Generated token ${maybeRedact(token)} and refresh token ${maybeRedact(issuance.refreshToken)} for session ${maybeRedact(issuance.sessionId)}`);
|
|
60
|
+
return {
|
|
61
|
+
userId: issuance.userId,
|
|
62
|
+
sessionId: issuance.sessionId,
|
|
63
|
+
tokens: {
|
|
64
|
+
token,
|
|
65
|
+
refreshToken: issuance.refreshToken
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create (or extend/replace) a session and its refresh-token row, returning the
|
|
72
|
+
* mutation-side {@link SessionIssuance} for later JWT finalization.
|
|
73
|
+
*
|
|
74
|
+
* @param args.generateTokens - When `false`, no refresh token is issued
|
|
75
|
+
* (e.g. TOTP step-up that defers token issuance to a second factor).
|
|
76
|
+
* @internal
|
|
77
|
+
*/
|
|
78
|
+
async function issueSession(ctx, config, args) {
|
|
79
|
+
const issued = await authDb(ctx, config).sessions.create({
|
|
80
|
+
userId: args.userId,
|
|
81
|
+
sessionId: args.existingSessionId,
|
|
82
|
+
replaceSessionId: args.replaceSessionId,
|
|
83
|
+
sessionExpirationTime: sessionExpirationTime(config),
|
|
84
|
+
refreshTokenExpirationTime: args.generateTokens ? refreshTokenExpirationTime(config) : void 0
|
|
85
|
+
});
|
|
86
|
+
const sessionId = issued.sessionId;
|
|
87
|
+
const refreshTokenId = issued.refreshTokenId;
|
|
88
|
+
if (issued.replacedSessionId !== void 0) {
|
|
89
|
+
const replacedSessionId = issued.replacedSessionId;
|
|
90
|
+
await queueAuthEvent(ctx, config, {
|
|
91
|
+
kind: "session.invalidated",
|
|
92
|
+
actor: { type: "system" },
|
|
93
|
+
subject: {
|
|
94
|
+
type: "session",
|
|
95
|
+
id: replacedSessionId
|
|
96
|
+
},
|
|
97
|
+
targets: [{
|
|
98
|
+
kind: "user",
|
|
99
|
+
id: issued.userId
|
|
100
|
+
}, {
|
|
101
|
+
kind: "session",
|
|
102
|
+
id: replacedSessionId
|
|
103
|
+
}],
|
|
104
|
+
outcome: "success",
|
|
105
|
+
data: {
|
|
106
|
+
userId: issued.userId,
|
|
107
|
+
reason: "replaced"
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
userId: issued.userId,
|
|
113
|
+
sessionId,
|
|
114
|
+
identity: buildSessionIdentity(issued.userId, sessionId, issued.user),
|
|
115
|
+
refreshToken: args.generateTokens && refreshTokenId !== void 0 ? encodeRefreshToken(refreshTokenId, sessionId) : null
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Delete a session and all of its refresh tokens.
|
|
120
|
+
*
|
|
121
|
+
* @internal
|
|
122
|
+
*/
|
|
123
|
+
async function deleteSession(ctx, session, config) {
|
|
124
|
+
const db = authDb(ctx, config);
|
|
125
|
+
await db.sessions.delete(session._id);
|
|
126
|
+
await db.refreshTokens.deleteAll(session._id);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Return the current session ID from the auth identity subject.
|
|
130
|
+
*
|
|
131
|
+
* @internal
|
|
132
|
+
*/
|
|
133
|
+
async function getAuthSessionId(ctx) {
|
|
134
|
+
return await getAuthenticatedSessionIdOrNull(ctx);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
export { buildSessionIdentity, deleteSession, finalizeSessionIssuance, getAuthSessionId, issueSession, sessionExpirationTime };
|
|
139
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { authUrlFromEnv } from "../url.js";
|
|
2
|
+
import { generateRandomString } from "../random.js";
|
|
3
|
+
import { log } from "../log.js";
|
|
4
|
+
import { withSpan } from "../utils/span.js";
|
|
5
|
+
import { finalizeSessionIssuance } from "../session/lifecycle.js";
|
|
6
|
+
import { authFlowError } from "../../shared/errors.js";
|
|
7
|
+
import { toConvexError } from "../errors.js";
|
|
8
|
+
import { callCreateVerificationCode } from "../mutations/code.js";
|
|
9
|
+
import { callRefreshSession } from "../mutations/refresh.js";
|
|
10
|
+
import { callSignIn } from "../mutations/signin.js";
|
|
11
|
+
import { callVerifier } from "../mutations/verifier.js";
|
|
12
|
+
import { callVerifyCodeAndSignIn } from "../mutations/verify.js";
|
|
13
|
+
import { redirectAbsoluteUrl, setURLSearchParam } from "../redirects.js";
|
|
14
|
+
import { assertNever } from "../../shared/brand.js";
|
|
15
|
+
import { queryTotpVerifiedByUserId } from "../component/factor/db.js";
|
|
16
|
+
import { handleDevice } from "../device.js";
|
|
17
|
+
import { handleWebAuthn } from "../webauthn.js";
|
|
18
|
+
import { handleTotp } from "../totp.js";
|
|
19
|
+
import { ConvexError } from "convex/values";
|
|
20
|
+
|
|
21
|
+
//#region src/server/signin/flow.ts
|
|
22
|
+
const DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S = 3600 * 24;
|
|
23
|
+
const normalizeVerificationParams = (params) => {
|
|
24
|
+
const value = params ?? {};
|
|
25
|
+
return {
|
|
26
|
+
email: typeof value.email === "string" ? value.email : void 0,
|
|
27
|
+
phone: typeof value.phone === "string" ? value.phone : void 0,
|
|
28
|
+
redirectTo: value.redirectTo,
|
|
29
|
+
connectionId: value.connectionId,
|
|
30
|
+
loginHint: value.loginHint,
|
|
31
|
+
protocol: value.protocol,
|
|
32
|
+
code: value.code
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
const describeUnknown = (value) => {
|
|
36
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
37
|
+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint" || value === null) return String(value);
|
|
38
|
+
return JSON.stringify(value) ?? Object.prototype.toString.call(value);
|
|
39
|
+
};
|
|
40
|
+
const asConvexError = (error, code, message) => {
|
|
41
|
+
if (error instanceof ConvexError) return error;
|
|
42
|
+
if (error instanceof Error) return toConvexError(authFlowError(code, error.message || message));
|
|
43
|
+
return toConvexError(authFlowError(code, `${message} ${describeUnknown(error)}`.trim()));
|
|
44
|
+
};
|
|
45
|
+
const asCredentialsError = (error) => {
|
|
46
|
+
if (error instanceof ConvexError) return error;
|
|
47
|
+
if (error instanceof Error) return new ConvexError({
|
|
48
|
+
code: error.message.startsWith("Missing `") ? "INVALID_PARAMETERS" : "INVALID_CREDENTIALS",
|
|
49
|
+
message: error.message
|
|
50
|
+
});
|
|
51
|
+
return toConvexError(authFlowError("INTERNAL_ERROR", "Failed to authorize credentials."));
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Entry point for all sign-in flows.
|
|
55
|
+
*
|
|
56
|
+
* Refreshes a session (when only `refreshToken` is given), verifies a sign-in
|
|
57
|
+
* code (when only `params.code` is given), or dispatches to the matching
|
|
58
|
+
* provider handler based on `provider.type`.
|
|
59
|
+
*
|
|
60
|
+
* @param provider - The resolved provider, or `null` for refresh/code-only calls.
|
|
61
|
+
* @returns The flow result: `signedIn`, `started`, `redirect`, `totpRequired`, etc.
|
|
62
|
+
*/
|
|
63
|
+
async function signInImpl(ctx, provider, args, options) {
|
|
64
|
+
return withSpan("convex-auth.signin", {
|
|
65
|
+
hasProvider: provider !== null,
|
|
66
|
+
hasCode: args.params?.code !== void 0,
|
|
67
|
+
hasRefreshToken: args.refreshToken !== void 0
|
|
68
|
+
}, async () => {
|
|
69
|
+
if (provider === null && args.refreshToken) try {
|
|
70
|
+
const session = await callRefreshSession(ctx, { refreshToken: args.refreshToken });
|
|
71
|
+
if (session === null) return {
|
|
72
|
+
kind: "signedIn",
|
|
73
|
+
session: null
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
kind: "signedIn",
|
|
77
|
+
session
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to refresh session.");
|
|
81
|
+
}
|
|
82
|
+
if (provider === null && args.params?.code !== void 0) try {
|
|
83
|
+
return {
|
|
84
|
+
kind: "signedIn",
|
|
85
|
+
session: await callVerifyCodeAndSignIn(ctx, {
|
|
86
|
+
params: args.params,
|
|
87
|
+
verifier: args.verifier,
|
|
88
|
+
generateTokens: true,
|
|
89
|
+
allowExtraProviders: options.allowExtraProviders
|
|
90
|
+
})
|
|
91
|
+
};
|
|
92
|
+
} catch (error) {
|
|
93
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to verify sign-in code.");
|
|
94
|
+
}
|
|
95
|
+
const resolvedProvider = provider;
|
|
96
|
+
if (resolvedProvider === null) throw toConvexError(authFlowError("SIGN_IN_MISSING_PARAMS", "Cannot sign in: missing provider, code, or refresh token."));
|
|
97
|
+
/** Exhaustive narrowing dispatch: each case narrows `resolvedProvider` to its concrete config so the handler receives the typed variant without a cast. */
|
|
98
|
+
switch (resolvedProvider.type) {
|
|
99
|
+
case "email":
|
|
100
|
+
case "phone": return handleEmailAndPhoneProvider(ctx, resolvedProvider, args, options);
|
|
101
|
+
case "credentials": return handleCredentials(ctx, resolvedProvider, args, options);
|
|
102
|
+
case "oauth": return handleOAuthProvider(ctx, resolvedProvider, args, options);
|
|
103
|
+
case "webauthn": return handleWebAuthn(ctx, resolvedProvider, args);
|
|
104
|
+
case "totp": return handleTotp(ctx, resolvedProvider, args);
|
|
105
|
+
case "device": return handleDevice(ctx, resolvedProvider, args);
|
|
106
|
+
case "connection": return handleConnectionProvider(ctx, args, options);
|
|
107
|
+
default: return assertNever(resolvedProvider, "Unknown provider type");
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async function handleEmailAndPhoneProvider(ctx, provider, args, options) {
|
|
112
|
+
return withSpan(`convex-auth.signin.${provider.type}`, {}, async () => {
|
|
113
|
+
const normalizedParams = normalizeVerificationParams(args.params);
|
|
114
|
+
if (args.params?.code !== void 0) {
|
|
115
|
+
let result;
|
|
116
|
+
try {
|
|
117
|
+
result = await callVerifyCodeAndSignIn(ctx, {
|
|
118
|
+
params: args.params,
|
|
119
|
+
provider: provider.id,
|
|
120
|
+
generateTokens: options.generateTokens,
|
|
121
|
+
allowExtraProviders: options.allowExtraProviders
|
|
122
|
+
});
|
|
123
|
+
} catch (error) {
|
|
124
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to verify email or phone code.");
|
|
125
|
+
}
|
|
126
|
+
if (result === null) throw toConvexError(authFlowError("INVALID_VERIFICATION_CODE", "Invalid or expired verification code."));
|
|
127
|
+
return {
|
|
128
|
+
kind: "signedIn",
|
|
129
|
+
session: result
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
133
|
+
let code;
|
|
134
|
+
if (provider.generateVerificationToken) try {
|
|
135
|
+
code = await provider.generateVerificationToken();
|
|
136
|
+
} catch {
|
|
137
|
+
throw toConvexError(authFlowError("INTERNAL_ERROR", "Failed to generate verification token"));
|
|
138
|
+
}
|
|
139
|
+
else code = generateRandomString(32, alphabet);
|
|
140
|
+
const expirationTime = Date.now() + (provider.maxAge ?? DEFAULT_EMAIL_VERIFICATION_CODE_DURATION_S) * 1e3;
|
|
141
|
+
let identifier;
|
|
142
|
+
try {
|
|
143
|
+
identifier = await callCreateVerificationCode(ctx, {
|
|
144
|
+
provider: provider.id,
|
|
145
|
+
accountId: args.accountId,
|
|
146
|
+
email: normalizedParams.email,
|
|
147
|
+
phone: normalizedParams.phone,
|
|
148
|
+
code,
|
|
149
|
+
expirationTime,
|
|
150
|
+
allowExtraProviders: options.allowExtraProviders
|
|
151
|
+
});
|
|
152
|
+
} catch (error) {
|
|
153
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to create verification code.");
|
|
154
|
+
}
|
|
155
|
+
let destination;
|
|
156
|
+
try {
|
|
157
|
+
destination = await redirectAbsoluteUrl(ctx, ctx.auth.config, args.params ?? {});
|
|
158
|
+
} catch (error) {
|
|
159
|
+
throw asConvexError(error, "INVALID_REDIRECT", "Failed to resolve redirect URL.");
|
|
160
|
+
}
|
|
161
|
+
const verificationArgs = {
|
|
162
|
+
identifier,
|
|
163
|
+
url: setURLSearchParam(destination, "code", code),
|
|
164
|
+
token: code,
|
|
165
|
+
expires: new Date(expirationTime)
|
|
166
|
+
};
|
|
167
|
+
if (provider.type === "email") try {
|
|
168
|
+
await provider.sendVerificationRequest({
|
|
169
|
+
...verificationArgs,
|
|
170
|
+
provider,
|
|
171
|
+
request: new Request("http://localhost")
|
|
172
|
+
}, ctx);
|
|
173
|
+
} catch {
|
|
174
|
+
throw toConvexError(authFlowError("INTERNAL_ERROR", "Failed to send email code"));
|
|
175
|
+
}
|
|
176
|
+
else try {
|
|
177
|
+
await provider.sendVerificationRequest({
|
|
178
|
+
...verificationArgs,
|
|
179
|
+
provider
|
|
180
|
+
}, ctx);
|
|
181
|
+
} catch {
|
|
182
|
+
throw toConvexError(authFlowError("INTERNAL_ERROR", "Failed to send phone code"));
|
|
183
|
+
}
|
|
184
|
+
return { kind: "started" };
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async function handleCredentials(ctx, provider, args, options) {
|
|
188
|
+
return withSpan("convex-auth.signin.credentials", {}, async () => {
|
|
189
|
+
let result;
|
|
190
|
+
try {
|
|
191
|
+
result = await withSpan("convex-auth.signin.credentials.authorize", { providerId: provider.id }, () => provider.authorize(args.params ?? {}, ctx));
|
|
192
|
+
} catch (error) {
|
|
193
|
+
throw asCredentialsError(error);
|
|
194
|
+
}
|
|
195
|
+
if (result === null) return {
|
|
196
|
+
kind: "signedIn",
|
|
197
|
+
session: null
|
|
198
|
+
};
|
|
199
|
+
if (typeof result === "object" && "kind" in result)
|
|
200
|
+
/**
|
|
201
|
+
* `authorize` may return any non-signedIn flow result, a superset of this
|
|
202
|
+
* function's declared return; the two share only `totpRequired`, so the
|
|
203
|
+
* pass-through needs one typed assertion to the narrower return type.
|
|
204
|
+
*/
|
|
205
|
+
return result;
|
|
206
|
+
if ("provision" in result) {
|
|
207
|
+
const { provision, hasTotp } = result;
|
|
208
|
+
try {
|
|
209
|
+
result = {
|
|
210
|
+
userId: (await withSpan("convex-auth.signin.credentials.provision", { providerId: provider.id }, () => ctx.auth.account.create(ctx, {
|
|
211
|
+
provider: provider.id,
|
|
212
|
+
account: provision.account,
|
|
213
|
+
profile: provision.profile,
|
|
214
|
+
shouldLinkViaEmail: provision.match?.includes("email"),
|
|
215
|
+
shouldLinkViaPhone: provision.match?.includes("phone")
|
|
216
|
+
}))).account.userId,
|
|
217
|
+
hasTotp
|
|
218
|
+
};
|
|
219
|
+
} catch (error) {
|
|
220
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to provision credentials account.");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const hintedHasTotp = result.hasTotp;
|
|
224
|
+
const preIssuedIssuance = result.issuance;
|
|
225
|
+
let hasTotpEnrolled;
|
|
226
|
+
if (hintedHasTotp === false) hasTotpEnrolled = false;
|
|
227
|
+
else if (hintedHasTotp === true) hasTotpEnrolled = true;
|
|
228
|
+
else if (preIssuedIssuance !== void 0 && preIssuedIssuance.refreshToken === null) hasTotpEnrolled = true;
|
|
229
|
+
else try {
|
|
230
|
+
hasTotpEnrolled = await withSpan("convex-auth.signin.credentials.totp-check", { hinted: hintedHasTotp ?? "unknown" }, () => queryTotpVerifiedByUserId(ctx, result.userId)) !== null;
|
|
231
|
+
} catch (error) {
|
|
232
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to load TOTP enrollment.");
|
|
233
|
+
}
|
|
234
|
+
if (hasTotpEnrolled) {
|
|
235
|
+
let verifier;
|
|
236
|
+
try {
|
|
237
|
+
verifier = await callVerifier(ctx, JSON.stringify({ userId: result.userId }));
|
|
238
|
+
} catch (error) {
|
|
239
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to create verifier.");
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
kind: "totpRequired",
|
|
243
|
+
verifier
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
if (preIssuedIssuance !== void 0) try {
|
|
247
|
+
return {
|
|
248
|
+
kind: "signedIn",
|
|
249
|
+
session: await withSpan("convex-auth.signin.credentials.finalize", {
|
|
250
|
+
generateTokens: options.generateTokens,
|
|
251
|
+
fromAuthorize: true
|
|
252
|
+
}, () => finalizeSessionIssuance(ctx.auth.config, {
|
|
253
|
+
...preIssuedIssuance,
|
|
254
|
+
refreshToken: options.generateTokens ? preIssuedIssuance.refreshToken : null
|
|
255
|
+
}))
|
|
256
|
+
};
|
|
257
|
+
} catch (error) {
|
|
258
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to finalize sign-in.");
|
|
259
|
+
}
|
|
260
|
+
let idsAndTokens;
|
|
261
|
+
try {
|
|
262
|
+
idsAndTokens = await withSpan("convex-auth.signin.credentials.issue-session", { generateTokens: options.generateTokens }, () => callSignIn(ctx, {
|
|
263
|
+
userId: result.userId,
|
|
264
|
+
sessionId: result.sessionId,
|
|
265
|
+
generateTokens: options.generateTokens
|
|
266
|
+
}));
|
|
267
|
+
} catch (error) {
|
|
268
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to complete sign-in.");
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
kind: "signedIn",
|
|
272
|
+
session: idsAndTokens
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async function handleOAuthProvider(ctx, provider, args, options) {
|
|
277
|
+
return withSpan(`convex-auth.signin.oauth`, { provider: provider.id }, async () => {
|
|
278
|
+
if (args.params?.code !== void 0) {
|
|
279
|
+
let result;
|
|
280
|
+
try {
|
|
281
|
+
result = await callVerifyCodeAndSignIn(ctx, {
|
|
282
|
+
params: args.params,
|
|
283
|
+
verifier: args.verifier,
|
|
284
|
+
generateTokens: true,
|
|
285
|
+
allowExtraProviders: options.allowExtraProviders
|
|
286
|
+
});
|
|
287
|
+
} catch (error) {
|
|
288
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to verify OAuth sign-in.");
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
kind: "signedIn",
|
|
292
|
+
session: result
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const authSiteUrl = options.authSiteUrl ?? authUrlFromEnv();
|
|
296
|
+
const redirect = new URL(`${authSiteUrl.replace(/\/$/, "")}/signin/${provider.id}`);
|
|
297
|
+
let verifier;
|
|
298
|
+
try {
|
|
299
|
+
verifier = await callVerifier(ctx);
|
|
300
|
+
} catch (error) {
|
|
301
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to create verifier.");
|
|
302
|
+
}
|
|
303
|
+
redirect.searchParams.set("code", verifier);
|
|
304
|
+
if (args.params?.redirectTo !== void 0) {
|
|
305
|
+
if (typeof args.params.redirectTo !== "string") throw toConvexError(authFlowError("INVALID_REDIRECT", `Expected \`redirectTo\` to be a string, got ${describeUnknown(args.params.redirectTo)}`));
|
|
306
|
+
redirect.searchParams.set("redirectTo", args.params.redirectTo);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
kind: "redirect",
|
|
310
|
+
redirect: redirect.toString(),
|
|
311
|
+
verifier
|
|
312
|
+
};
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
async function handleConnectionProvider(ctx, args, options) {
|
|
316
|
+
return withSpan("convex-auth.signin.connection", {}, async () => {
|
|
317
|
+
const normalizedParams = normalizeVerificationParams(args.params);
|
|
318
|
+
const connectionId = normalizedParams.connectionId;
|
|
319
|
+
if (!connectionId || typeof connectionId !== "string") throw toConvexError(authFlowError("SIGN_IN_MISSING_PARAMS", "connectionId is required for Connection sign-in."));
|
|
320
|
+
let protocol = (normalizedParams.protocol === "oidc" || normalizedParams.protocol === "saml" ? normalizedParams.protocol : void 0) ?? (options.resolveConnectionProtocol ? await (async () => {
|
|
321
|
+
try {
|
|
322
|
+
return await options.resolveConnectionProtocol(ctx, connectionId);
|
|
323
|
+
} catch (error) {
|
|
324
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to resolve Connection protocol.");
|
|
325
|
+
}
|
|
326
|
+
})() : "oidc");
|
|
327
|
+
log("DEBUG", "[group-connection] signin:resolved", {
|
|
328
|
+
connectionId,
|
|
329
|
+
protocol,
|
|
330
|
+
redirectTo: typeof args.params?.redirectTo === "string" ? args.params.redirectTo : void 0
|
|
331
|
+
});
|
|
332
|
+
if (protocol !== "oidc" && protocol !== "saml") throw toConvexError(authFlowError("SIGN_IN_MISSING_PARAMS", `Invalid Connection protocol: ${protocol}. Expected "oidc" or "saml".`));
|
|
333
|
+
let verifier;
|
|
334
|
+
try {
|
|
335
|
+
verifier = await callVerifier(ctx);
|
|
336
|
+
} catch (error) {
|
|
337
|
+
throw asConvexError(error, "INTERNAL_ERROR", "Failed to create verifier.");
|
|
338
|
+
}
|
|
339
|
+
const siteUrl = options.authSiteUrl ?? authUrlFromEnv();
|
|
340
|
+
const redirect = new URL(`${siteUrl.replace(/\/$/, "")}/connections/${connectionId}/${protocol}/signin`);
|
|
341
|
+
redirect.searchParams.set("code", verifier);
|
|
342
|
+
if (typeof args.params?.redirectTo === "string") redirect.searchParams.set("redirectTo", args.params.redirectTo);
|
|
343
|
+
if (typeof normalizedParams.loginHint === "string") redirect.searchParams.set("loginHint", normalizedParams.loginHint);
|
|
344
|
+
log("DEBUG", "[group-connection] signin:redirect", {
|
|
345
|
+
connectionId,
|
|
346
|
+
protocol,
|
|
347
|
+
redirect: redirect.toString()
|
|
348
|
+
});
|
|
349
|
+
return {
|
|
350
|
+
kind: "redirect",
|
|
351
|
+
redirect: redirect.toString(),
|
|
352
|
+
verifier
|
|
353
|
+
};
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
//#endregion
|
|
358
|
+
export { signInImpl };
|
|
359
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { envOptionalString, readConfigSync } from "./env.js";
|
|
2
|
+
import { authDb } from "./db.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/telemetry.ts
|
|
5
|
+
function tokenIdentifierForUser(userId) {
|
|
6
|
+
const issuer = readConfigSync(envOptionalString("CONVEX_SITE_URL"));
|
|
7
|
+
return typeof issuer === "string" && issuer.length > 0 ? `${userId}${issuer}` : userId;
|
|
8
|
+
}
|
|
9
|
+
const AUTH_IDENTITY_ATTRIBUTE_KEYS = {
|
|
10
|
+
userId: "auth.user.id",
|
|
11
|
+
sessionId: "auth.session.id",
|
|
12
|
+
refreshTokenId: "auth.refresh_token.id",
|
|
13
|
+
email: "auth.user.email",
|
|
14
|
+
tokenIdentifier: "auth.token_identifier"
|
|
15
|
+
};
|
|
16
|
+
function projectIdentityValue(config, field, value) {
|
|
17
|
+
if (value === void 0) return;
|
|
18
|
+
const mode = config.telemetry?.includeIdentity ?? "none";
|
|
19
|
+
if (mode === "none") return;
|
|
20
|
+
if (mode === "hashed") return config.telemetry?.hashIdentity?.(value, field);
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
async function buildAuthIdentityAttributes(ctx, config, args) {
|
|
24
|
+
const fields = config.telemetry?.identityFields ?? {};
|
|
25
|
+
if ((config.telemetry?.includeIdentity ?? "none") === "none") return {};
|
|
26
|
+
let email;
|
|
27
|
+
if (fields.email) {
|
|
28
|
+
const user = await authDb(ctx, config).users.get({ id: args.userId });
|
|
29
|
+
if (typeof user?.email === "string") email = user.email;
|
|
30
|
+
}
|
|
31
|
+
return buildKnownAuthIdentityAttributes(config, args, email);
|
|
32
|
+
}
|
|
33
|
+
function buildKnownAuthIdentityAttributes(config, args, email) {
|
|
34
|
+
const fields = config.telemetry?.identityFields ?? {};
|
|
35
|
+
const mode = config.telemetry?.includeIdentity ?? "none";
|
|
36
|
+
if (mode === "none") return {};
|
|
37
|
+
const values = {
|
|
38
|
+
userId: args.userId,
|
|
39
|
+
sessionId: args.sessionId,
|
|
40
|
+
tokenIdentifier: tokenIdentifierForUser(args.userId),
|
|
41
|
+
...args.refreshTokenId === void 0 ? {} : { refreshTokenId: args.refreshTokenId },
|
|
42
|
+
...email === void 0 ? {} : { email }
|
|
43
|
+
};
|
|
44
|
+
const attributes = {};
|
|
45
|
+
for (const field of Object.keys(fields)) {
|
|
46
|
+
if (!fields[field]) continue;
|
|
47
|
+
const projected = projectIdentityValue(config, field, values[field]);
|
|
48
|
+
if (projected !== void 0) attributes[AUTH_IDENTITY_ATTRIBUTE_KEYS[field]] = projected;
|
|
49
|
+
}
|
|
50
|
+
if (Object.keys(attributes).length > 0) attributes["auth.identity.mode"] = mode;
|
|
51
|
+
return attributes;
|
|
52
|
+
}
|
|
53
|
+
/** Build refresh span attributes from the user returned by token rotation. @internal */
|
|
54
|
+
function buildKnownRefreshIdentityAttributes(config, args, email) {
|
|
55
|
+
return buildKnownAuthIdentityAttributes(config, args, email);
|
|
56
|
+
}
|
|
57
|
+
/** Build sign-in span attributes from a user already loaded by the session transaction. @internal */
|
|
58
|
+
function buildKnownSignInIdentityAttributes(config, args, email) {
|
|
59
|
+
return buildKnownAuthIdentityAttributes(config, args, email);
|
|
60
|
+
}
|
|
61
|
+
/** @internal */
|
|
62
|
+
async function buildSignOutIdentityAttributes(ctx, config, args) {
|
|
63
|
+
return await buildAuthIdentityAttributes(ctx, config, args);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
export { buildKnownRefreshIdentityAttributes, buildKnownSignInIdentityAttributes, buildSignOutIdentityAttributes };
|
|
68
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
//#region src/server/templates.ts
|
|
2
|
+
/**
|
|
3
|
+
* Default email templates generated by the Auth library.
|
|
4
|
+
*
|
|
5
|
+
* These are used when the library sends emails on behalf of the developer
|
|
6
|
+
* (for example magic links). The developer provides the transport via
|
|
7
|
+
* `email.send`; the library provides the content.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Default magic link email template.
|
|
13
|
+
*
|
|
14
|
+
* Clean, minimal design that works across email clients.
|
|
15
|
+
* Used by the auto-registered `email` provider when `email` is
|
|
16
|
+
* configured in `defineAuth(...)`.
|
|
17
|
+
*/
|
|
18
|
+
const HTML_ENTITIES = {
|
|
19
|
+
"&": "&",
|
|
20
|
+
"<": "<",
|
|
21
|
+
">": ">",
|
|
22
|
+
"\"": """,
|
|
23
|
+
"'": "'"
|
|
24
|
+
};
|
|
25
|
+
/** Escape a value for safe interpolation into HTML text and double-quoted attributes. */
|
|
26
|
+
function escapeHtml(value) {
|
|
27
|
+
return value.replace(/[&<>"']/g, (c) => HTML_ENTITIES[c]);
|
|
28
|
+
}
|
|
29
|
+
/** @internal */
|
|
30
|
+
function defaultMagicLinkEmail(url, host) {
|
|
31
|
+
const escapedHost = escapeHtml(host);
|
|
32
|
+
const escapedUrl = escapeHtml(url);
|
|
33
|
+
return `<!DOCTYPE html>
|
|
34
|
+
<html lang="en">
|
|
35
|
+
<head>
|
|
36
|
+
<meta charset="utf-8" />
|
|
37
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
38
|
+
<title>Sign in to ${escapedHost}</title>
|
|
39
|
+
</head>
|
|
40
|
+
<body style="margin:0;padding:0;background-color:#f9fafb;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;">
|
|
41
|
+
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background-color:#f9fafb;padding:40px 16px;">
|
|
42
|
+
<tr>
|
|
43
|
+
<td align="center">
|
|
44
|
+
<table role="presentation" width="480" cellpadding="0" cellspacing="0" style="background-color:#ffffff;border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;">
|
|
45
|
+
<tr>
|
|
46
|
+
<td style="padding:32px 32px 0 32px;text-align:center;">
|
|
47
|
+
<h1 style="margin:0 0 8px 0;font-size:20px;font-weight:600;color:#111827;line-height:1.3;">
|
|
48
|
+
Sign in to ${escapedHost}
|
|
49
|
+
</h1>
|
|
50
|
+
</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr>
|
|
53
|
+
<td style="padding:24px 32px;">
|
|
54
|
+
<p style="margin:0 0 24px 0;font-size:15px;line-height:1.6;color:#4b5563;text-align:center;">
|
|
55
|
+
Click the button below to sign in. This link will expire shortly.
|
|
56
|
+
</p>
|
|
57
|
+
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
|
|
58
|
+
<tr>
|
|
59
|
+
<td align="center" style="padding:0 0 24px 0;">
|
|
60
|
+
<a href="${escapedUrl}" target="_blank" style="display:inline-block;background-color:#111827;color:#ffffff;font-size:15px;font-weight:600;text-decoration:none;padding:12px 32px;border-radius:6px;line-height:1;">
|
|
61
|
+
Sign in
|
|
62
|
+
</a>
|
|
63
|
+
</td>
|
|
64
|
+
</tr>
|
|
65
|
+
</table>
|
|
66
|
+
<p style="margin:0 0 12px 0;font-size:13px;line-height:1.6;color:#9ca3af;">
|
|
67
|
+
If the button doesn't work, copy and paste this URL into your browser:
|
|
68
|
+
</p>
|
|
69
|
+
<p style="margin:0;font-size:13px;line-height:1.5;color:#6b7280;word-break:break-all;">
|
|
70
|
+
${escapedUrl}
|
|
71
|
+
</p>
|
|
72
|
+
</td>
|
|
73
|
+
</tr>
|
|
74
|
+
<tr>
|
|
75
|
+
<td style="padding:20px 32px;border-top:1px solid #e5e7eb;">
|
|
76
|
+
<p style="margin:0;font-size:12px;line-height:1.5;color:#9ca3af;text-align:center;">
|
|
77
|
+
If you didn't request this email, you can safely ignore it.
|
|
78
|
+
</p>
|
|
79
|
+
</td>
|
|
80
|
+
</tr>
|
|
81
|
+
</table>
|
|
82
|
+
</td>
|
|
83
|
+
</tr>
|
|
84
|
+
</table>
|
|
85
|
+
</body>
|
|
86
|
+
</html>`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
export { defaultMagicLinkEmail };
|
|
91
|
+
//# sourceMappingURL=templates.js.map
|