@distilled.cloud/auth0 0.0.0 → 1.0.0-rc.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +201 -0
  2. package/lib/credentials.d.ts +35 -0
  3. package/lib/credentials.d.ts.map +1 -0
  4. package/lib/credentials.js +45 -0
  5. package/lib/credentials.js.map +1 -0
  6. package/lib/errors.d.ts +36 -0
  7. package/lib/errors.d.ts.map +1 -0
  8. package/lib/errors.js +26 -0
  9. package/lib/errors.js.map +1 -0
  10. package/lib/index.d.ts +24 -0
  11. package/lib/index.d.ts.map +1 -0
  12. package/lib/index.js +28 -0
  13. package/lib/index.js.map +1 -0
  14. package/lib/pagination.d.ts +10 -0
  15. package/lib/pagination.d.ts.map +1 -0
  16. package/lib/pagination.js +10 -0
  17. package/lib/pagination.js.map +1 -0
  18. package/lib/protocol.d.ts +18 -0
  19. package/lib/protocol.d.ts.map +1 -0
  20. package/lib/protocol.js +46 -0
  21. package/lib/protocol.js.map +1 -0
  22. package/lib/retry.d.ts +32 -0
  23. package/lib/retry.d.ts.map +1 -0
  24. package/lib/retry.js +32 -0
  25. package/lib/retry.js.map +1 -0
  26. package/lib/services/auth0.d.ts +21869 -0
  27. package/lib/services/auth0.d.ts.map +1 -0
  28. package/lib/services/auth0.js +20598 -0
  29. package/lib/services/auth0.js.map +1 -0
  30. package/lib/services/index.d.ts +2 -0
  31. package/lib/services/index.d.ts.map +1 -0
  32. package/lib/services/index.js +3 -0
  33. package/lib/services/index.js.map +1 -0
  34. package/lib/traits.d.ts +11 -0
  35. package/lib/traits.d.ts.map +1 -0
  36. package/lib/traits.js +11 -0
  37. package/lib/traits.js.map +1 -0
  38. package/package.json +77 -6
  39. package/src/credentials.ts +70 -0
  40. package/src/errors.ts +50 -0
  41. package/src/index.ts +37 -0
  42. package/src/pagination.ts +12 -0
  43. package/src/protocol.ts +69 -0
  44. package/src/retry.ts +54 -0
  45. package/src/services/auth0.ts +54797 -0
  46. package/src/services/index.ts +2 -0
  47. package/src/traits.ts +44 -0
