@executor-js/sdk 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +21 -29
  2. package/dist/api-errors.d.ts +10 -0
  3. package/dist/api-errors.d.ts.map +1 -0
  4. package/dist/blob.d.ts.map +1 -1
  5. package/dist/chunk-6SQWMOM4.js +51 -0
  6. package/dist/chunk-6SQWMOM4.js.map +1 -0
  7. package/dist/chunk-NPWV4R3N.js +5563 -0
  8. package/dist/chunk-NPWV4R3N.js.map +1 -0
  9. package/dist/chunk-QQK7X3DM.js +103 -0
  10. package/dist/chunk-QQK7X3DM.js.map +1 -0
  11. package/dist/client.d.ts +2 -5
  12. package/dist/client.d.ts.map +1 -1
  13. package/dist/client.js +12 -18
  14. package/dist/client.js.map +1 -1
  15. package/dist/connections.d.ts +7 -0
  16. package/dist/connections.d.ts.map +1 -1
  17. package/dist/core-schema.d.ts +83 -3
  18. package/dist/core-schema.d.ts.map +1 -1
  19. package/dist/core.js +94 -52
  20. package/dist/core.js.map +1 -1
  21. package/dist/credential-bindings.d.ts +173 -0
  22. package/dist/credential-bindings.d.ts.map +1 -0
  23. package/dist/credential-bindings.test.d.ts +2 -0
  24. package/dist/credential-bindings.test.d.ts.map +1 -0
  25. package/dist/errors.d.ts +27 -5
  26. package/dist/errors.d.ts.map +1 -1
  27. package/dist/executor.d.ts +47 -13
  28. package/dist/executor.d.ts.map +1 -1
  29. package/dist/hosted-http-client.d.ts +17 -0
  30. package/dist/hosted-http-client.d.ts.map +1 -0
  31. package/dist/hosted-http-client.test.d.ts +2 -0
  32. package/dist/hosted-http-client.test.d.ts.map +1 -0
  33. package/dist/ids.d.ts +2 -0
  34. package/dist/ids.d.ts.map +1 -1
  35. package/dist/index.d.ts +15 -10
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +16 -18
  38. package/dist/index.js.map +1 -1
  39. package/dist/oauth-discovery.d.ts +19 -4
  40. package/dist/oauth-discovery.d.ts.map +1 -1
  41. package/dist/oauth-helpers.d.ts +21 -0
  42. package/dist/oauth-helpers.d.ts.map +1 -1
  43. package/dist/oauth-popup-types.d.ts.map +1 -1
  44. package/dist/oauth-service.d.ts +16 -5
  45. package/dist/oauth-service.d.ts.map +1 -1
  46. package/dist/oauth.d.ts +19 -16
  47. package/dist/oauth.d.ts.map +1 -1
  48. package/dist/oxlint-plugin-executor.test.d.ts +2 -0
  49. package/dist/oxlint-plugin-executor.test.d.ts.map +1 -0
  50. package/dist/plugin.d.ts +84 -19
  51. package/dist/plugin.d.ts.map +1 -1
  52. package/dist/policies.d.ts +10 -15
  53. package/dist/policies.d.ts.map +1 -1
  54. package/dist/promise-executor.d.ts.map +1 -1
  55. package/dist/promise.d.ts +5 -3
  56. package/dist/promise.d.ts.map +1 -1
  57. package/dist/schema-types.d.ts.map +1 -1
  58. package/dist/scoped-adapter.d.ts +17 -2
  59. package/dist/scoped-adapter.d.ts.map +1 -1
  60. package/dist/secrets.d.ts +12 -0
  61. package/dist/secrets.d.ts.map +1 -1
  62. package/dist/test-config.d.ts +10 -0
  63. package/dist/test-config.d.ts.map +1 -0
  64. package/dist/testing.d.ts +30 -8
  65. package/dist/testing.d.ts.map +1 -1
  66. package/dist/testing.js +56 -0
  67. package/dist/testing.js.map +1 -0
  68. package/dist/types.d.ts +11 -3
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/usage-visibility.test.d.ts +2 -0
  71. package/dist/usage-visibility.test.d.ts.map +1 -0
  72. package/dist/usages.d.ts +20 -0
  73. package/dist/usages.d.ts.map +1 -0
  74. package/package.json +26 -14
  75. package/dist/chunk-2WV7VSNL.js +0 -4440
  76. package/dist/chunk-2WV7VSNL.js.map +0 -1
