@distilled.cloud/elasticsearch 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 +36 -0
  3. package/lib/credentials.d.ts.map +1 -0
  4. package/lib/credentials.js +42 -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 +23 -0
  11. package/lib/index.d.ts.map +1 -0
  12. package/lib/index.js +27 -0
  13. package/lib/index.js.map +1 -0
  14. package/lib/pagination.d.ts +8 -0
  15. package/lib/pagination.d.ts.map +1 -0
  16. package/lib/pagination.js +8 -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/elasticsearch.d.ts +49616 -0
  27. package/lib/services/elasticsearch.d.ts.map +1 -0
  28. package/lib/services/elasticsearch.js +42611 -0
  29. package/lib/services/elasticsearch.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 +65 -0
  40. package/src/errors.ts +50 -0
  41. package/src/index.ts +30 -0
  42. package/src/pagination.ts +7 -0
  43. package/src/protocol.ts +69 -0
  44. package/src/retry.ts +56 -0
  45. package/src/services/elasticsearch.ts +114323 -0
  46. package/src/services/index.ts +2 -0
  47. package/src/traits.ts +44 -0
@@ -0,0 +1,2 @@
1
+ export * as elasticsearch from "./elasticsearch.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,aAAa,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ // AUTO-GENERATED by scripts/generate.ts. Do not edit.
2
+ export * as elasticsearch from "./elasticsearch.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,aAAa,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Elasticsearch SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Elasticsearch has no envelope of its
6
+ * own; the 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
+ * Elasticsearch SDK trait surface — hand-written.
3
+ *
4
+ * Re-exports the generic protocol traits from core (so generated operations
5
+ * import everything from one place). Elasticsearch has no envelope of its
6
+ * own; the 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/elasticsearch",
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/elasticsearch"
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-elasticsearch",
83
+ "specs:update": "git submodule update --remote --force --depth=1 specs/spec-mirror-elasticsearch"
13
84
  }