@@ -0,0 +1,2 @@
1
+ export * as auth0 from "./auth0.ts";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ // AUTO-GENERATED by scripts/generate.ts. Do not edit.
2
+ export * as auth0 from "./auth0.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Auth0 SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Auth0 has no envelope of its own; the
6
+ * REST-protocol traits (SensitiveValue / RawResponse) come from
7
+ * `core/protocol-rest`.
8
+ */
9
+ export { Body, Header, Query, Label, Http, ResponseCode, HttpBody, FormDataFile, KeyDictionary, UnionCases, applyErrorMatchers, getErrorMatchers, type HttpTrait, type ErrorMatcher, bodySymbol, headerSymbol, querySymbol, labelSymbol, httpSymbol, responseCodeSymbol, httpBodySymbol, formDataFileSymbol, keyDictionarySymbol, unionCasesSymbol, errorMatchersSymbol, } from "@distilled.cloud/core/trait";
10
+ export { SensitiveValue, RawResponse, RawResponseRoot, sensitiveValueSymbol, rawResponseSymbol, rawResponseRootSymbol, } from "@distilled.cloud/core/protocol-rest";
11
+ //# sourceMappingURL=traits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traits.d.ts","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC"}
package/lib/traits.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Auth0 SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Auth0 has no envelope of its own; the
6
+ * REST-protocol traits (SensitiveValue / RawResponse) come from
7
+ * `core/protocol-rest`.
8
+ */
9
+ export { Body, Header, Query, Label, Http, ResponseCode, HttpBody, FormDataFile, KeyDictionary, UnionCases, applyErrorMatchers, getErrorMatchers, bodySymbol, headerSymbol, querySymbol, labelSymbol, httpSymbol, responseCodeSymbol, httpBodySymbol, formDataFileSymbol, keyDictionarySymbol, unionCasesSymbol, errorMatchersSymbol, } from "@distilled.cloud/core/trait";
10
+ export { SensitiveValue, RawResponse, RawResponseRoot, sensitiveValueSymbol, rawResponseSymbol, rawResponseRootSymbol, } from "@distilled.cloud/core/protocol-rest";
11
+ //# sourceMappingURL=traits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traits.js","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EACL,IAAI,EACJ,MAAM,EACN,KAAK,EACL,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,gBAAgB,EAGhB,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,85 @@
1
1
  {
2
2
  "name": "@distilled.cloud/auth0",
3
- "version": "0.0.0",
4
- "description": "Placeholder package for an upcoming distilled SDK.",
5
- "license": "Apache-2.0",
3
+ "version": "1.0.0-rc.9",
6
4
  "repository": {
7
5
  "type": "git",
8
6
  "url": "https://github.com/alchemy-run/distilled",
9
7
  "directory": "packages/auth0"
10
8
  },
11
- "publishConfig": {
12
- "access": "public"
9
+ "license": "Apache-2.0",
10
+ "type": "module",
11
+ "sideEffects": false,
12
+ "files": [
13
+ "lib",
14
+ "src"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "types": "./lib/index.d.ts",
19
+ "bun": "./src/index.ts",
20
+ "worker": "./src/index.ts",
21
+ "default": "./lib/index.js"
22
+ },
23
+ "./Credentials": {
24
+ "types": "./lib/credentials.d.ts",
25
+ "bun": "./src/credentials.ts",
26
+ "worker": "./src/credentials.ts",
27
+ "default": "./lib/credentials.js"
28
+ },
29
+ "./Errors": {
30
+ "types": "./lib/errors.d.ts",
31
+ "bun": "./src/errors.ts",
32
+ "worker": "./src/errors.ts",
33
+ "default": "./lib/errors.js"
34
+ },
35
+ "./Traits": {
36
+ "types": "./lib/traits.d.ts",
37
+ "bun": "./src/traits.ts",
38
+ "worker": "./src/traits.ts",
39
+ "default": "./lib/traits.js"
40
+ },
41
+ "./Pagination": {
42
+ "types": "./lib/pagination.d.ts",
43
+ "bun": "./src/pagination.ts",
44
+ "worker": "./src/pagination.ts",
45
+ "default": "./lib/pagination.js"
46
+ },
47
+ "./Protocol": {
48
+ "types": "./lib/protocol.d.ts",
49
+ "bun": "./src/protocol.ts",
50
+ "worker": "./src/protocol.ts",
51
+ "default": "./lib/protocol.js"
52
+ },
53
+ "./Retry": {
54
+ "types": "./lib/retry.d.ts",
55
+ "bun": "./src/retry.ts",
56
+ "worker": "./src/retry.ts",
57
+ "default": "./lib/retry.js"
58
+ },
59
+ "./*": {
60
+ "types": "./lib/services/*.d.ts",
61
+ "bun": "./src/services/*.ts",
62
+ "worker": "./src/services/*.ts",
63
+ "default": "./lib/services/*.js"
64
+ }
65
+ },
66
+ "dependencies": {
67
+ "@distilled.cloud/core": "1.0.0-rc.9"
68
+ },
69
+ "devDependencies": {
70
+ "@types/bun": "latest",
71
+ "@types/node": "latest",
72
+ "@effect/platform-bun": ">=4.0.0-rc.112 || >=4.0.0"
73
+ },
74
+ "peerDependencies": {
75
+ "effect": ">=4.0.0-rc.112 || >=4.0.0"
76
+ },
77
+ "scripts": {
78
+ "build": "tsc -b",
79
+ "convert": "bun scripts/convert.ts",
80
+ "generate": "bun scripts/convert.ts && bun scripts/generate.ts",
81
+ "typecheck": "tsc -p tsconfig.json",
82
+ "specs:fetch": "git submodule update --force --init --depth=1 specs/spec-mirror-auth0",
83
+ "specs:update": "git submodule update --remote --force --depth=1 specs/spec-mirror-auth0"
13
84
  }
14
- }
85
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Auth0 credentials — hand-written.
3
+ *
4
+ * The `Credentials` service holds an *effect* that resolves the current
5
+ * credentials on every request (the protocol layer resolves it per request
6
+ * on the calling fiber). Management API auth is a bearer token sent as
7
+ * `Authorization: Bearer <token>` against `https://{domain}/api/v2`.
8
+ */
9
+ import * as Context from "effect/Context";
10
+ import * as Effect from "effect/Effect";
11
+ import * as Layer from "effect/Layer";
12
+ import * as Redacted from "effect/Redacted";
13
+ import { ConfigError } from "@distilled.cloud/core/errors";
14
+
15
+ /** Build the Management API base URL for a tenant domain. */
16
+ export const apiBaseUrlForDomain = (domain: string): string => {
17
+ const host = domain.replace(/^https?:\/\//, "").replace(/\/+$/, "");
18
+ return `https://${host}/api/v2`;
19
+ };
20
+
21
+ export interface Config {
22
+ readonly token: Redacted.Redacted<string>;
23
+ readonly domain: string;
24
+ readonly apiBaseUrl: string;
25
+ }
26
+
27
+ export class Credentials extends Context.Service<
28
+ Credentials,
29
+ Effect.Effect<Config>
30
+ >()("Auth0Credentials") {}
31
+
32
+ /** Layer from a Management API token + tenant domain. */
33
+ export const fromToken = (config: {
34
+ readonly token: string;
35
+ readonly domain: string;
36
+ readonly apiBaseUrl?: string;
37
+ }): Layer.Layer<Credentials> =>
38
+ Layer.succeed(
39
+ Credentials,
40
+ Effect.succeed({
41
+ token: Redacted.make(config.token),
42
+ domain: config.domain,
43
+ apiBaseUrl: config.apiBaseUrl ?? apiBaseUrlForDomain(config.domain),
44
+ }),
45
+ );
46
+
47
+ /**
48
+ * Reads AUTH0_DOMAIN and AUTH0_MANAGEMENT_TOKEN (required) and
49
+ * AUTH0_API_BASE_URL (optional override of `https://{domain}/api/v2`).
50
+ */
51
+ export const CredentialsFromEnv: Layer.Layer<Credentials> = Layer.succeed(
52
+ Credentials,
53
+ Effect.gen(function* () {
54
+ const domain = process.env.AUTH0_DOMAIN;
55
+ const token = process.env.AUTH0_MANAGEMENT_TOKEN;
56
+
57
+ if (!domain || !token) {
58
+ return yield* new ConfigError({
59
+ message:
60
+ "AUTH0_DOMAIN and AUTH0_MANAGEMENT_TOKEN environment variables are required",
61
+ });
62
+ }
63
+
64
+ return {
65
+ token: Redacted.make(token),
66
+ domain,
67
+ apiBaseUrl: process.env.AUTH0_API_BASE_URL ?? apiBaseUrlForDomain(domain),
68
+ };
69
+ }).pipe(Effect.orDie),
70
+ );
package/src/errors.ts ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Auth0-specific error types.
3
+ *
4
+ * Re-exports the common HTTP errors from core and adds the Auth0 fallback
5
+ * errors. Note the generated service module additionally defines its own
6
+ * per-status matcher classes (BadRequest/NotFound/…) for the statuses each
7
+ * operation declares — those share `_tag`s with the core classes here, so
8
+ * `catchTag` works against either.
9
+ */
10
+ export {
11
+ BadGateway,
12
+ BadRequest,
13
+ Conflict,
14
+ ConfigError,
15
+ Forbidden,
16
+ GatewayTimeout,
17
+ InternalServerError,
18
+ Locked,
19
+ NotFound,
20
+ ServiceUnavailable,
21
+ TooManyRequests,
22
+ Unauthorized,
23
+ UnprocessableEntity,
24
+ HTTP_STATUS_MAP,
25
+ DEFAULT_ERRORS,
26
+ API_ERRORS,
27
+ } from "@distilled.cloud/core/errors";
28
+ export type { DefaultErrors } from "@distilled.cloud/core/errors";
29
+
30
+ import * as Schema from "effect/Schema";
31
+ import * as Category from "@distilled.cloud/core/category";
32
+
33
+ /** Unknown Auth0 error — returned when nothing else matches the failure. */
34
+ export class UnknownAuth0Error extends Schema.TaggedError<UnknownAuth0Error>()(
35
+ "UnknownAuth0Error",
36
+ {
37
+ code: Schema.optional(Schema.String),
38
+ message: Schema.optional(Schema.String),
39
+ body: Schema.Unknown,
40
+ },
41
+ ).pipe(Category.withServerError) {}
42
+
43
+ /** Schema parse error wrapper. */
44
+ export class Auth0ParseError extends Schema.TaggedError<Auth0ParseError>()(
45
+ "Auth0ParseError",
46
+ {
47
+ body: Schema.Unknown,
48
+ cause: Schema.Unknown,
49
+ },
50
+ ).pipe(Category.withParseError) {}
package/src/index.ts ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @distilled.cloud/auth0 — Auth0 Management API SDK for Effect.
3
+ *
4
+ * `./services` is generated by `scripts/generate.ts` from the Smithy model
5
+ * in `.generated-specs` (written by `scripts/convert.ts` from the OpenAPI
6
+ * spec). Everything else in this folder is hand-written.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import * as Auth0 from "@distilled.cloud/auth0";
11
+ *
12
+ * const actions = yield* Auth0.Services.auth0.getActions({});
13
+ * ```
14
+ */
15
+ export * from "./credentials.ts";
16
+ export * from "./errors.ts";
17
+ export * as T from "./traits.ts";
18
+ export {
19
+ Auth0Protocol,
20
+ type Auth0OpError,
21
+ type Auth0OpContext,
22
+ } from "./protocol.ts";
23
+ export { paginateCursor, paginatePageNumber } from "./pagination.ts";
24
+ export * as Retry from "./retry.ts";
25
+ export * as Services from "./services/index.ts";
26
+ // Operations (and their request/response types) are importable straight off
27
+ // the package root. The service-local typed error classes shadow the
28
+ // same-named shared ones from ./errors.ts — the ops actually raise the
29
+ // service-local classes.
30
+ export * from "./services/auth0.ts";
31
+ export {
32
+ BadRequest,
33
+ Conflict,
34
+ Forbidden,
35
+ NotFound,
36
+ UnprocessableEntity,
37
+ } from "./services/auth0.ts";
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Auth0 pagination — hand-written.
3
+ *
4
+ * Auth0's paginated list operations are typically page-number mode (`page`
5
+ * / `per_page` in); some endpoints also use checkpoint/cursor style
6
+ * (`from` / `take`). Generated operations pass the matching core strategy
7
+ * to `API.makePaginated`.
8
+ */
9
+ export {
10
+ paginateCursor,
11
+ paginatePageNumber,
12
+ } from "@distilled.cloud/core/pagination";
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Auth0Protocol — hand-written.
3
+ *
4
+ * Auth0's Management API speaks plain bearer-authenticated JSON REST (no
5
+ * response envelope), so the whole protocol is one `makeRestProtocol` call
6
+ * from `core/protocol-rest`:
7
+ *
8
+ * request: credentials → `Authorization: Bearer <token>` + base URL
9
+ * (`https://{domain}/api/v2`), resolved from the calling fiber
10
+ * on every request
11
+ *
12
+ * response: 2xx JSON is the payload (sensitive members delivered as
13
+ * `Redacted`); non-2xx `{ statusCode?, error?, errorCode?,
14
+ * message }` bodies map to the operation's typed error classes
15
+ * by status, then the shared HTTP-status classes, then
16
+ * {@link UnknownAuth0Error}.
17
+ */
18
+ import * as Effect from "effect/Effect";
19
+ import type * as Layer from "effect/Layer";
20
+ import * as Redacted from "effect/Redacted";
21
+ import type * as HttpClient from "effect/unstable/http/HttpClient";
22
+ import type * as HttpClientError from "effect/unstable/http/HttpClientError";
23
+ import type * as API from "@distilled.cloud/core/api";
24
+ import { makeRestProtocol } from "@distilled.cloud/core/protocol-rest";
25
+ import type { API_ERRORS, ConfigError } from "@distilled.cloud/core/errors";
26
+ import { Credentials, type Config } from "./credentials.ts";
27
+ import { UnknownAuth0Error } from "./errors.ts";
28
+
29
+ /**
30
+ * Error channel shared by every generated Auth0 operation. Generated service
31
+ * files annotate operations with `API.OperationMethod<I, O, Auth0OpError,
32
+ * Auth0OpContext>` explicitly so the compiler never infers these back out of
33
+ * the schema generics.
34
+ */
35
+ export type Auth0OpError =
36
+ | InstanceType<(typeof API_ERRORS)[number]>
37
+ | UnknownAuth0Error
38
+ | ConfigError
39
+ | HttpClientError.HttpClientError;
40
+
41
+ /** Context (requirements) shared by every generated Auth0 operation. */
42
+ export type Auth0OpContext = Credentials | HttpClient.HttpClient;
43
+
44
+ export const Auth0Protocol: Layer.Layer<API.Protocol> =
45
+ makeRestProtocol<Config>({
46
+ // The Credentials service holds an effect — resolving it here (per
47
+ // request, on the calling fiber) picks up context-provided credentials.
48
+ credentials: Effect.gen(function* () {
49
+ const resolve = yield* Credentials;
50
+ return yield* resolve;
51
+ }),
52
+ baseUrl: (creds) => creds.apiBaseUrl,
53
+ headers: (creds) => ({
54
+ Authorization: `Bearer ${Redacted.value(creds.token)}`,
55
+ }),
56
+ // Auth0's error body is `{ statusCode?, error?, errorCode?, message }` —
57
+ // the factory's default lenient envelope covers it.
58
+ unknownError: ({ code, message, body }) =>
59
+ new UnknownAuth0Error({
60
+ code:
61
+ typeof code === "string"
62
+ ? code
63
+ : code !== undefined
64
+ ? String(code)
65
+ : undefined,
66
+ message,
67
+ body,
68
+ }),
69
+ });
package/src/retry.ts ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Auth0 retry configuration.
3
+ *
4
+ * Defines the per-SDK `Retry` Context.Service tag that generated operations
5
+ * wire into `API.make`. Callers can install a blanket retry policy at the
6
+ * layer level and have every Auth0 API call below it pick it up:
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import * as Auth0 from "@distilled.cloud/auth0";
11
+ *
12
+ * myEffect.pipe(Auth0.Retry.transient);
13
+ * Effect.provide(myEffect, Layer.succeed(Auth0.Retry.Retry, customPolicy));
14
+ * ```
15
+ */
16
+ import * as Context from "effect/Context";
17
+ import * as Effect from "effect/Effect";
18
+ import * as Layer from "effect/Layer";
19
+ import {
20
+ type Policy,
21
+ throttlingFactory,
22
+ transientFactory,
23
+ } from "@distilled.cloud/core/retry";
24
+
25
+ export {
26
+ type Options,
27
+ type Factory,
28
+ type Policy,
29
+ makeDefault,
30
+ jittered,
31
+ capped,
32
+ throttlingOptions,
33
+ transientOptions,
34
+ throttlingFactory,
35
+ transientFactory,
36
+ } from "@distilled.cloud/core/retry";
37
+
38
+ /** Context tag for configuring retry behavior of Auth0 API calls. */
39
+ export class Retry extends Context.Service<Retry, Policy>()("Auth0Retry") {}
40
+
41
+ /** Provides a custom retry policy to every Auth0 API call below it. */
42
+ export const policy = (optionsOrFactory: Policy) =>
43
+ Effect.provide(Layer.succeed(Retry, optionsOrFactory));
44
+
45
+ /** Disables all automatic retries. */
46
+ export const none = Effect.provide(
47
+ Layer.succeed(Retry, { while: () => false }),
48
+ );
49
+
50
+ /** Apply the throttling retry policy (retries throttling errors indefinitely). */
51
+ export const throttling = policy(throttlingFactory);
52
+
53
+ /** Apply the transient retry policy (retries all transient errors indefinitely). */
54
+ export const transient = policy(transientFactory);