package/README.md CHANGED
@@ -83,35 +83,27 @@ interface MemorySecretsConfig {
83
83
 
84
84
  // definePlugin takes a factory and returns a configured-plugin function
85
85
  // that the consumer calls with options.
86
- export const memorySecretsPlugin = definePlugin(
87
- (options?: MemorySecretsConfig) => {
88
- const map = new Map<string, string>(
89
- Object.entries(options?.initial ?? {}),
90
- );
91
- const provider: SecretProvider = {
92
- key: "memory",
93
- writable: true,
94
- get: (id: string) => Effect.sync(() => map.get(id) ?? null),
95
- has: (id: string) => Effect.sync(() => map.has(id)),
96
- set: (id: string, value: string) =>
97
- Effect.sync(() => void map.set(id, value)),
98
- delete: (id: string) => Effect.sync(() => map.delete(id)),
99
- list: () =>
100
- Effect.sync(() =>
101
- Array.from(map.keys()).map((k) => ({ id: k, name: k })),
102
- ),
103
- };
104
-
105
- return {
106
- id: "memorySecrets" as const,
107
- storage: () => ({}),
108
- extension: () => ({
109
- label: "in-memory secrets",
110
- }),
111
- secretProviders: () => [provider],
112
- };
113
- },
114
- );
86
+ export const memorySecretsPlugin = definePlugin((options?: MemorySecretsConfig) => {
87
+ const map = new Map<string, string>(Object.entries(options?.initial ?? {}));
88
+ const provider: SecretProvider = {
89
+ key: "memory",
90
+ writable: true,
91
+ get: (id: string) => Effect.sync(() => map.get(id) ?? null),
92
+ has: (id: string) => Effect.sync(() => map.has(id)),
93
+ set: (id: string, value: string) => Effect.sync(() => void map.set(id, value)),
94
+ delete: (id: string) => Effect.sync(() => map.delete(id)),
95
+ list: () => Effect.sync(() => Array.from(map.keys()).map((k) => ({ id: k, name: k }))),
96
+ };
97
+
98
+ return {
99
+ id: "memorySecrets" as const,
100
+ storage: () => ({}),
101
+ extension: () => ({
102
+ label: "in-memory secrets",
103
+ }),
104
+ secretProviders: () => [provider],
105
+ };
106
+ });
115
107
 
116
108
  // End users compose the executor exactly the same way as above —
117
109
  // the plugin's extension is reachable as `executor.memorySecrets`.
@@ -0,0 +1,10 @@
1
+ import { Schema } from "effect";
2
+ declare const InternalError_base: Schema.Class<InternalError, Schema.TaggedStruct<"InternalError", {
3
+ /** Opaque correlation id for backend lookup (Sentry event id, log line, etc.). */
4
+ readonly traceId: Schema.String;
5
+ }>, import("effect/Cause").YieldableError>;
6
+ /** Public 500 surface. Opaque by schema — only `traceId` crosses the wire. */
7
+ export declare class InternalError extends InternalError_base {
8
+ }
9
+ export {};
10
+ //# sourceMappingURL=api-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-errors.d.ts","sourceRoot":"","sources":["../src/api-errors.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;IAM5B,kFAAkF;;;AAJtF,8EAA8E;AAC9E,qBAAa,aAAc,SAAQ,kBAOlC;CAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD;;;;4BAIwB;IACxB,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9D,QAAQ,CAAC,GAAG,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B;oCACgC;IAChC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC;IAC1E;+CAC2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,CACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;CACrE;AAmBD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,EAChB,QAAQ,SAAS,MAAM,EAAE,EACzB,UAAU,MAAM,KACf,eA2BD,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,QAAO,SAwBxC,CAAC"}
1
+ {"version":3,"file":"blob.d.ts","sourceRoot":"","sources":["../src/blob.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7F;;;;4BAIwB;IACxB,QAAQ,CAAC,OAAO,EAAE,CAChB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,GAAG,EAAE,MAAM,KACR,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9D,QAAQ,CAAC,GAAG,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvF,QAAQ,CAAC,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,eAAe;IAC9B;oCACgC;IAChC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,YAAY,CAAC,CAAC;IAC1E;+CAC2C;IAC3C,QAAQ,CAAC,GAAG,EAAE,CACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,uCAAuC;IACvC,QAAQ,CAAC,MAAM,EAAE,CACf,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAChC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACvC,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;CACrE;AAgBD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,SAAS,EAChB,QAAQ,SAAS,MAAM,EAAE,EACzB,UAAU,MAAM,KACf,eA2BD,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,QAAO,SAwBxC,CAAC"}
@@ -0,0 +1,51 @@
1
+ // src/secret-backed-value.ts
2
+ import { Effect, Schema } from "effect";
3
+ var SecretBackedValue = Schema.Union([
4
+ Schema.String,
5
+ Schema.Struct({
6
+ secretId: Schema.String,
7
+ prefix: Schema.optional(Schema.String)
8
+ })
9
+ ]);
10
+ var SecretBackedMap = Schema.Record(Schema.String, SecretBackedValue);
11
+ var isSecretBackedRef = (value) => typeof value !== "string";
12
+ var resolveSecretBackedMap = ({
13
+ values,
14
+ getSecret,
15
+ onMissing,
16
+ onError,
17
+ missing = "fail"
18
+ }) => {
19
+ const entries = Object.entries(values ?? {});
20
+ if (entries.length === 0) return Effect.succeed(void 0);
21
+ return Effect.gen(function* () {
22
+ const resolved = {};
23
+ for (const [name, value] of entries) {
24
+ if (typeof value === "string") {
25
+ resolved[name] = value;
26
+ continue;
27
+ }
28
+ const secret = yield* getSecret(value.secretId).pipe(
29
+ Effect.mapError((error) => onError?.(error, name, value) ?? error)
30
+ );
31
+ if (secret === null) {
32
+ if (missing === "drop") continue;
33
+ return yield* Effect.fail(onMissing(name, value));
34
+ }
35
+ resolved[name] = value.prefix ? `${value.prefix}${secret}` : secret;
36
+ }
37
+ return Object.keys(resolved).length > 0 ? resolved : void 0;
38
+ });
39
+ };
40
+
41
+ // src/config.ts
42
+ var defineExecutorConfig = (config) => config;
43
+
44
+ export {
45
+ SecretBackedValue,
46
+ SecretBackedMap,
47
+ isSecretBackedRef,
48
+ resolveSecretBackedMap,
49
+ defineExecutorConfig
50
+ };
51
+ //# sourceMappingURL=chunk-6SQWMOM4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/secret-backed-value.ts","../src/config.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\n\nexport const SecretBackedValue = Schema.Union([\n Schema.String,\n Schema.Struct({\n secretId: Schema.String,\n prefix: Schema.optional(Schema.String),\n }),\n]);\nexport type SecretBackedValue = typeof SecretBackedValue.Type;\n\nexport const SecretBackedMap = Schema.Record(Schema.String, SecretBackedValue);\nexport type SecretBackedMap = typeof SecretBackedMap.Type;\n\nexport const isSecretBackedRef = (\n value: SecretBackedValue,\n): value is Extract<SecretBackedValue, { readonly secretId: string }> => typeof value !== \"string\";\n\nexport type ResolveSecretBackedMapOptions<E, E2> = {\n readonly values: Record<string, SecretBackedValue> | undefined;\n readonly getSecret: (secretId: string) => Effect.Effect<string | null, E>;\n readonly onMissing: (\n name: string,\n value: Extract<SecretBackedValue, { readonly secretId: string }>,\n ) => E2;\n readonly onError?: (\n error: E,\n name: string,\n value: Extract<SecretBackedValue, { readonly secretId: string }>,\n ) => E | E2;\n readonly missing?: \"fail\" | \"drop\";\n};\n\nexport const resolveSecretBackedMap = <E, E2 = E>({\n values,\n getSecret,\n onMissing,\n onError,\n missing = \"fail\",\n}: ResolveSecretBackedMapOptions<E, E2>): Effect.Effect<\n Record<string, string> | undefined,\n E | E2\n> => {\n const entries = Object.entries(values ?? {});\n if (entries.length === 0) return Effect.succeed(undefined);\n\n return Effect.gen(function* () {\n const resolved: Record<string, string> = {};\n\n for (const [name, value] of entries) {\n if (typeof value === \"string\") {\n resolved[name] = value;\n continue;\n }\n\n const secret = yield* getSecret(value.secretId).pipe(\n Effect.mapError((error) => onError?.(error, name, value) ?? error),\n );\n if (secret === null) {\n if (missing === \"drop\") continue;\n return yield* Effect.fail(onMissing(name, value));\n }\n\n resolved[name] = value.prefix ? `${value.prefix}${secret}` : secret;\n }\n\n return Object.keys(resolved).length > 0 ? resolved : undefined;\n });\n};\n","// ---------------------------------------------------------------------------\n// defineExecutorConfig — typed config declaration consumed by both the\n// schema-gen CLI and the host runtime. Single source of truth for the\n// plugin list. First-party and third-party plugins go through the same\n// `bun add @executor-js/plugin-foo` + import-and-call flow.\n//\n// `plugins` is always a factory `(deps?) => readonly AnyPlugin[]`. Some\n// plugins want runtime values from the host (e.g., the openapi plugin's\n// `configFile` sink, which is keyed to the active scope cwd and so can't\n// be constructed at module-eval time). Deps are optional — the\n// schema-gen CLI and Vite plugin call `plugins()` with no args (they\n// read `plugin.schema` / `plugin.packageName` only); runtime callers\n// pass concrete deps.\n//\n// Each app declares its own deps shape inline on the factory parameter\n// — TS infers `TDeps` from there, so apps don't reach into the SDK's\n// types via `declare module`.\n// ---------------------------------------------------------------------------\n\nimport type { AnyPlugin } from \"./plugin\";\n\nexport type ExecutorDialect = \"pg\" | \"sqlite\" | \"mysql\";\n\nexport type ExecutorPluginsFactory<\n TDeps extends object = object,\n TPlugins extends readonly AnyPlugin[] = readonly AnyPlugin[],\n> = (deps?: TDeps) => TPlugins;\n\nexport interface ExecutorCliConfig<\n TDeps extends object = object,\n TPlugins extends readonly AnyPlugin[] = readonly AnyPlugin[],\n> {\n readonly dialect: ExecutorDialect;\n readonly plugins: ExecutorPluginsFactory<TDeps, TPlugins>;\n}\n\n/**\n * Declare an executor config. The CLI imports this file via jiti and\n * reads `plugins` + `dialect` to generate the drizzle schema; the host\n * runtime imports the same file to instantiate plugins. Plugin runtime\n * credentials passed to the factory may be stubs from the CLI — only\n * `plugin.schema` is read there.\n *\n * The `const TPlugins` modifier preserves the tuple-literal inference\n * from the factory's return so per-plugin extension typing flows through\n * (`ReturnType<typeof config.plugins>` keeps `[OpenApi, Mcp, ...]`).\n *\n * `TDeps` is inferred from the factory's parameter — apps annotate\n * the destructure (e.g., `({ configFile }: { configFile?: ConfigFileSink })`)\n * directly. No global module augmentation needed.\n */\nexport const defineExecutorConfig = <\n TDeps extends object,\n const TPlugins extends readonly AnyPlugin[],\n>(\n config: ExecutorCliConfig<TDeps, TPlugins>,\n): ExecutorCliConfig<TDeps, TPlugins> => config;\n"],"mappings":";AAAA,SAAS,QAAQ,cAAc;AAExB,IAAM,oBAAoB,OAAO,MAAM;AAAA,EAC5C,OAAO;AAAA,EACP,OAAO,OAAO;AAAA,IACZ,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO,SAAS,OAAO,MAAM;AAAA,EACvC,CAAC;AACH,CAAC;AAGM,IAAM,kBAAkB,OAAO,OAAO,OAAO,QAAQ,iBAAiB;AAGtE,IAAM,oBAAoB,CAC/B,UACuE,OAAO,UAAU;AAiBnF,IAAM,yBAAyB,CAAY;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACZ,MAGK;AACH,QAAM,UAAU,OAAO,QAAQ,UAAU,CAAC,CAAC;AAC3C,MAAI,QAAQ,WAAW,EAAG,QAAO,OAAO,QAAQ,MAAS;AAEzD,SAAO,OAAO,IAAI,aAAa;AAC7B,UAAM,WAAmC,CAAC;AAE1C,eAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,UAAI,OAAO,UAAU,UAAU;AAC7B,iBAAS,IAAI,IAAI;AACjB;AAAA,MACF;AAEA,YAAM,SAAS,OAAO,UAAU,MAAM,QAAQ,EAAE;AAAA,QAC9C,OAAO,SAAS,CAAC,UAAU,UAAU,OAAO,MAAM,KAAK,KAAK,KAAK;AAAA,MACnE;AACA,UAAI,WAAW,MAAM;AACnB,YAAI,YAAY,OAAQ;AACxB,eAAO,OAAO,OAAO,KAAK,UAAU,MAAM,KAAK,CAAC;AAAA,MAClD;AAEA,eAAS,IAAI,IAAI,MAAM,SAAS,GAAG,MAAM,MAAM,GAAG,MAAM,KAAK;AAAA,IAC/D;AAEA,WAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AAAA,EACvD,CAAC;AACH;;;ACjBO,IAAM,uBAAuB,CAIlC,WACuC;","names":[]}