@oleanderhq/sdk 0.1.1 → 0.2.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 +1 -1
- package/dist/index.cjs +73 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +78 -18
- package/dist/index.d.ts +78 -18
- package/dist/index.js +73 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ Run a SQL query against the oleander lake. The second parameter is optional; `sa
|
|
|
32
32
|
|
|
33
33
|
```ts
|
|
34
34
|
const result = await oleander.query(
|
|
35
|
-
"SELECT * FROM
|
|
35
|
+
"SELECT * FROM oleander.default.flowers LIMIT 10",
|
|
36
36
|
);
|
|
37
37
|
console.log(result.results?.columns, result.results?.rows);
|
|
38
38
|
console.log(result.row_count, result.execution_time);
|
package/dist/index.cjs
CHANGED
|
@@ -76,6 +76,11 @@ var listSparkJobsResultSchema = import_zod.z.object({
|
|
|
76
76
|
scripts: import_zod.z.array(import_zod.z.string()),
|
|
77
77
|
hasMore: import_zod.z.boolean()
|
|
78
78
|
});
|
|
79
|
+
var sparkClusterTypeSchema = import_zod.z.enum([
|
|
80
|
+
"oleander",
|
|
81
|
+
"emr-serverless",
|
|
82
|
+
"glue"
|
|
83
|
+
]);
|
|
79
84
|
var sparkMachineTypeSchema = import_zod.z.enum([
|
|
80
85
|
"spark.1.c",
|
|
81
86
|
"spark.2.c",
|
|
@@ -93,16 +98,33 @@ var sparkMachineTypeSchema = import_zod.z.enum([
|
|
|
93
98
|
"spark.8.m",
|
|
94
99
|
"spark.16.m"
|
|
95
100
|
]);
|
|
101
|
+
var glueWorkerTypeSchema = import_zod.z.enum([
|
|
102
|
+
"G.1X",
|
|
103
|
+
"G.2X",
|
|
104
|
+
"G.4X",
|
|
105
|
+
"G.8X",
|
|
106
|
+
"G.025X"
|
|
107
|
+
]);
|
|
96
108
|
var submitOptionsSchema = import_zod.z.object({
|
|
109
|
+
cluster: sparkClusterTypeSchema.default("oleander"),
|
|
97
110
|
namespace: import_zod.z.string().min(1, "namespace is required"),
|
|
98
111
|
name: import_zod.z.string().min(1, "name is required"),
|
|
99
|
-
scriptName: import_zod.z.string().min(1, "scriptName is required"),
|
|
100
112
|
args: import_zod.z.array(import_zod.z.string()).default([]),
|
|
113
|
+
entrypoint: import_zod.z.string().min(1, "entrypoint is required"),
|
|
114
|
+
pyFiles: import_zod.z.string().optional(),
|
|
115
|
+
mainClass: import_zod.z.string().optional(),
|
|
116
|
+
sparkConf: import_zod.z.array(import_zod.z.string()).default([]),
|
|
117
|
+
executionIamPolicy: import_zod.z.string().optional(),
|
|
118
|
+
jobTags: import_zod.z.array(import_zod.z.string()).default([]),
|
|
119
|
+
runTags: import_zod.z.array(import_zod.z.string()).default([]),
|
|
101
120
|
driverMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
102
121
|
executorMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
103
122
|
executorNumbers: import_zod.z.number().int().min(1).max(20).default(2),
|
|
104
|
-
|
|
105
|
-
|
|
123
|
+
workerType: glueWorkerTypeSchema.optional(),
|
|
124
|
+
numberOfWorkers: import_zod.z.number().int().min(1).default(1),
|
|
125
|
+
enableAutoScaling: import_zod.z.boolean().optional(),
|
|
126
|
+
timeoutMinutes: import_zod.z.number().int().optional(),
|
|
127
|
+
executionClass: import_zod.z.string().optional()
|
|
106
128
|
});
|
|
107
129
|
var submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({
|
|
108
130
|
pollIntervalMs: import_zod.z.number().int().positive().default(1e4),
|
|
@@ -235,19 +257,60 @@ var Oleander = class {
|
|
|
235
257
|
*/
|
|
236
258
|
async submitSparkJob(options) {
|
|
237
259
|
const opts = submitOptionsSchema.parse(options);
|
|
238
|
-
const
|
|
260
|
+
const buildGlueArguments = (args) => {
|
|
261
|
+
const result = {};
|
|
262
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
263
|
+
const key = args[i];
|
|
264
|
+
const value = args[i + 1];
|
|
265
|
+
if (value === void 0) {
|
|
266
|
+
throw new Error(`Missing value for argument: ${key}`);
|
|
267
|
+
}
|
|
268
|
+
result[key] = value;
|
|
269
|
+
}
|
|
270
|
+
return result;
|
|
271
|
+
};
|
|
272
|
+
let properties;
|
|
273
|
+
if (opts.cluster === "oleander") {
|
|
274
|
+
properties = {
|
|
275
|
+
entrypoint: opts.entrypoint,
|
|
276
|
+
entrypointArguments: opts.args,
|
|
277
|
+
driverMachineType: opts.driverMachineType,
|
|
278
|
+
executorMachineType: opts.executorMachineType,
|
|
279
|
+
executorNumbers: opts.executorNumbers,
|
|
280
|
+
sparkConf: opts.sparkConf
|
|
281
|
+
};
|
|
282
|
+
} else if (opts.cluster === "emr-serverless") {
|
|
283
|
+
properties = {
|
|
284
|
+
entrypoint: opts.entrypoint,
|
|
285
|
+
entrypointArguments: opts.args,
|
|
286
|
+
pyFiles: opts.pyFiles,
|
|
287
|
+
mainClass: opts.mainClass,
|
|
288
|
+
sparkConf: opts.sparkConf,
|
|
289
|
+
executionIamPolicy: opts.executionIamPolicy
|
|
290
|
+
};
|
|
291
|
+
} else if (opts.cluster === "glue") {
|
|
292
|
+
properties = {
|
|
293
|
+
jobName: opts.entrypoint,
|
|
294
|
+
entrypointArguments: buildGlueArguments(opts.args),
|
|
295
|
+
sparkConf: opts.sparkConf,
|
|
296
|
+
workerType: opts.workerType,
|
|
297
|
+
numberOfWorkers: opts.numberOfWorkers,
|
|
298
|
+
enableAutoScaling: opts.enableAutoScaling,
|
|
299
|
+
timeoutMinutes: opts.timeoutMinutes,
|
|
300
|
+
executionClass: opts.executionClass,
|
|
301
|
+
executionRoleSessionPolicy: opts.executionIamPolicy
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {
|
|
239
305
|
method: "POST",
|
|
240
306
|
headers: getHeaders(this.apiKey),
|
|
241
307
|
body: JSON.stringify({
|
|
308
|
+
cluster: opts.cluster,
|
|
242
309
|
namespace: opts.namespace.trim(),
|
|
243
310
|
name: opts.name.trim(),
|
|
244
|
-
scriptName: opts.scriptName.trim(),
|
|
245
|
-
arguments: opts.args,
|
|
246
|
-
driverMachineType: opts.driverMachineType,
|
|
247
|
-
executorMachineType: opts.executorMachineType,
|
|
248
|
-
executorNumbers: opts.executorNumbers,
|
|
249
311
|
jobTags: opts.jobTags,
|
|
250
|
-
runTags: opts.runTags
|
|
312
|
+
runTags: opts.runTags,
|
|
313
|
+
properties
|
|
251
314
|
})
|
|
252
315
|
});
|
|
253
316
|
const raw = await res.json().catch(() => ({}));
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/client.ts"],"sourcesContent":["export { Oleander } from \"./client.js\";\nexport type { OleanderOptions } from \"./schemas.js\";\nexport type {\n QueryOptions,\n LakeQueryResult,\n ApiErrorBody,\n SparkJobListPage,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkMachineType,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\nexport {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n listSparkJobsResultSchema,\n sparkMachineTypeSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\n","import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n scriptName: z.string().min(1, \"scriptName is required\"),\n args: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n scriptName: opts.scriptName.trim(),\n arguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schemas.ts","../src/client.ts"],"sourcesContent":["export { Oleander } from \"./client.js\";\nexport type { OleanderOptions } from \"./schemas.js\";\nexport type {\n QueryOptions,\n LakeQueryResult,\n ApiErrorBody,\n SparkJobListPage,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkMachineType,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\nexport {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n listSparkJobsResultSchema,\n sparkMachineTypeSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\n","import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark cluster type enum */\nexport const sparkClusterTypeSchema = z.enum([\n \"oleander\",\n \"emr-serverless\",\n \"glue\",\n]);\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\n/** Glue worker type enum */\nexport const glueWorkerTypeSchema = z.enum([\n \"G.1X\",\n \"G.2X\",\n \"G.4X\",\n \"G.8X\",\n \"G.025X\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n cluster: sparkClusterTypeSchema.default(\"oleander\"),\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n args: z.array(z.string()).default([]),\n entrypoint: z.string().min(1, \"entrypoint is required\"),\n pyFiles: z.string().optional(),\n mainClass: z.string().optional(),\n sparkConf: z.array(z.string()).default([]),\n executionIamPolicy: z.string().optional(),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n workerType: glueWorkerTypeSchema.optional(),\n numberOfWorkers: z.number().int().min(1).default(1),\n enableAutoScaling: z.boolean().optional(),\n timeoutMinutes: z.number().int().optional(),\n executionClass: z.string().optional(),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const buildGlueArguments = (args: string[]): Record<string, string> => {\n const result: Record<string, string> = {};\n for (let i = 0; i < args.length; i += 2) {\n const key = args[i];\n const value = args[i + 1];\n if (value === undefined) {\n throw new Error(`Missing value for argument: ${key}`);\n }\n result[key] = value;\n }\n return result;\n };\n\n let properties: any;\n if (opts.cluster === \"oleander\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n sparkConf: opts.sparkConf,\n };\n } else if (opts.cluster === \"emr-serverless\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n pyFiles: opts.pyFiles,\n mainClass: opts.mainClass,\n sparkConf: opts.sparkConf,\n executionIamPolicy: opts.executionIamPolicy,\n };\n } else if (opts.cluster === \"glue\") {\n properties = {\n jobName: opts.entrypoint,\n entrypointArguments: buildGlueArguments(opts.args),\n sparkConf: opts.sparkConf,\n workerType: opts.workerType,\n numberOfWorkers: opts.numberOfWorkers,\n enableAutoScaling: opts.enableAutoScaling,\n timeoutMinutes: opts.timeoutMinutes,\n executionClass: opts.executionClass,\n executionRoleSessionPolicy: opts.executionIamPolicy,\n };\n }\n\n const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n cluster: opts.cluster,\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n properties: properties,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,iBAAkB;AAGX,IAAM,qBAAqB,aAAE,OAAO;AAAA,EACzC,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,aAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAID,IAAM,mBAAmB;AAGlB,IAAM,gBAAgB,aAAE,OAAO;AAAA,EACpC,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,aACN,OAAO,EACP,QAAQ,gBAAgB,EACxB,UAAU,CAAC,MAAO,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,gBAAiB;AAC9D,CAAC;AAKM,IAAM,qBAAqB,aAAE,OAAO;AAAA,EACzC,MAAM,aAAE,QAAQ,EAAE,QAAQ,KAAK;AACjC,CAAC;AAKM,IAAM,wBAAwB,aAAE,OAAO;AAAA,EAC5C,SAAS,aAAE,QAAQ;AAAA,EACnB,SAAS,aACN,OAAO;AAAA,IACN,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,IAC3B,cAAc,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,IAChC,MAAM,aAAE,MAAM,aAAE,MAAM,aAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,CAAC,EACA,SAAS;AAAA,EACZ,WAAW,aAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,gBAAgB,aAAE,OAAO,EAAE,SAAS;AAAA,EACpC,kBAAkB,aAAE,OAAO,EAAE,SAAS;AAAA,EACtC,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAO,aAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAKM,IAAM,yBAAyB,aAAE,OAAO;AAAA,EAC7C,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EAC3B,mBAAmB,aAAE,OAAO,EAAE,SAAS;AACzC,CAAC;AAKM,IAAM,6BAA6B,aAAE,OAAO;AAAA,EACjD,OAAO,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE;AAAA,EAC7C,QAAQ,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;AAClD,CAAC;AAKM,IAAM,4BAA4B,aAAE,OAAO;AAAA,EAChD,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC;AAAA,EAC3B,SAAS,aAAE,QAAQ;AACrB,CAAC;AAKM,IAAM,yBAAyB,aAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,yBAAyB,aAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,uBAAuB,aAAE,KAAK;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,sBAAsB,aAAE,OAAO;AAAA,EAC1C,SAAS,uBAAuB,QAAQ,UAAU;AAAA,EAClD,WAAW,aAAE,OAAO,EAAE,IAAI,GAAG,uBAAuB;AAAA,EACpD,MAAM,aAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,MAAM,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,YAAY,aAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAAA,EACtD,SAAS,aAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,aAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,WAAW,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACzC,oBAAoB,aAAE,OAAO,EAAE,SAAS;AAAA,EACxC,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvC,SAAS,aAAE,MAAM,aAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACvC,mBAAmB,uBAAuB,QAAQ,WAAW;AAAA,EAC7D,qBAAqB,uBAAuB,QAAQ,WAAW;AAAA,EAC/D,iBAAiB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,CAAC;AAAA,EAC1D,YAAY,qBAAqB,SAAS;AAAA,EAC1C,iBAAiB,aAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAClD,mBAAmB,aAAE,QAAQ,EAAE,SAAS;AAAA,EACxC,gBAAgB,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC1C,gBAAgB,aAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAKM,IAAM,qCAAqC,oBAAoB,OAAO;AAAA,EAC3E,gBAAgB,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAK;AAAA,EACzD,WAAW,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAM;AACvD,CAAC;AAOM,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACxC,OAAO,aAAE,OAAO;AAClB,CAAC;AAKM,IAAM,oBAAoB,aAAE,OAAO;AAAA,EACxC,IAAI,aAAE,OAAO;AAAA,EACb,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,YAAY,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,WAAW,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C,cAAc,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,UAAU,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACzC,UAAU,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACzC,OAAO,aAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;AAAA,EACvC,MAAM,aAAE;AAAA,IACN,aAAE,OAAO;AAAA,MACP,KAAK,aAAE,OAAO;AAAA,MACd,OAAO,aAAE,OAAO;AAAA,MAChB,QAAQ,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EACA,KAAK,aAAE,OAAO;AAAA,IACZ,IAAI,aAAE,OAAO;AAAA,IACb,MAAM,aAAE,OAAO;AAAA,IACf,WAAW,aAAE,OAAO;AAAA,EACtB,CAAC;AAAA,EACD,UAAU,aAAE,OAAO;AAAA,IACjB,IAAI,aAAE,OAAO;AAAA,IACb,MAAM,aAAE,OAAO;AAAA,IACf,WAAW,aAAE,OAAO;AAAA,EACtB,CAAC;AACH,CAAC;;;AC3JD,SAAS,WAAW,QAAwC;AAC1D,SAAO;AAAA,IACL,eAAe,UAAU,MAAM;AAAA,IAC/B,gBAAgB;AAAA,EAClB;AACF;AAEA,SAAS,eAAe,MAAe,QAAwB;AAC7D,QAAM,SAAS,mBAAmB,UAAU,IAAI;AAChD,MAAI,OAAO,SAAS;AAClB,UAAM,EAAE,OAAO,QAAQ,IAAI,OAAO;AAClC,WAAO,SAAS,WAAW,QAAQ,MAAM;AAAA,EAC3C;AACA,SAAO,QAAQ,MAAM;AACvB;AAKO,IAAM,WAAN,MAAe;AAAA,EAIpB,YAAY,UAA2B,CAAC,GAAG;AACzC,UAAM,SAAS,cAAc,UAAU,OAAO;AAC9C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,QACJ,OAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,KAAK,OAAO,MAAM;AACvD,YAAM,IAAI,MAAM,KAAK;AAAA,IACvB;AACA,UAAM,cAAc,OAAO,KAAK,QAAQ,KAAK;AAC7C,UAAM,UACJ,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,UAAM,SAAS,eAAe,WAAW;AACzC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,SAAK,SAAS;AACd,SAAK,UAAU,OAAO,KAAK,QAAQ,KAAK,EAAE,QAAQ,OAAO,EAAE;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MACJ,KACA,UAAwB,CAAC,GACC;AAC1B,UAAM,QAAQ,OAAO,QAAQ,WAAW,IAAI,KAAK,IAAI;AACrD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AACA,UAAM,OAAO,mBAAmB,MAAM,OAAO;AAE7C,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,2BAA2B;AAAA,MAChE,QAAQ;AAAA,MACR,SAAS,WAAW,KAAK,MAAM;AAAA,MAC/B,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,eAAe,KAAK,IAAI,MAAM,CAAC;AAAA,IACjD;AAEA,UAAM,SAAS,sBAAsB,MAAM,GAAG;AAC9C,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO;AACnC,YAAM,IAAI,MAAM,OAAO,WAAW,OAAO,KAAK;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,UAAgC,CAAC,GACH;AAC9B,UAAM,OAAO,2BAA2B,MAAM,OAAO;AACrD,UAAM,EAAE,OAAO,OAAO,IAAI;AAE1B,UAAM,aAAuB,CAAC;AAC9B,QAAI;AAEJ,WAAO,MAAM;AACX,YAAM,SAAS,oBACX,IAAI,IAAI,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,SAAS,CAAC,KACzD;AACJ,YAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,wBAAwB,MAAM,IAAI;AAAA,QACvE,QAAQ;AAAA,QACR,SAAS,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,MACpD,CAAC;AACD,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,eAAe,KAAK,IAAI,MAAM,CAAC;AAAA,MACjD;AACA,YAAM,OAAO,uBAAuB,MAAM,GAAG;AAC7C,iBAAW,KAAK,GAAG,KAAK,OAAO;AAC/B,0BAAoB,KAAK;AACzB,UAAI,CAAC,qBAAqB,WAAW,UAAU,SAAS,OAAO;AAC7D;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,WAAW,MAAM,QAAQ,SAAS,KAAK;AACvD,UAAM,UAAU,CAAC,CAAC,qBAAqB,WAAW,SAAS,SAAS;AACpE,WAAO,EAAE,SAAS,QAAQ;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,SAAsD;AACzE,UAAM,OAAO,oBAAoB,MAAM,OAAO;AAE9C,UAAM,qBAAqB,CAAC,SAA2C;AACrE,YAAM,SAAiC,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,cAAM,MAAM,KAAK,CAAC;AAClB,cAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,YAAI,UAAU,QAAW;AACvB,gBAAM,IAAI,MAAM,+BAA+B,GAAG,EAAE;AAAA,QACtD;AACA,eAAO,GAAG,IAAI;AAAA,MAChB;AACA,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI,KAAK,YAAY,YAAY;AAC/B,mBAAa;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,qBAAqB,KAAK;AAAA,QAC1B,mBAAmB,KAAK;AAAA,QACxB,qBAAqB,KAAK;AAAA,QAC1B,iBAAiB,KAAK;AAAA,QACtB,WAAW,KAAK;AAAA,MAClB;AAAA,IACF,WAAW,KAAK,YAAY,kBAAkB;AAC5C,mBAAa;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,qBAAqB,KAAK;AAAA,QAC1B,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,oBAAoB,KAAK;AAAA,MAC3B;AAAA,IACF,WAAW,KAAK,YAAY,QAAQ;AAClC,mBAAa;AAAA,QACX,SAAS,KAAK;AAAA,QACd,qBAAqB,mBAAmB,KAAK,IAAI;AAAA,QACjD,WAAW,KAAK;AAAA,QAChB,YAAY,KAAK;AAAA,QACjB,iBAAiB,KAAK;AAAA,QACtB,mBAAmB,KAAK;AAAA,QACxB,gBAAgB,KAAK;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,4BAA4B,KAAK;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,sBAAsB;AAAA,MAC3D,QAAQ;AAAA,MACR,SAAS,WAAW,KAAK,MAAM;AAAA,MAC/B,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,MAAM,KAAK,KAAK,KAAK;AAAA,QACrB,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,eAAe,KAAK,IAAI,MAAM,CAAC;AAAA,IACjD;AACA,WAAO,kBAAkB,MAAM,GAAG;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAqC;AAChD,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AACxD,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AACA,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,gBAAgB,KAAK,IAAI;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS,EAAE,eAAe,UAAU,KAAK,MAAM,GAAG;AAAA,IACpD,CAAC;AAED,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI,MAAM,eAAe,KAAK,IAAI,MAAM,CAAC;AAAA,IACjD;AACA,WAAO,kBAAkB,MAAM,GAAG;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBACJ,SAC+D;AAC/D,UAAM,OAAO,mCAAmC,MAAM,OAAO;AAC7D,UAAM,EAAE,gBAAgB,WAAW,GAAG,WAAW,IAAI;AACrD,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,eAAe,UAAU;AACtD,UAAM,UAAU,KAAK,IAAI;AAEzB,WAAO,KAAK,IAAI,IAAI,UAAU,WAAW;AACvC,YAAMA,OAAM,MAAM,KAAK,OAAO,KAAK;AACnC,YAAM,QAAQA,KAAI,SAAS;AAC3B,UAAI,UAAU,cAAc,UAAU,UAAU,UAAU,SAAS;AACjE,eAAO,EAAE,OAAO,OAAO,KAAAA,KAAI;AAAA,MAC7B;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAAA,IACxD;AACA,UAAM,MAAM,MAAM,KAAK,OAAO,KAAK;AACnC,UAAM,IAAI;AAAA,MACR,2BAA2B,KAAK,YAAY,IAAI,SAAS,SAAS;AAAA,IACpE;AAAA,EACF;AACF;","names":["run"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -124,73 +124,133 @@ declare const sparkMachineTypeSchema: z.ZodEnum<["spark.1.c", "spark.2.c", "spar
|
|
|
124
124
|
type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;
|
|
125
125
|
/** Spark job submit options. Optional fields have defaults. */
|
|
126
126
|
declare const submitOptionsSchema: z.ZodObject<{
|
|
127
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
127
128
|
namespace: z.ZodString;
|
|
128
129
|
name: z.ZodString;
|
|
129
|
-
scriptName: z.ZodString;
|
|
130
130
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
|
+
entrypoint: z.ZodString;
|
|
132
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
133
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
134
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
135
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
136
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
137
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
138
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
132
139
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
133
140
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
134
|
-
|
|
135
|
-
|
|
141
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
142
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
143
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
144
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
145
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
136
146
|
}, "strip", z.ZodTypeAny, {
|
|
147
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
137
148
|
namespace: string;
|
|
138
149
|
name: string;
|
|
139
|
-
scriptName: string;
|
|
140
150
|
args: string[];
|
|
151
|
+
entrypoint: string;
|
|
152
|
+
sparkConf: string[];
|
|
153
|
+
jobTags: string[];
|
|
154
|
+
runTags: string[];
|
|
141
155
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
142
156
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
143
157
|
executorNumbers: number;
|
|
144
|
-
|
|
145
|
-
|
|
158
|
+
numberOfWorkers: number;
|
|
159
|
+
pyFiles?: string | undefined;
|
|
160
|
+
mainClass?: string | undefined;
|
|
161
|
+
executionIamPolicy?: string | undefined;
|
|
162
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
163
|
+
enableAutoScaling?: boolean | undefined;
|
|
164
|
+
timeoutMinutes?: number | undefined;
|
|
165
|
+
executionClass?: string | undefined;
|
|
146
166
|
}, {
|
|
147
167
|
namespace: string;
|
|
148
168
|
name: string;
|
|
149
|
-
|
|
169
|
+
entrypoint: string;
|
|
170
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
150
171
|
args?: string[] | undefined;
|
|
172
|
+
pyFiles?: string | undefined;
|
|
173
|
+
mainClass?: string | undefined;
|
|
174
|
+
sparkConf?: string[] | undefined;
|
|
175
|
+
executionIamPolicy?: string | undefined;
|
|
176
|
+
jobTags?: string[] | undefined;
|
|
177
|
+
runTags?: string[] | undefined;
|
|
151
178
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
152
179
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
153
180
|
executorNumbers?: number | undefined;
|
|
154
|
-
|
|
155
|
-
|
|
181
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
182
|
+
numberOfWorkers?: number | undefined;
|
|
183
|
+
enableAutoScaling?: boolean | undefined;
|
|
184
|
+
timeoutMinutes?: number | undefined;
|
|
185
|
+
executionClass?: string | undefined;
|
|
156
186
|
}>;
|
|
157
187
|
type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;
|
|
158
188
|
/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */
|
|
159
189
|
declare const submitSparkJobAndWaitOptionsSchema: z.ZodObject<{
|
|
190
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
160
191
|
namespace: z.ZodString;
|
|
161
192
|
name: z.ZodString;
|
|
162
|
-
scriptName: z.ZodString;
|
|
163
193
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
194
|
+
entrypoint: z.ZodString;
|
|
195
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
196
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
197
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
198
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
199
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
200
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
164
201
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
165
202
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
166
203
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
167
|
-
|
|
168
|
-
|
|
204
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
205
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
206
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
207
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
208
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
169
209
|
} & {
|
|
170
210
|
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
171
211
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
172
212
|
}, "strip", z.ZodTypeAny, {
|
|
213
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
173
214
|
namespace: string;
|
|
174
215
|
name: string;
|
|
175
|
-
scriptName: string;
|
|
176
216
|
args: string[];
|
|
217
|
+
entrypoint: string;
|
|
218
|
+
sparkConf: string[];
|
|
219
|
+
jobTags: string[];
|
|
220
|
+
runTags: string[];
|
|
177
221
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
178
222
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
179
223
|
executorNumbers: number;
|
|
180
|
-
|
|
181
|
-
runTags: string[];
|
|
224
|
+
numberOfWorkers: number;
|
|
182
225
|
pollIntervalMs: number;
|
|
183
226
|
timeoutMs: number;
|
|
227
|
+
pyFiles?: string | undefined;
|
|
228
|
+
mainClass?: string | undefined;
|
|
229
|
+
executionIamPolicy?: string | undefined;
|
|
230
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
231
|
+
enableAutoScaling?: boolean | undefined;
|
|
232
|
+
timeoutMinutes?: number | undefined;
|
|
233
|
+
executionClass?: string | undefined;
|
|
184
234
|
}, {
|
|
185
235
|
namespace: string;
|
|
186
236
|
name: string;
|
|
187
|
-
|
|
237
|
+
entrypoint: string;
|
|
238
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
188
239
|
args?: string[] | undefined;
|
|
240
|
+
pyFiles?: string | undefined;
|
|
241
|
+
mainClass?: string | undefined;
|
|
242
|
+
sparkConf?: string[] | undefined;
|
|
243
|
+
executionIamPolicy?: string | undefined;
|
|
244
|
+
jobTags?: string[] | undefined;
|
|
245
|
+
runTags?: string[] | undefined;
|
|
189
246
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
190
247
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
191
248
|
executorNumbers?: number | undefined;
|
|
192
|
-
|
|
193
|
-
|
|
249
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
250
|
+
numberOfWorkers?: number | undefined;
|
|
251
|
+
enableAutoScaling?: boolean | undefined;
|
|
252
|
+
timeoutMinutes?: number | undefined;
|
|
253
|
+
executionClass?: string | undefined;
|
|
194
254
|
pollIntervalMs?: number | undefined;
|
|
195
255
|
timeoutMs?: number | undefined;
|
|
196
256
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -124,73 +124,133 @@ declare const sparkMachineTypeSchema: z.ZodEnum<["spark.1.c", "spark.2.c", "spar
|
|
|
124
124
|
type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;
|
|
125
125
|
/** Spark job submit options. Optional fields have defaults. */
|
|
126
126
|
declare const submitOptionsSchema: z.ZodObject<{
|
|
127
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
127
128
|
namespace: z.ZodString;
|
|
128
129
|
name: z.ZodString;
|
|
129
|
-
scriptName: z.ZodString;
|
|
130
130
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
|
+
entrypoint: z.ZodString;
|
|
132
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
133
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
134
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
135
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
136
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
137
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
131
138
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
132
139
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
133
140
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
134
|
-
|
|
135
|
-
|
|
141
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
142
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
143
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
144
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
145
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
136
146
|
}, "strip", z.ZodTypeAny, {
|
|
147
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
137
148
|
namespace: string;
|
|
138
149
|
name: string;
|
|
139
|
-
scriptName: string;
|
|
140
150
|
args: string[];
|
|
151
|
+
entrypoint: string;
|
|
152
|
+
sparkConf: string[];
|
|
153
|
+
jobTags: string[];
|
|
154
|
+
runTags: string[];
|
|
141
155
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
142
156
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
143
157
|
executorNumbers: number;
|
|
144
|
-
|
|
145
|
-
|
|
158
|
+
numberOfWorkers: number;
|
|
159
|
+
pyFiles?: string | undefined;
|
|
160
|
+
mainClass?: string | undefined;
|
|
161
|
+
executionIamPolicy?: string | undefined;
|
|
162
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
163
|
+
enableAutoScaling?: boolean | undefined;
|
|
164
|
+
timeoutMinutes?: number | undefined;
|
|
165
|
+
executionClass?: string | undefined;
|
|
146
166
|
}, {
|
|
147
167
|
namespace: string;
|
|
148
168
|
name: string;
|
|
149
|
-
|
|
169
|
+
entrypoint: string;
|
|
170
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
150
171
|
args?: string[] | undefined;
|
|
172
|
+
pyFiles?: string | undefined;
|
|
173
|
+
mainClass?: string | undefined;
|
|
174
|
+
sparkConf?: string[] | undefined;
|
|
175
|
+
executionIamPolicy?: string | undefined;
|
|
176
|
+
jobTags?: string[] | undefined;
|
|
177
|
+
runTags?: string[] | undefined;
|
|
151
178
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
152
179
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
153
180
|
executorNumbers?: number | undefined;
|
|
154
|
-
|
|
155
|
-
|
|
181
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
182
|
+
numberOfWorkers?: number | undefined;
|
|
183
|
+
enableAutoScaling?: boolean | undefined;
|
|
184
|
+
timeoutMinutes?: number | undefined;
|
|
185
|
+
executionClass?: string | undefined;
|
|
156
186
|
}>;
|
|
157
187
|
type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;
|
|
158
188
|
/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */
|
|
159
189
|
declare const submitSparkJobAndWaitOptionsSchema: z.ZodObject<{
|
|
190
|
+
cluster: z.ZodDefault<z.ZodEnum<["oleander", "emr-serverless", "glue"]>>;
|
|
160
191
|
namespace: z.ZodString;
|
|
161
192
|
name: z.ZodString;
|
|
162
|
-
scriptName: z.ZodString;
|
|
163
193
|
args: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
194
|
+
entrypoint: z.ZodString;
|
|
195
|
+
pyFiles: z.ZodOptional<z.ZodString>;
|
|
196
|
+
mainClass: z.ZodOptional<z.ZodString>;
|
|
197
|
+
sparkConf: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
198
|
+
executionIamPolicy: z.ZodOptional<z.ZodString>;
|
|
199
|
+
jobTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
200
|
+
runTags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
164
201
|
driverMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
165
202
|
executorMachineType: z.ZodDefault<z.ZodEnum<["spark.1.c", "spark.2.c", "spark.4.c", "spark.8.c", "spark.16.c", "spark.1.b", "spark.2.b", "spark.4.b", "spark.8.b", "spark.16.b", "spark.1.m", "spark.2.m", "spark.4.m", "spark.8.m", "spark.16.m"]>>;
|
|
166
203
|
executorNumbers: z.ZodDefault<z.ZodNumber>;
|
|
167
|
-
|
|
168
|
-
|
|
204
|
+
workerType: z.ZodOptional<z.ZodEnum<["G.1X", "G.2X", "G.4X", "G.8X", "G.025X"]>>;
|
|
205
|
+
numberOfWorkers: z.ZodDefault<z.ZodNumber>;
|
|
206
|
+
enableAutoScaling: z.ZodOptional<z.ZodBoolean>;
|
|
207
|
+
timeoutMinutes: z.ZodOptional<z.ZodNumber>;
|
|
208
|
+
executionClass: z.ZodOptional<z.ZodString>;
|
|
169
209
|
} & {
|
|
170
210
|
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
171
211
|
timeoutMs: z.ZodDefault<z.ZodNumber>;
|
|
172
212
|
}, "strip", z.ZodTypeAny, {
|
|
213
|
+
cluster: "oleander" | "emr-serverless" | "glue";
|
|
173
214
|
namespace: string;
|
|
174
215
|
name: string;
|
|
175
|
-
scriptName: string;
|
|
176
216
|
args: string[];
|
|
217
|
+
entrypoint: string;
|
|
218
|
+
sparkConf: string[];
|
|
219
|
+
jobTags: string[];
|
|
220
|
+
runTags: string[];
|
|
177
221
|
driverMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
178
222
|
executorMachineType: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m";
|
|
179
223
|
executorNumbers: number;
|
|
180
|
-
|
|
181
|
-
runTags: string[];
|
|
224
|
+
numberOfWorkers: number;
|
|
182
225
|
pollIntervalMs: number;
|
|
183
226
|
timeoutMs: number;
|
|
227
|
+
pyFiles?: string | undefined;
|
|
228
|
+
mainClass?: string | undefined;
|
|
229
|
+
executionIamPolicy?: string | undefined;
|
|
230
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
231
|
+
enableAutoScaling?: boolean | undefined;
|
|
232
|
+
timeoutMinutes?: number | undefined;
|
|
233
|
+
executionClass?: string | undefined;
|
|
184
234
|
}, {
|
|
185
235
|
namespace: string;
|
|
186
236
|
name: string;
|
|
187
|
-
|
|
237
|
+
entrypoint: string;
|
|
238
|
+
cluster?: "oleander" | "emr-serverless" | "glue" | undefined;
|
|
188
239
|
args?: string[] | undefined;
|
|
240
|
+
pyFiles?: string | undefined;
|
|
241
|
+
mainClass?: string | undefined;
|
|
242
|
+
sparkConf?: string[] | undefined;
|
|
243
|
+
executionIamPolicy?: string | undefined;
|
|
244
|
+
jobTags?: string[] | undefined;
|
|
245
|
+
runTags?: string[] | undefined;
|
|
189
246
|
driverMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
190
247
|
executorMachineType?: "spark.1.c" | "spark.2.c" | "spark.4.c" | "spark.8.c" | "spark.16.c" | "spark.1.b" | "spark.2.b" | "spark.4.b" | "spark.8.b" | "spark.16.b" | "spark.1.m" | "spark.2.m" | "spark.4.m" | "spark.8.m" | "spark.16.m" | undefined;
|
|
191
248
|
executorNumbers?: number | undefined;
|
|
192
|
-
|
|
193
|
-
|
|
249
|
+
workerType?: "G.1X" | "G.2X" | "G.4X" | "G.8X" | "G.025X" | undefined;
|
|
250
|
+
numberOfWorkers?: number | undefined;
|
|
251
|
+
enableAutoScaling?: boolean | undefined;
|
|
252
|
+
timeoutMinutes?: number | undefined;
|
|
253
|
+
executionClass?: string | undefined;
|
|
194
254
|
pollIntervalMs?: number | undefined;
|
|
195
255
|
timeoutMs?: number | undefined;
|
|
196
256
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -38,6 +38,11 @@ var listSparkJobsResultSchema = z.object({
|
|
|
38
38
|
scripts: z.array(z.string()),
|
|
39
39
|
hasMore: z.boolean()
|
|
40
40
|
});
|
|
41
|
+
var sparkClusterTypeSchema = z.enum([
|
|
42
|
+
"oleander",
|
|
43
|
+
"emr-serverless",
|
|
44
|
+
"glue"
|
|
45
|
+
]);
|
|
41
46
|
var sparkMachineTypeSchema = z.enum([
|
|
42
47
|
"spark.1.c",
|
|
43
48
|
"spark.2.c",
|
|
@@ -55,16 +60,33 @@ var sparkMachineTypeSchema = z.enum([
|
|
|
55
60
|
"spark.8.m",
|
|
56
61
|
"spark.16.m"
|
|
57
62
|
]);
|
|
63
|
+
var glueWorkerTypeSchema = z.enum([
|
|
64
|
+
"G.1X",
|
|
65
|
+
"G.2X",
|
|
66
|
+
"G.4X",
|
|
67
|
+
"G.8X",
|
|
68
|
+
"G.025X"
|
|
69
|
+
]);
|
|
58
70
|
var submitOptionsSchema = z.object({
|
|
71
|
+
cluster: sparkClusterTypeSchema.default("oleander"),
|
|
59
72
|
namespace: z.string().min(1, "namespace is required"),
|
|
60
73
|
name: z.string().min(1, "name is required"),
|
|
61
|
-
scriptName: z.string().min(1, "scriptName is required"),
|
|
62
74
|
args: z.array(z.string()).default([]),
|
|
75
|
+
entrypoint: z.string().min(1, "entrypoint is required"),
|
|
76
|
+
pyFiles: z.string().optional(),
|
|
77
|
+
mainClass: z.string().optional(),
|
|
78
|
+
sparkConf: z.array(z.string()).default([]),
|
|
79
|
+
executionIamPolicy: z.string().optional(),
|
|
80
|
+
jobTags: z.array(z.string()).default([]),
|
|
81
|
+
runTags: z.array(z.string()).default([]),
|
|
63
82
|
driverMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
64
83
|
executorMachineType: sparkMachineTypeSchema.default("spark.1.b"),
|
|
65
84
|
executorNumbers: z.number().int().min(1).max(20).default(2),
|
|
66
|
-
|
|
67
|
-
|
|
85
|
+
workerType: glueWorkerTypeSchema.optional(),
|
|
86
|
+
numberOfWorkers: z.number().int().min(1).default(1),
|
|
87
|
+
enableAutoScaling: z.boolean().optional(),
|
|
88
|
+
timeoutMinutes: z.number().int().optional(),
|
|
89
|
+
executionClass: z.string().optional()
|
|
68
90
|
});
|
|
69
91
|
var submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({
|
|
70
92
|
pollIntervalMs: z.number().int().positive().default(1e4),
|
|
@@ -197,19 +219,60 @@ var Oleander = class {
|
|
|
197
219
|
*/
|
|
198
220
|
async submitSparkJob(options) {
|
|
199
221
|
const opts = submitOptionsSchema.parse(options);
|
|
200
|
-
const
|
|
222
|
+
const buildGlueArguments = (args) => {
|
|
223
|
+
const result = {};
|
|
224
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
225
|
+
const key = args[i];
|
|
226
|
+
const value = args[i + 1];
|
|
227
|
+
if (value === void 0) {
|
|
228
|
+
throw new Error(`Missing value for argument: ${key}`);
|
|
229
|
+
}
|
|
230
|
+
result[key] = value;
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
};
|
|
234
|
+
let properties;
|
|
235
|
+
if (opts.cluster === "oleander") {
|
|
236
|
+
properties = {
|
|
237
|
+
entrypoint: opts.entrypoint,
|
|
238
|
+
entrypointArguments: opts.args,
|
|
239
|
+
driverMachineType: opts.driverMachineType,
|
|
240
|
+
executorMachineType: opts.executorMachineType,
|
|
241
|
+
executorNumbers: opts.executorNumbers,
|
|
242
|
+
sparkConf: opts.sparkConf
|
|
243
|
+
};
|
|
244
|
+
} else if (opts.cluster === "emr-serverless") {
|
|
245
|
+
properties = {
|
|
246
|
+
entrypoint: opts.entrypoint,
|
|
247
|
+
entrypointArguments: opts.args,
|
|
248
|
+
pyFiles: opts.pyFiles,
|
|
249
|
+
mainClass: opts.mainClass,
|
|
250
|
+
sparkConf: opts.sparkConf,
|
|
251
|
+
executionIamPolicy: opts.executionIamPolicy
|
|
252
|
+
};
|
|
253
|
+
} else if (opts.cluster === "glue") {
|
|
254
|
+
properties = {
|
|
255
|
+
jobName: opts.entrypoint,
|
|
256
|
+
entrypointArguments: buildGlueArguments(opts.args),
|
|
257
|
+
sparkConf: opts.sparkConf,
|
|
258
|
+
workerType: opts.workerType,
|
|
259
|
+
numberOfWorkers: opts.numberOfWorkers,
|
|
260
|
+
enableAutoScaling: opts.enableAutoScaling,
|
|
261
|
+
timeoutMinutes: opts.timeoutMinutes,
|
|
262
|
+
executionClass: opts.executionClass,
|
|
263
|
+
executionRoleSessionPolicy: opts.executionIamPolicy
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {
|
|
201
267
|
method: "POST",
|
|
202
268
|
headers: getHeaders(this.apiKey),
|
|
203
269
|
body: JSON.stringify({
|
|
270
|
+
cluster: opts.cluster,
|
|
204
271
|
namespace: opts.namespace.trim(),
|
|
205
272
|
name: opts.name.trim(),
|
|
206
|
-
scriptName: opts.scriptName.trim(),
|
|
207
|
-
arguments: opts.args,
|
|
208
|
-
driverMachineType: opts.driverMachineType,
|
|
209
|
-
executorMachineType: opts.executorMachineType,
|
|
210
|
-
executorNumbers: opts.executorNumbers,
|
|
211
273
|
jobTags: opts.jobTags,
|
|
212
|
-
runTags: opts.runTags
|
|
274
|
+
runTags: opts.runTags,
|
|
275
|
+
properties
|
|
213
276
|
})
|
|
214
277
|
});
|
|
215
278
|
const raw = await res.json().catch(() => ({}));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemas.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n scriptName: z.string().min(1, \"scriptName is required\"),\n args: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n scriptName: opts.scriptName.trim(),\n arguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemas.ts","../src/client.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/** API error response body */\nexport const apiErrorBodySchema = z.object({\n error: z.string().optional(),\n details: z.string().optional(),\n});\n\nexport type ApiErrorBody = z.infer<typeof apiErrorBodySchema>;\n\nconst DEFAULT_BASE_URL = \"https://oleander.dev\";\n\n/** Constructor options. apiKey can be omitted if OLEANDER_API_KEY env is set. */\nexport const optionsSchema = z.object({\n apiKey: z.string().optional(),\n baseUrl: z\n .string()\n .default(DEFAULT_BASE_URL)\n .transform((v) => (v.trim() ? v.trim() : DEFAULT_BASE_URL)),\n});\n\nexport type OleanderOptions = z.input<typeof optionsSchema>;\n\n/** Lake query options */\nexport const queryOptionsSchema = z.object({\n save: z.boolean().default(false),\n});\n\nexport type QueryOptions = z.input<typeof queryOptionsSchema>;\n\n/** Lake query result (API response) */\nexport const lakeQueryResultSchema = z.object({\n success: z.boolean(),\n results: z\n .object({\n columns: z.array(z.string()),\n column_types: z.array(z.string()),\n rows: z.array(z.array(z.unknown())),\n })\n .optional(),\n row_count: z.number().optional(),\n execution_time: z.string().optional(),\n saved_table_name: z.string().optional(),\n error: z.string().optional(),\n details: z.string().optional(),\n query: z.string().optional(),\n});\n\nexport type LakeQueryResult = z.infer<typeof lakeQueryResultSchema>;\n\n/** API response for one page of spark scripts (S3-style) */\nexport const sparkJobListPageSchema = z.object({\n scripts: z.array(z.string()),\n continuationToken: z.string().optional(),\n});\n\nexport type SparkJobListPage = z.infer<typeof sparkJobListPageSchema>;\n\n/** Options for listSparkJobs (limit/offset pagination) */\nexport const listSparkJobsOptionsSchema = z.object({\n limit: z.number().int().positive().default(20),\n offset: z.number().int().nonnegative().default(0),\n});\n\nexport type ListSparkJobsOptions = z.input<typeof listSparkJobsOptionsSchema>;\n\n/** Result of listSparkJobs with limit/offset */\nexport const listSparkJobsResultSchema = z.object({\n scripts: z.array(z.string()),\n hasMore: z.boolean(),\n});\n\nexport type ListSparkJobsResult = z.infer<typeof listSparkJobsResultSchema>;\n\n/** Spark cluster type enum */\nexport const sparkClusterTypeSchema = z.enum([\n \"oleander\",\n \"emr-serverless\",\n \"glue\",\n]);\n\n/** Spark machine type enum */\nexport const sparkMachineTypeSchema = z.enum([\n \"spark.1.c\",\n \"spark.2.c\",\n \"spark.4.c\",\n \"spark.8.c\",\n \"spark.16.c\",\n \"spark.1.b\",\n \"spark.2.b\",\n \"spark.4.b\",\n \"spark.8.b\",\n \"spark.16.b\",\n \"spark.1.m\",\n \"spark.2.m\",\n \"spark.4.m\",\n \"spark.8.m\",\n \"spark.16.m\",\n]);\n\n/** Glue worker type enum */\nexport const glueWorkerTypeSchema = z.enum([\n \"G.1X\",\n \"G.2X\",\n \"G.4X\",\n \"G.8X\",\n \"G.025X\",\n]);\n\nexport type SparkMachineType = z.infer<typeof sparkMachineTypeSchema>;\n\n/** Spark job submit options. Optional fields have defaults. */\nexport const submitOptionsSchema = z.object({\n cluster: sparkClusterTypeSchema.default(\"oleander\"),\n namespace: z.string().min(1, \"namespace is required\"),\n name: z.string().min(1, \"name is required\"),\n args: z.array(z.string()).default([]),\n entrypoint: z.string().min(1, \"entrypoint is required\"),\n pyFiles: z.string().optional(),\n mainClass: z.string().optional(),\n sparkConf: z.array(z.string()).default([]),\n executionIamPolicy: z.string().optional(),\n jobTags: z.array(z.string()).default([]),\n runTags: z.array(z.string()).default([]),\n driverMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorMachineType: sparkMachineTypeSchema.default(\"spark.1.b\"),\n executorNumbers: z.number().int().min(1).max(20).default(2),\n workerType: glueWorkerTypeSchema.optional(),\n numberOfWorkers: z.number().int().min(1).default(1),\n enableAutoScaling: z.boolean().optional(),\n timeoutMinutes: z.number().int().optional(),\n executionClass: z.string().optional(),\n});\n\nexport type SparkJobSubmitOptions = z.input<typeof submitOptionsSchema>;\n\n/** Options for submitSparkJobAndWait (submit options + optional wait tuning) */\nexport const submitSparkJobAndWaitOptionsSchema = submitOptionsSchema.extend({\n pollIntervalMs: z.number().int().positive().default(10000),\n timeoutMs: z.number().int().positive().default(600000),\n});\n\nexport type SubmitSparkJobAndWaitOptions = z.input<\n typeof submitSparkJobAndWaitOptionsSchema\n>;\n\n/** Spark job submit response */\nexport const sparkJobRunSchema = z.object({\n runId: z.string(),\n});\n\nexport type SparkJobRun = z.infer<typeof sparkJobRunSchema>;\n\n/** Run status (for polling) */\nexport const runResponseSchema = z.object({\n id: z.string(),\n state: z.string().nullable(),\n started_at: z.string().nullable().optional(),\n queued_at: z.string().nullable().optional(),\n scheduled_at: z.string().nullable().optional(),\n ended_at: z.string().nullable().optional(),\n duration: z.number().nullable().optional(),\n error: z.unknown().nullable().optional(),\n tags: z.array(\n z.object({\n key: z.string(),\n value: z.string(),\n source: z.string().nullable().optional(),\n }),\n ),\n job: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n pipeline: z.object({\n id: z.string(),\n name: z.string(),\n namespace: z.string(),\n }),\n});\n\nexport type RunResponse = z.infer<typeof runResponseSchema>;\n\nexport type RunState = \"COMPLETE\" | \"FAIL\" | \"ABORT\" | string;\n","import {\n optionsSchema,\n queryOptionsSchema,\n lakeQueryResultSchema,\n sparkJobListPageSchema,\n listSparkJobsOptionsSchema,\n submitOptionsSchema,\n submitSparkJobAndWaitOptionsSchema,\n sparkJobRunSchema,\n runResponseSchema,\n apiErrorBodySchema,\n} from \"./schemas.js\";\nimport type {\n OleanderOptions,\n QueryOptions,\n LakeQueryResult,\n ListSparkJobsOptions,\n ListSparkJobsResult,\n SparkJobSubmitOptions,\n SubmitSparkJobAndWaitOptions,\n SparkJobRun,\n RunResponse,\n RunState,\n} from \"./schemas.js\";\n\nfunction getHeaders(apiKey: string): Record<string, string> {\n return {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n };\n}\n\nfunction parseErrorBody(body: unknown, status: number): string {\n const parsed = apiErrorBodySchema.safeParse(body);\n if (parsed.success) {\n const { error, details } = parsed.data;\n return error || details || `HTTP ${status}`;\n }\n return `HTTP ${status}`;\n}\n\n/**\n * oleander API. Mirrors the CLI for query, list spark jobs, and launch spark jobs.\n */\nexport class Oleander {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(options: OleanderOptions = {}) {\n const parsed = optionsSchema.safeParse(options);\n if (!parsed.success) {\n const first =\n parsed.error.flatten().formErrors[0] ?? parsed.error.message;\n throw new Error(first);\n }\n const fromOptions = parsed.data.apiKey?.trim();\n const fromEnv =\n typeof process !== \"undefined\" && process.env?.OLEANDER_API_KEY;\n const apiKey = fromOptions ?? fromEnv ?? \"\";\n if (!apiKey) {\n throw new Error(\n \"Oleander requires a non-empty apiKey (or set OLEANDER_API_KEY)\",\n );\n }\n this.apiKey = apiKey;\n this.baseUrl = parsed.data.baseUrl.trim().replace(/\\/$/, \"\");\n }\n\n /**\n * Execute a lake query (mirrors `oleander query`).\n */\n async query(\n sql: string,\n options: QueryOptions = {},\n ): Promise<LakeQueryResult> {\n const query = typeof sql === \"string\" ? sql.trim() : \"\";\n if (!query) {\n throw new Error(\"Query is required\");\n }\n const opts = queryOptionsSchema.parse(options);\n\n const res = await fetch(`${this.baseUrl}/api/v1/warehouse/query`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n query,\n autoSaveByHash: opts.save,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n\n const result = lakeQueryResultSchema.parse(raw);\n if (!result.success && result.error) {\n throw new Error(result.details || result.error);\n }\n return result;\n }\n\n /**\n * List spark jobs (mirrors `oleander spark jobs list`).\n * Uses limit/offset pagination; pages through the API internally.\n */\n async listSparkJobs(\n options: ListSparkJobsOptions = {},\n ): Promise<ListSparkJobsResult> {\n const opts = listSparkJobsOptionsSchema.parse(options);\n const { limit, offset } = opts;\n\n const allScripts: string[] = [];\n let continuationToken: string | undefined;\n\n while (true) {\n const params = continuationToken\n ? `?${new URLSearchParams({ continuationToken }).toString()}`\n : \"\";\n const res = await fetch(`${this.baseUrl}/api/v1/spark/scripts${params}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n const page = sparkJobListPageSchema.parse(raw);\n allScripts.push(...page.scripts);\n continuationToken = page.continuationToken;\n if (!continuationToken || allScripts.length >= offset + limit) {\n break;\n }\n }\n\n const scripts = allScripts.slice(offset, offset + limit);\n const hasMore = !!continuationToken || allScripts.length > offset + limit;\n return { scripts, hasMore };\n }\n\n /**\n * Submit a spark job (mirrors `oleander spark jobs submit`).\n * Returns the run ID; use getRun() or submitSparkJobAndWait() to poll status.\n */\n async submitSparkJob(options: SparkJobSubmitOptions): Promise<SparkJobRun> {\n const opts = submitOptionsSchema.parse(options);\n\n const buildGlueArguments = (args: string[]): Record<string, string> => {\n const result: Record<string, string> = {};\n for (let i = 0; i < args.length; i += 2) {\n const key = args[i];\n const value = args[i + 1];\n if (value === undefined) {\n throw new Error(`Missing value for argument: ${key}`);\n }\n result[key] = value;\n }\n return result;\n };\n\n let properties: any;\n if (opts.cluster === \"oleander\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n driverMachineType: opts.driverMachineType,\n executorMachineType: opts.executorMachineType,\n executorNumbers: opts.executorNumbers,\n sparkConf: opts.sparkConf,\n };\n } else if (opts.cluster === \"emr-serverless\") {\n properties = {\n entrypoint: opts.entrypoint,\n entrypointArguments: opts.args,\n pyFiles: opts.pyFiles,\n mainClass: opts.mainClass,\n sparkConf: opts.sparkConf,\n executionIamPolicy: opts.executionIamPolicy,\n };\n } else if (opts.cluster === \"glue\") {\n properties = {\n jobName: opts.entrypoint,\n entrypointArguments: buildGlueArguments(opts.args),\n sparkConf: opts.sparkConf,\n workerType: opts.workerType,\n numberOfWorkers: opts.numberOfWorkers,\n enableAutoScaling: opts.enableAutoScaling,\n timeoutMinutes: opts.timeoutMinutes,\n executionClass: opts.executionClass,\n executionRoleSessionPolicy: opts.executionIamPolicy,\n };\n }\n\n const res = await fetch(`${this.baseUrl}/api/v2/spark/jobs`, {\n method: \"POST\",\n headers: getHeaders(this.apiKey),\n body: JSON.stringify({\n cluster: opts.cluster,\n namespace: opts.namespace.trim(),\n name: opts.name.trim(),\n jobTags: opts.jobTags,\n runTags: opts.runTags,\n properties: properties,\n }),\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return sparkJobRunSchema.parse(raw);\n }\n\n /**\n * Get run status (used for polling after submit).\n */\n async getRun(runId: string): Promise<RunResponse> {\n if (!runId || typeof runId !== \"string\" || !runId.trim()) {\n throw new Error(\"runId is required\");\n }\n const res = await fetch(`${this.baseUrl}/api/v2/runs/${runId}`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${this.apiKey}` },\n });\n\n const raw = await res.json().catch(() => ({}));\n if (!res.ok) {\n throw new Error(parseErrorBody(raw, res.status));\n }\n return runResponseSchema.parse(raw);\n }\n\n /**\n * Submit a spark job and wait until the run reaches a terminal state (COMPLETE, FAIL, ABORT).\n */\n async submitSparkJobAndWait(\n options: SubmitSparkJobAndWaitOptions,\n ): Promise<{ runId: string; state: RunState; run: RunResponse }> {\n const opts = submitSparkJobAndWaitOptionsSchema.parse(options);\n const { pollIntervalMs, timeoutMs, ...submitOpts } = opts;\n const { runId } = await this.submitSparkJob(submitOpts);\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n const run = await this.getRun(runId);\n const state = run.state ?? \"\";\n if (state === \"COMPLETE\" || state === \"FAIL\" || state === \"ABORT\") {\n return { runId, state, run };\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n const run = await this.getRun(runId);\n throw new Error(\n `Timeout waiting for run ${runId} (state: ${run.state ?? \"unknown\"})`,\n );\n }\n}\n"],"mappings":"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","names":["run"]}
|