14
- }
85
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Elasticsearch 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).
7
+ *
8
+ * Elasticsearch authenticates REST requests with an API key sent as
9
+ * `Authorization: ApiKey <key>` (the encoded form produced by the create
10
+ * API key API, or Elastic Cloud's `ELASTIC_API_KEY`).
11
+ */
12
+ import * as Context from "effect/Context";
13
+ import * as Effect from "effect/Effect";
14
+ import * as Layer from "effect/Layer";
15
+ import * as Redacted from "effect/Redacted";
16
+ import { ConfigError } from "@distilled.cloud/core/errors";
17
+
18
+ /** Default local Elasticsearch HTTP endpoint. */
19
+ export const DEFAULT_API_BASE_URL = "http://localhost:9200";
20
+
21
+ export interface Config {
22
+ readonly apiKey: Redacted.Redacted<string>;
23
+ readonly apiBaseUrl: string;
24
+ }
25
+
26
+ export class Credentials extends Context.Service<
27
+ Credentials,
28
+ Effect.Effect<Config>
29
+ >()("ElasticsearchCredentials") {}
30
+
31
+ /** Layer from a plain API key + optional base URL. */
32
+ export const fromApiKey = (config: {
33
+ readonly apiKey: string;
34
+ readonly apiBaseUrl?: string;
35
+ }): Layer.Layer<Credentials> =>
36
+ Layer.succeed(
37
+ Credentials,
38
+ Effect.succeed({
39
+ apiKey: Redacted.make(config.apiKey),
40
+ apiBaseUrl: config.apiBaseUrl ?? DEFAULT_API_BASE_URL,
41
+ }),
42
+ );
43
+
44
+ /**
45
+ * Reads ELASTICSEARCH_API_KEY (required) and ELASTICSEARCH_API_BASE_URL
46
+ * (optional).
47
+ */
48
+ export const CredentialsFromEnv: Layer.Layer<Credentials> = Layer.succeed(
49
+ Credentials,
50
+ Effect.gen(function* () {
51
+ const apiKey = process.env.ELASTICSEARCH_API_KEY;
52
+
53
+ if (!apiKey) {
54
+ return yield* new ConfigError({
55
+ message: "ELASTICSEARCH_API_KEY environment variable is required",
56
+ });
57
+ }
58
+
59
+ return {
60
+ apiKey: Redacted.make(apiKey),
61
+ apiBaseUrl:
62
+ process.env.ELASTICSEARCH_API_BASE_URL ?? DEFAULT_API_BASE_URL,
63
+ };
64
+ }).pipe(Effect.orDie),
65
+ );
package/src/errors.ts ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Elasticsearch-specific error types.
3
+ *
4
+ * Re-exports the common HTTP errors from core and adds the Elasticsearch
5
+ * fallback errors. Note the generated service module additionally defines
6
+ * its own per-status matcher classes (BadRequest/NotFound/…) for the
7
+ * statuses each operation declares — those share `_tag`s with the core
8
+ * classes here, so `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 Elasticsearch error — returned when nothing else matches the failure. */
34
+ export class UnknownElasticsearchError extends Schema.TaggedError<UnknownElasticsearchError>()(
35
+ "UnknownElasticsearchError",
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 ElasticsearchParseError extends Schema.TaggedError<ElasticsearchParseError>()(
45
+ "ElasticsearchParseError",
46
+ {
47
+ body: Schema.Unknown,
48
+ cause: Schema.Unknown,
49
+ },
50
+ ).pipe(Category.withParseError) {}
package/src/index.ts ADDED
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @distilled.cloud/elasticsearch — Elasticsearch 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 Elasticsearch from "@distilled.cloud/elasticsearch";
11
+ *
12
+ * const info = yield* Elasticsearch.Services.elasticsearch.info({});
13
+ * ```
14
+ */
15
+ export * from "./credentials.ts";
16
+ export * from "./errors.ts";
17
+ export * as T from "./traits.ts";
18
+ export {
19
+ ElasticsearchProtocol,
20
+ type ElasticsearchOpError,
21
+ type ElasticsearchOpContext,
22
+ } from "./protocol.ts";
23
+ export { paginateCursor } 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. Shared HTTP error classes come from ./errors.ts — the
28
+ // OpenAPI document does not declare per-status responses, so the generated
29
+ // module does not emit matching matcher classes.
30
+ export * from "./services/elasticsearch.ts";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Elasticsearch pagination — hand-written.
3
+ *
4
+ * Generated operations that declare cursor-mode pagination pass core's
5
+ * {@link paginateCursor} strategy to `API.makePaginated`.
6
+ */
7
+ export { paginateCursor } from "@distilled.cloud/core/pagination";
@@ -0,0 +1,69 @@
1
+ /**
2
+ * ElasticsearchProtocol — hand-written.
3
+ *
4
+ * Elasticsearch speaks API-key-authenticated JSON REST (no response
5
+ * envelope), so the whole protocol is one `makeRestProtocol` call from
6
+ * `core/protocol-rest`:
7
+ *
8
+ * request: credentials → `Authorization: ApiKey <apiKey>` + base URL
9
+ * (default http://localhost:9200), resolved from the calling
10
+ * fiber on every request
11
+ *
12
+ * response: 2xx JSON is the payload (sensitive members delivered as
13
+ * `Redacted`); non-2xx `{ error?: { type, reason }, status? }`
14
+ * bodies map to the operation's typed error classes by status,
15
+ * then the shared HTTP-status classes, then
16
+ * {@link UnknownElasticsearchError}.
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 { UnknownElasticsearchError } from "./errors.ts";
28
+
29
+ /**
30
+ * Error channel shared by every generated Elasticsearch operation. Generated
31
+ * service files annotate operations with `API.OperationMethod<I, O,
32
+ * ElasticsearchOpError, ElasticsearchOpContext>` explicitly so the compiler
33
+ * never infers these back out of the schema generics.
34
+ */
35
+ export type ElasticsearchOpError =
36
+ | InstanceType<(typeof API_ERRORS)[number]>
37
+ | UnknownElasticsearchError
38
+ | ConfigError
39
+ | HttpClientError.HttpClientError;
40
+
41
+ /** Context (requirements) shared by every generated Elasticsearch operation. */
42
+ export type ElasticsearchOpContext = Credentials | HttpClient.HttpClient;
43
+
44
+ export const ElasticsearchProtocol: 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: `ApiKey ${Redacted.value(creds.apiKey)}`,
55
+ }),
56
+ // Elasticsearch's error body is `{ error?: { type, reason }, status? }`
57
+ // — the factory's default lenient envelope covers `message`/`reason`.
58
+ unknownError: ({ code, message, body }) =>
59
+ new UnknownElasticsearchError({
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,56 @@
1
+ /**
2
+ * Elasticsearch 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 Elasticsearch API call below it pick it up:
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import * as Elasticsearch from "@distilled.cloud/elasticsearch";
11
+ *
12
+ * myEffect.pipe(Elasticsearch.Retry.transient);
13
+ * Effect.provide(myEffect, Layer.succeed(Elasticsearch.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 Elasticsearch API calls. */
39
+ export class Retry extends Context.Service<Retry, Policy>()(
40
+ "ElasticsearchRetry",
41
+ ) {}
42
+
43
+ /** Provides a custom retry policy to every Elasticsearch API call below it. */
44
+ export const policy = (optionsOrFactory: Policy) =>
45
+ Effect.provide(Layer.succeed(Retry, optionsOrFactory));
46
+
47
+ /** Disables all automatic retries. */
48
+ export const none = Effect.provide(
49
+ Layer.succeed(Retry, { while: () => false }),
50
+ );
51
+
52
+ /** Apply the throttling retry policy (retries throttling errors indefinitely). */
53
+ export const throttling = policy(throttlingFactory);
54
+
55
+ /** Apply the transient retry policy (retries all transient errors indefinitely). */
56
+ export const transient = policy(transientFactory);