@fabricorg/databricks-testkit 0.2.4 → 0.3.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/dist/index.js CHANGED
@@ -196,7 +196,8 @@ async function runLiveSuite(spec, runtime = {}) {
196
196
  finishedAt: (/* @__PURE__ */ new Date()).toISOString(),
197
197
  success,
198
198
  required: required2,
199
- results
199
+ results,
200
+ ...spec.targetPack ? { targetPack: spec.targetPack } : {}
200
201
  };
201
202
  if (spec.evidencePath)
202
203
  await writeReport(spec.evidencePath, `${JSON.stringify(evidence, null, 2)}
@@ -1072,6 +1073,529 @@ function classicComputeCheck() {
1072
1073
  };
1073
1074
  }
1074
1075
 
1075
- export { appHealthCheck, assertDeltaContract, autoLoaderIngestionCheck, backupRestoreCheck, classicComputeCheck, createEphemeralLakebaseBranch, createExecutionContext, createLakebaseTestProvider, createMockDatabricksClient, customLiveCheck, dbtBuildCheck, defineLiveSuite, deleteEphemeralLakebaseBranch, deleteVolumeFile, deltaContractCheck, ensureVolumeDirectory, expectQueryToMatchGolden, expectTable, failureRecoveryCheck, jobRunCheck, lakebaseCredentialCheck, lakebaseRoundTripCheck, normalizeVolumeRoot, notebookSubmitCheck, performanceBudgetCheck, pipelineRefreshCheck, renderJUnit, resolveLakebaseProject, resolveProfile, restrictedPrincipalCheck, rollbackCheck, runLiveSuite, secretRotationCheck, secretScopeCheck, serverlessComputeCheck, sqlRoundTripCheck, toLakebaseBranchId, unityCatalogAccessCheck, uploadVolumeFile, volumeIOCheck, waitForPipelineUpdate };
1076
+ // src/target-packs.ts
1077
+ var TARGET_PACK_ID = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
1078
+ function defineTargetPack(spec) {
1079
+ if (!TARGET_PACK_ID.test(spec.id)) {
1080
+ throw new Error(`Target pack id '${spec.id}' must be lowercase kebab-case`);
1081
+ }
1082
+ if (!spec.name.trim()) throw new Error(`Target pack '${spec.id}' requires a name`);
1083
+ if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(spec.version)) {
1084
+ throw new Error(
1085
+ `Target pack '${spec.id}' version '${spec.version}' is not semantic versioning`
1086
+ );
1087
+ }
1088
+ if (spec.capabilities.length === 0) {
1089
+ throw new Error(`Target pack '${spec.id}' must declare at least one capability`);
1090
+ }
1091
+ const createChecks = typeof spec.checks === "function" ? spec.checks : () => spec.checks;
1092
+ const validateChecks = () => {
1093
+ const checks = [...createChecks()];
1094
+ const ids = /* @__PURE__ */ new Set();
1095
+ for (const check of checks) {
1096
+ if (!check.id.trim())
1097
+ throw new Error(`Target pack '${spec.id}' contains a check without an id`);
1098
+ if (ids.has(check.id)) {
1099
+ throw new Error(`Target pack '${spec.id}' contains duplicate check '${check.id}'`);
1100
+ }
1101
+ ids.add(check.id);
1102
+ }
1103
+ for (const required2 of spec.requiredChecks ?? []) {
1104
+ if (!ids.has(required2)) {
1105
+ throw new Error(`Target pack '${spec.id}' requires unknown check '${required2}'`);
1106
+ }
1107
+ }
1108
+ return checks;
1109
+ };
1110
+ validateChecks();
1111
+ return Object.freeze({
1112
+ ...spec,
1113
+ capabilities: Object.freeze([...spec.capabilities]),
1114
+ requiredChecks: Object.freeze([...spec.requiredChecks ?? []]),
1115
+ requirements: Object.freeze([...spec.requirements ?? []]),
1116
+ certificationScopes: Object.freeze([...spec.certificationScopes ?? []]),
1117
+ checks: validateChecks
1118
+ });
1119
+ }
1120
+ function createTargetPackRegistry(packs) {
1121
+ const registry = /* @__PURE__ */ new Map();
1122
+ for (const pack of packs) {
1123
+ if (registry.has(pack.id)) throw new Error(`Duplicate target pack '${pack.id}'`);
1124
+ registry.set(pack.id, pack);
1125
+ }
1126
+ return registry;
1127
+ }
1128
+ function doctorTargetPack(pack, env = process.env, requiredChecks = pack.requiredChecks ?? []) {
1129
+ const requirements = (pack.requirements ?? []).map((requirement) => ({
1130
+ id: requirement.id,
1131
+ description: requirement.description,
1132
+ satisfied: requirement.anyOf.some((name) => Boolean(env[name]?.trim())),
1133
+ required: requirement.required !== false,
1134
+ variables: [...requirement.anyOf]
1135
+ }));
1136
+ const required2 = new Set(requiredChecks);
1137
+ const checks = pack.checks().map((check) => ({
1138
+ id: check.id,
1139
+ description: check.description,
1140
+ configured: check.configured ? check.configured(env) : true,
1141
+ required: required2.has(check.id)
1142
+ }));
1143
+ const known = new Set(checks.map((check) => check.id));
1144
+ const missingRequirements = requirements.filter((requirement) => requirement.required && !requirement.satisfied).map((requirement) => requirement.id);
1145
+ const missingRequiredChecks = [
1146
+ ...checks.filter((check) => check.required && !check.configured).map((check) => check.id),
1147
+ ...[...required2].filter((id) => !known.has(id))
1148
+ ];
1149
+ return {
1150
+ pack: {
1151
+ id: pack.id,
1152
+ name: pack.name,
1153
+ version: pack.version,
1154
+ maturity: pack.maturity
1155
+ },
1156
+ ready: missingRequirements.length === 0 && missingRequiredChecks.length === 0,
1157
+ requirements,
1158
+ checks,
1159
+ missingRequirements,
1160
+ missingRequiredChecks
1161
+ };
1162
+ }
1163
+ function defineTargetPackRun(pack, options = {}) {
1164
+ const env = options.env ?? process.env;
1165
+ const requiredChecks = [...options.requiredChecks ?? pack.requiredChecks ?? []];
1166
+ const doctor = doctorTargetPack(pack, env, requiredChecks);
1167
+ if (!doctor.ready) {
1168
+ const missing = [...doctor.missingRequirements, ...doctor.missingRequiredChecks].join(", ");
1169
+ throw new Error(`Target pack '${pack.id}' is not configured: ${missing}`);
1170
+ }
1171
+ const targetPack = evidenceMetadata(pack, env);
1172
+ const suite = defineLiveSuite({
1173
+ checks: pack.checks(),
1174
+ required: requiredChecks,
1175
+ env,
1176
+ evidencePath: options.evidencePath,
1177
+ junitPath: options.junitPath,
1178
+ targetPack
1179
+ });
1180
+ return { pack, run: (runtime) => suite.run(runtime) };
1181
+ }
1182
+ async function runTargetPack(pack, options = {}, runtime) {
1183
+ return defineTargetPackRun(pack, options).run(runtime);
1184
+ }
1185
+ function evidenceMetadata(pack, env) {
1186
+ return {
1187
+ id: pack.id,
1188
+ name: pack.name,
1189
+ version: pack.version,
1190
+ maturity: pack.maturity,
1191
+ capabilities: [...pack.capabilities],
1192
+ ...pack.docsUrl ? { docsUrl: pack.docsUrl } : {},
1193
+ certificationScopes: [...pack.certificationScopes ?? []],
1194
+ target: compact({
1195
+ cloud: env.DBX_TEST_CLOUD,
1196
+ region: env.DBX_TEST_REGION,
1197
+ workspace: env.DATABRICKS_HOST,
1198
+ runtime: env.DBX_TEST_RUNTIME_VERSION,
1199
+ compute: env.DBX_TEST_COMPUTE
1200
+ })
1201
+ };
1202
+ }
1203
+ function compact(value) {
1204
+ return Object.fromEntries(
1205
+ Object.entries(value).filter((entry) => Boolean(entry[1]))
1206
+ );
1207
+ }
1208
+
1209
+ // src/foundation-packs.ts
1210
+ var DOCS = "https://experiments.fabric.pro/docs/testing/target-packs/";
1211
+ var AZURE_SCOPE = "Azure Databricks live-gated; see certification evidence for exact runtime";
1212
+ var workspaceRequirement = {
1213
+ id: "workspace",
1214
+ description: "Databricks workspace host",
1215
+ anyOf: ["DATABRICKS_HOST"]
1216
+ };
1217
+ var authRequirement = {
1218
+ id: "authentication",
1219
+ description: "Databricks OAuth, OIDC, bearer, or PAT authentication",
1220
+ anyOf: [
1221
+ "DATABRICKS_BEARER",
1222
+ "DATABRICKS_TOKEN",
1223
+ "DATABRICKS_CLIENT_ID",
1224
+ "DATABRICKS_OIDC_TOKEN",
1225
+ "DATABRICKS_OIDC_TOKEN_FILEPATH"
1226
+ ],
1227
+ secret: true
1228
+ };
1229
+ var warehouseRequirement = {
1230
+ id: "warehouse",
1231
+ description: "SQL warehouse ID or HTTP path",
1232
+ anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
1233
+ };
1234
+ function createSqlDeltaFoundationPack() {
1235
+ return defineTargetPack({
1236
+ id: "sql-delta",
1237
+ name: "SQL and Delta foundation",
1238
+ description: "SQL Statement Execution, Delta contracts, performance, recovery, backup and rollback.",
1239
+ version: "1.0.0",
1240
+ maturity: "live-gated",
1241
+ capabilities: [
1242
+ "sql.statement-execution",
1243
+ "delta.contract",
1244
+ "delta.time-travel",
1245
+ "performance.sql",
1246
+ "recovery.sql",
1247
+ "backup-restore.delta",
1248
+ "rollback.delta"
1249
+ ],
1250
+ checks: () => [
1251
+ restrictedPrincipalCheck(),
1252
+ sqlRoundTripCheck(),
1253
+ deltaContractCheck(),
1254
+ serverlessComputeCheck(),
1255
+ performanceBudgetCheck(),
1256
+ failureRecoveryCheck(),
1257
+ backupRestoreCheck(),
1258
+ rollbackCheck()
1259
+ ],
1260
+ requiredChecks: ["sql"],
1261
+ requirements: [workspaceRequirement, authRequirement, warehouseRequirement],
1262
+ docsUrl: `${DOCS}#existing-foundation-to-migrate-into-packs`,
1263
+ certificationScopes: [AZURE_SCOPE]
1264
+ });
1265
+ }
1266
+ function createLakeflowFoundationPack() {
1267
+ return defineTargetPack({
1268
+ id: "lakeflow-ingestion",
1269
+ name: "Lakeflow ingestion foundation",
1270
+ description: "Lakeflow refresh, Volumes, Auto Loader ingestion and rescued-row evidence.",
1271
+ version: "1.0.0",
1272
+ maturity: "live-gated",
1273
+ capabilities: [
1274
+ "lakeflow.refresh",
1275
+ "autoloader.ingestion",
1276
+ "volumes.files",
1277
+ "delta.rescued-data"
1278
+ ],
1279
+ checks: () => [
1280
+ restrictedPrincipalCheck(),
1281
+ pipelineRefreshCheck(),
1282
+ volumeIOCheck(),
1283
+ autoLoaderIngestionCheck()
1284
+ ],
1285
+ requiredChecks: ["pipeline"],
1286
+ requirements: [workspaceRequirement, authRequirement],
1287
+ docsUrl: `${DOCS}#existing-foundation-to-migrate-into-packs`,
1288
+ certificationScopes: [AZURE_SCOPE]
1289
+ });
1290
+ }
1291
+ function createJobsCodeFoundationPack() {
1292
+ return defineTargetPack({
1293
+ id: "jobs-code",
1294
+ name: "Jobs and code foundation",
1295
+ description: "Jobs, notebooks, dbt, serverless compute and classic compute probes.",
1296
+ version: "1.0.0",
1297
+ maturity: "live-gated",
1298
+ capabilities: [
1299
+ "jobs.run-now",
1300
+ "jobs.submit.notebook",
1301
+ "jobs.submit.dbt",
1302
+ "compute.serverless",
1303
+ "compute.classic"
1304
+ ],
1305
+ checks: () => [
1306
+ restrictedPrincipalCheck(),
1307
+ jobRunCheck(),
1308
+ notebookSubmitCheck(),
1309
+ dbtBuildCheck(),
1310
+ serverlessComputeCheck(),
1311
+ classicComputeCheck()
1312
+ ],
1313
+ requiredChecks: ["jobs"],
1314
+ requirements: [workspaceRequirement, authRequirement],
1315
+ docsUrl: `${DOCS}#existing-foundation-to-migrate-into-packs`,
1316
+ certificationScopes: [AZURE_SCOPE]
1317
+ });
1318
+ }
1319
+ function createUnityStorageFoundationPack() {
1320
+ return defineTargetPack({
1321
+ id: "unity-storage",
1322
+ name: "Unity Catalog and storage foundation",
1323
+ description: "Unity Catalog allow/deny, Volumes, secret metadata and secret rotation.",
1324
+ version: "1.0.0",
1325
+ maturity: "live-gated",
1326
+ capabilities: [
1327
+ "unity-catalog.permissions",
1328
+ "volumes.files",
1329
+ "secrets.metadata",
1330
+ "secrets.rotation"
1331
+ ],
1332
+ checks: () => [
1333
+ restrictedPrincipalCheck(),
1334
+ unityCatalogAccessCheck(),
1335
+ volumeIOCheck(),
1336
+ secretScopeCheck(),
1337
+ secretRotationCheck()
1338
+ ],
1339
+ requiredChecks: ["uc-grants"],
1340
+ requirements: [workspaceRequirement, authRequirement, warehouseRequirement],
1341
+ docsUrl: `${DOCS}#existing-foundation-to-migrate-into-packs`,
1342
+ certificationScopes: [AZURE_SCOPE]
1343
+ });
1344
+ }
1345
+ function createAppsOperationalFoundationPack() {
1346
+ return defineTargetPack({
1347
+ id: "apps-operational",
1348
+ name: "Apps and operational data foundation",
1349
+ description: "Databricks Apps resources and health plus Lakebase OAuth and pool refresh.",
1350
+ version: "1.0.0",
1351
+ maturity: "live-gated",
1352
+ capabilities: [
1353
+ "apps.health",
1354
+ "apps.resources",
1355
+ "lakebase.credentials",
1356
+ "lakebase.round-trip",
1357
+ "lakebase.pool-refresh"
1358
+ ],
1359
+ checks: () => [
1360
+ restrictedPrincipalCheck(),
1361
+ appHealthCheck(),
1362
+ lakebaseCredentialCheck(),
1363
+ lakebaseRoundTripCheck()
1364
+ ],
1365
+ requiredChecks: ["app"],
1366
+ requirements: [workspaceRequirement, authRequirement],
1367
+ docsUrl: `${DOCS}#existing-foundation-to-migrate-into-packs`,
1368
+ certificationScopes: [AZURE_SCOPE]
1369
+ });
1370
+ }
1371
+ function createFoundationTargetPacks() {
1372
+ return [
1373
+ createSqlDeltaFoundationPack(),
1374
+ createLakeflowFoundationPack(),
1375
+ createJobsCodeFoundationPack(),
1376
+ createUnityStorageFoundationPack(),
1377
+ createAppsOperationalFoundationPack()
1378
+ ];
1379
+ }
1380
+ var foundationTargetPacks = createFoundationTargetPacks();
1381
+ var DatabricksJobsAdapter = class {
1382
+ constructor(client) {
1383
+ this.client = client;
1384
+ }
1385
+ client;
1386
+ async submit(request) {
1387
+ validateJobGraph(request.tasks);
1388
+ const response = await this.client.post(
1389
+ "/api/2.1/jobs/runs/submit",
1390
+ request
1391
+ );
1392
+ if (!response.run_id) throw new Error("Databricks Jobs submit returned no run_id");
1393
+ return response.run_id;
1394
+ }
1395
+ async get(runId) {
1396
+ const raw = await this.client.get("/api/2.1/jobs/runs/get", {
1397
+ run_id: runId,
1398
+ include_history: true
1399
+ });
1400
+ return normalizeJobRun(runId, raw);
1401
+ }
1402
+ async wait(runId, options = {}) {
1403
+ const raw = await waitForDatabricksRun(this.client, runId, {
1404
+ timeoutMs: options.timeoutMs,
1405
+ pollIntervalMs: options.pollIntervalMs
1406
+ });
1407
+ return normalizeJobRun(runId, raw);
1408
+ }
1409
+ async cancel(runId) {
1410
+ await this.client.post("/api/2.1/jobs/runs/cancel", { run_id: runId });
1411
+ }
1412
+ async repair(runId, options = {}) {
1413
+ const response = await this.client.post("/api/2.1/jobs/runs/repair", {
1414
+ run_id: runId,
1415
+ ...options.latestRepairId ? { latest_repair_id: options.latestRepairId } : {},
1416
+ ...options.rerunTasks?.length ? { rerun_tasks: options.rerunTasks } : { rerun_all_failed_tasks: true }
1417
+ });
1418
+ if (!response.repair_id) throw new Error("Databricks Jobs repair returned no repair_id");
1419
+ return response.repair_id;
1420
+ }
1421
+ };
1422
+ function validateJobGraph(tasks) {
1423
+ if (tasks.length === 0) throw new Error("Jobs orchestration requires at least one task");
1424
+ const keys = /* @__PURE__ */ new Set();
1425
+ for (const task of tasks) {
1426
+ if (!/^[A-Za-z0-9_-]{1,100}$/.test(task.task_key)) {
1427
+ throw new Error(`Invalid task key '${task.task_key}'`);
1428
+ }
1429
+ if (keys.has(task.task_key)) throw new Error(`Duplicate task key '${task.task_key}'`);
1430
+ keys.add(task.task_key);
1431
+ }
1432
+ const edges = /* @__PURE__ */ new Map();
1433
+ for (const task of tasks) {
1434
+ const dependencies = (task.depends_on ?? []).map((dependency) => dependency.task_key);
1435
+ for (const dependency of dependencies) {
1436
+ if (!keys.has(dependency)) {
1437
+ throw new Error(`Task '${task.task_key}' depends on unknown task '${dependency}'`);
1438
+ }
1439
+ if (dependency === task.task_key) {
1440
+ throw new Error(`Task '${task.task_key}' cannot depend on itself`);
1441
+ }
1442
+ }
1443
+ edges.set(task.task_key, dependencies);
1444
+ }
1445
+ const visiting = /* @__PURE__ */ new Set();
1446
+ const visited = /* @__PURE__ */ new Set();
1447
+ const visit = (key) => {
1448
+ if (visiting.has(key)) throw new Error(`Jobs task graph contains a cycle at '${key}'`);
1449
+ if (visited.has(key)) return;
1450
+ visiting.add(key);
1451
+ for (const dependency of edges.get(key) ?? []) visit(dependency);
1452
+ visiting.delete(key);
1453
+ visited.add(key);
1454
+ };
1455
+ for (const key of keys) visit(key);
1456
+ }
1457
+ function jobsOrchestrationCheck() {
1458
+ return {
1459
+ id: "jobs-orchestration",
1460
+ description: "Lakeflow Jobs multi-task orchestration reaches expected task outcomes",
1461
+ configured: (env) => Boolean(env.DBX_TEST_JOBS_ORCHESTRATION_JSON),
1462
+ async run({ env, client }) {
1463
+ const configured = env.DBX_TEST_JOBS_ORCHESTRATION_JSON;
1464
+ if (!configured) throw new Error("DBX_TEST_JOBS_ORCHESTRATION_JSON is required");
1465
+ const spec = parseJobOrchestrationLiveSpec(configured);
1466
+ const adapter = new DatabricksJobsAdapter(client);
1467
+ const runId = await adapter.submit(spec.request);
1468
+ let run = await adapter.wait(runId, {
1469
+ timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 9e5),
1470
+ pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
1471
+ });
1472
+ if (spec.repairFailedTasks && run.resultState !== "SUCCESS") {
1473
+ const failed = run.tasks.filter((task) => task.resultState === "FAILED").map((task) => task.taskKey);
1474
+ await adapter.repair(runId, { rerunTasks: failed.length > 0 ? failed : void 0 });
1475
+ run = await adapter.wait(runId, {
1476
+ timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 9e5),
1477
+ pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
1478
+ });
1479
+ }
1480
+ const expectedResult = spec.expectedResult ?? "SUCCESS";
1481
+ if (run.resultState !== expectedResult) {
1482
+ throw new Error(
1483
+ `Job orchestration run ${runId} ended in ${run.resultState}, expected ${expectedResult}`
1484
+ );
1485
+ }
1486
+ for (const [taskKey, expected] of Object.entries(spec.expectedTasks ?? {})) {
1487
+ const task = run.tasks.find((candidate) => candidate.taskKey === taskKey);
1488
+ if (!task) throw new Error(`Job orchestration result did not include task '${taskKey}'`);
1489
+ if (task.resultState !== expected) {
1490
+ throw new Error(`Task '${taskKey}' ended in ${task.resultState}, expected ${expected}`);
1491
+ }
1492
+ }
1493
+ return {
1494
+ runId,
1495
+ resultState: run.resultState,
1496
+ tasks: run.tasks
1497
+ };
1498
+ }
1499
+ };
1500
+ }
1501
+ function parseJobOrchestrationLiveSpec(value) {
1502
+ let parsed;
1503
+ try {
1504
+ parsed = JSON.parse(value);
1505
+ } catch (error) {
1506
+ throw new Error(`DBX_TEST_JOBS_ORCHESTRATION_JSON is invalid JSON: ${String(error)}`);
1507
+ }
1508
+ if (!parsed || typeof parsed !== "object") {
1509
+ throw new Error("Jobs orchestration spec must be an object");
1510
+ }
1511
+ const spec = parsed;
1512
+ if (!spec.request || typeof spec.request !== "object" || !Array.isArray(spec.request.tasks)) {
1513
+ throw new Error("Jobs orchestration spec requires request.tasks");
1514
+ }
1515
+ validateJobGraph(spec.request.tasks);
1516
+ return spec;
1517
+ }
1518
+ function normalizeJobRun(fallbackRunId, raw) {
1519
+ const state = objectOf(raw.state);
1520
+ const tasks = Array.isArray(raw.tasks) ? raw.tasks.filter(
1521
+ (task) => Boolean(task && typeof task === "object")
1522
+ ).map((task) => {
1523
+ const taskState = objectOf(task.state);
1524
+ return {
1525
+ taskKey: String(task.task_key ?? "unknown"),
1526
+ ...Number.isFinite(Number(task.run_id)) ? { runId: Number(task.run_id) } : {},
1527
+ lifeCycleState: String(taskState.life_cycle_state ?? "UNKNOWN"),
1528
+ resultState: String(taskState.result_state ?? "UNKNOWN"),
1529
+ ...typeof taskState.state_message === "string" ? { stateMessage: taskState.state_message } : {}
1530
+ };
1531
+ }) : [];
1532
+ return {
1533
+ runId: Number(raw.run_id ?? fallbackRunId),
1534
+ lifeCycleState: String(state.life_cycle_state ?? "UNKNOWN"),
1535
+ resultState: String(state.result_state ?? "UNKNOWN"),
1536
+ tasks,
1537
+ raw
1538
+ };
1539
+ }
1540
+ function objectOf(value) {
1541
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
1542
+ }
1543
+
1544
+ // src/jobs-target-pack.ts
1545
+ function createLakeflowJobsTargetPack() {
1546
+ return defineTargetPack({
1547
+ id: "lakeflow-jobs",
1548
+ name: "Lakeflow Jobs orchestration",
1549
+ description: "Typed multi-task DAG, branch/loop, retry, cancellation, repair and task-outcome validation.",
1550
+ version: "0.1.0",
1551
+ maturity: "shipped",
1552
+ capabilities: [
1553
+ "jobs.multi-task-dag",
1554
+ "jobs.dependencies",
1555
+ "jobs.condition-task",
1556
+ "jobs.for-each-task",
1557
+ "jobs.retry",
1558
+ "jobs.cancel",
1559
+ "jobs.repair",
1560
+ "jobs.task-outcomes"
1561
+ ],
1562
+ checks: () => [restrictedPrincipalCheck(), jobRunCheck(), jobsOrchestrationCheck()],
1563
+ requiredChecks: ["jobs-orchestration"],
1564
+ requirements: [
1565
+ {
1566
+ id: "workspace",
1567
+ description: "Databricks workspace host",
1568
+ anyOf: ["DATABRICKS_HOST"]
1569
+ },
1570
+ {
1571
+ id: "authentication",
1572
+ description: "Databricks OAuth, OIDC, bearer, or PAT authentication",
1573
+ anyOf: [
1574
+ "DATABRICKS_BEARER",
1575
+ "DATABRICKS_TOKEN",
1576
+ "DATABRICKS_CLIENT_ID",
1577
+ "DATABRICKS_OIDC_TOKEN",
1578
+ "DATABRICKS_OIDC_TOKEN_FILEPATH"
1579
+ ],
1580
+ secret: true
1581
+ },
1582
+ {
1583
+ id: "orchestration-spec",
1584
+ description: "JSON multi-task orchestration scenario",
1585
+ anyOf: ["DBX_TEST_JOBS_ORCHESTRATION_JSON"]
1586
+ }
1587
+ ],
1588
+ docsUrl: "https://experiments.fabric.pro/docs/testing/target-packs/#pack-1--lakeflow-jobs-orchestration",
1589
+ certificationScopes: []
1590
+ });
1591
+ }
1592
+
1593
+ // src/builtin-packs.ts
1594
+ function createBuiltinTargetPacks() {
1595
+ return [...createFoundationTargetPacks(), createLakeflowJobsTargetPack()];
1596
+ }
1597
+ var builtinTargetPacks = createBuiltinTargetPacks();
1598
+
1599
+ export { DatabricksJobsAdapter, appHealthCheck, assertDeltaContract, autoLoaderIngestionCheck, backupRestoreCheck, builtinTargetPacks, classicComputeCheck, createAppsOperationalFoundationPack, createBuiltinTargetPacks, createEphemeralLakebaseBranch, createExecutionContext, createFoundationTargetPacks, createJobsCodeFoundationPack, createLakebaseTestProvider, createLakeflowFoundationPack, createLakeflowJobsTargetPack, createMockDatabricksClient, createSqlDeltaFoundationPack, createTargetPackRegistry, createUnityStorageFoundationPack, customLiveCheck, dbtBuildCheck, defineLiveSuite, defineTargetPack, defineTargetPackRun, deleteEphemeralLakebaseBranch, deleteVolumeFile, deltaContractCheck, doctorTargetPack, ensureVolumeDirectory, expectQueryToMatchGolden, expectTable, failureRecoveryCheck, foundationTargetPacks, jobRunCheck, jobsOrchestrationCheck, lakebaseCredentialCheck, lakebaseRoundTripCheck, normalizeJobRun, normalizeVolumeRoot, notebookSubmitCheck, parseJobOrchestrationLiveSpec, performanceBudgetCheck, pipelineRefreshCheck, renderJUnit, resolveLakebaseProject, resolveProfile, restrictedPrincipalCheck, rollbackCheck, runLiveSuite, runTargetPack, secretRotationCheck, secretScopeCheck, serverlessComputeCheck, sqlRoundTripCheck, toLakebaseBranchId, unityCatalogAccessCheck, uploadVolumeFile, validateJobGraph, volumeIOCheck, waitForPipelineUpdate };
1076
1600
  //# sourceMappingURL=index.js.map
1077
1601
  //# sourceMappingURL=index.js.map