dataiku-sdk 0.6.1 → 0.6.2

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.
@@ -282,6 +282,11 @@ export declare const FlowZoneItemSchema: import("@sinclair/typebox").TObject<{
282
282
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
283
283
  }>;
284
284
  export type FlowZoneItem = Static<typeof FlowZoneItemSchema>;
285
+ export declare const FlowZonePositionSchema: import("@sinclair/typebox").TObject<{
286
+ x: import("@sinclair/typebox").TNumber;
287
+ y: import("@sinclair/typebox").TNumber;
288
+ }>;
289
+ export type FlowZonePosition = Static<typeof FlowZonePositionSchema>;
285
290
  export declare const FlowZoneSchema: import("@sinclair/typebox").TObject<{
286
291
  id: import("@sinclair/typebox").TString;
287
292
  name: import("@sinclair/typebox").TString;
@@ -297,6 +302,10 @@ export declare const FlowZoneSchema: import("@sinclair/typebox").TObject<{
297
302
  objectType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"DATASET">, import("@sinclair/typebox").TLiteral<"MANAGED_FOLDER">, import("@sinclair/typebox").TLiteral<"SAVED_MODEL">, import("@sinclair/typebox").TLiteral<"RECIPE">, import("@sinclair/typebox").TLiteral<"MODEL_EVALUATION_STORE">, import("@sinclair/typebox").TLiteral<"STREAMING_ENDPOINT">, import("@sinclair/typebox").TLiteral<"LABELING_TASK">, import("@sinclair/typebox").TLiteral<"RETRIEVABLE_KNOWLEDGE">]>;
298
303
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
299
304
  }>>>;
305
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
306
+ x: import("@sinclair/typebox").TNumber;
307
+ y: import("@sinclair/typebox").TNumber;
308
+ }>>;
300
309
  }>;
301
310
  export type FlowZone = Static<typeof FlowZoneSchema>;
302
311
  export declare const FlowZoneArraySchema: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
@@ -314,17 +323,29 @@ export declare const FlowZoneArraySchema: import("@sinclair/typebox").TArray<imp
314
323
  objectType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"DATASET">, import("@sinclair/typebox").TLiteral<"MANAGED_FOLDER">, import("@sinclair/typebox").TLiteral<"SAVED_MODEL">, import("@sinclair/typebox").TLiteral<"RECIPE">, import("@sinclair/typebox").TLiteral<"MODEL_EVALUATION_STORE">, import("@sinclair/typebox").TLiteral<"STREAMING_ENDPOINT">, import("@sinclair/typebox").TLiteral<"LABELING_TASK">, import("@sinclair/typebox").TLiteral<"RETRIEVABLE_KNOWLEDGE">]>;
315
324
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
316
325
  }>>>;
326
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
327
+ x: import("@sinclair/typebox").TNumber;
328
+ y: import("@sinclair/typebox").TNumber;
329
+ }>>;
317
330
  }>>;
318
331
  export declare const FlowZoneCreateOptionsSchema: import("@sinclair/typebox").TObject<{
319
332
  name: import("@sinclair/typebox").TString;
320
333
  color: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
321
334
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
335
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
336
+ x: import("@sinclair/typebox").TNumber;
337
+ y: import("@sinclair/typebox").TNumber;
338
+ }>>;
322
339
  }>;
323
340
  export type FlowZoneCreateOptions = Static<typeof FlowZoneCreateOptionsSchema>;
324
341
  export declare const FlowZoneUpdateOptionsSchema: import("@sinclair/typebox").TObject<{
325
342
  name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
326
343
  color: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
327
344
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
345
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
346
+ x: import("@sinclair/typebox").TNumber;
347
+ y: import("@sinclair/typebox").TNumber;
348
+ }>>;
328
349
  }>;
329
350
  export type FlowZoneUpdateOptions = Static<typeof FlowZoneUpdateOptionsSchema>;
330
351
  export declare const FolderCreateOptionsSchema: import("@sinclair/typebox").TObject<{
@@ -340,6 +340,10 @@ export const FlowZoneItemSchema = Type.Object({
340
340
  objectType: FlowZoneObjectTypeSchema,
341
341
  projectKey: Type.Optional(Type.String()),
342
342
  }, { additionalProperties: true, });
343
+ export const FlowZonePositionSchema = Type.Object({
344
+ x: Type.Number(),
345
+ y: Type.Number(),
346
+ }, { additionalProperties: false, });
343
347
  export const FlowZoneSchema = Type.Object({
344
348
  id: Type.String(),
345
349
  name: Type.String(),
@@ -347,17 +351,20 @@ export const FlowZoneSchema = Type.Object({
347
351
  projectKey: Type.Optional(Type.String()),
348
352
  items: Type.Optional(Type.Array(FlowZoneItemSchema)),
349
353
  shared: Type.Optional(Type.Array(FlowZoneItemSchema)),
354
+ position: Type.Optional(FlowZonePositionSchema),
350
355
  }, { additionalProperties: true, });
351
356
  export const FlowZoneArraySchema = Type.Array(FlowZoneSchema);
352
357
  export const FlowZoneCreateOptionsSchema = Type.Object({
353
358
  name: Type.String(),
354
359
  color: Type.Optional(Type.String()),
355
360
  projectKey: Type.Optional(Type.String()),
361
+ position: Type.Optional(FlowZonePositionSchema),
356
362
  }, { additionalProperties: false, });
357
363
  export const FlowZoneUpdateOptionsSchema = Type.Object({
358
364
  name: Type.Optional(Type.String()),
359
365
  color: Type.Optional(Type.String()),
360
366
  projectKey: Type.Optional(Type.String()),
367
+ position: Type.Optional(FlowZonePositionSchema),
361
368
  }, { additionalProperties: false, });
362
369
  // ---------------------------------------------------------------------------
363
370
  // Folders
package/dist/src/cli.js CHANGED
@@ -340,6 +340,336 @@ function flowZoneDetailSummary(zone) {
340
340
  items: flowZoneItems(zone),
341
341
  };
342
342
  }
343
+ function optionalStringField(record, keys) {
344
+ for (const key of keys) {
345
+ const value = record[key];
346
+ if (typeof value === "string" && value.trim().length > 0)
347
+ return value.trim();
348
+ }
349
+ return undefined;
350
+ }
351
+ function requiredStringArray(value, source) {
352
+ if (!Array.isArray(value)) {
353
+ throw new UsageError(`${source} must be an array of strings.`, "validation_failed");
354
+ }
355
+ return value.map((item, index) => {
356
+ if (typeof item !== "string" || item.trim().length === 0) {
357
+ throw new UsageError(`${source}[${index}] must be a non-empty string.`, "validation_failed");
358
+ }
359
+ return item.trim();
360
+ });
361
+ }
362
+ function finiteNumberField(record, key, source) {
363
+ const value = record[key];
364
+ if (typeof value !== "number" || !Number.isFinite(value)) {
365
+ throw new UsageError(`${source}.${key} must be a finite number.`, "validation_failed");
366
+ }
367
+ return value;
368
+ }
369
+ function flowZonePlanColor(value, source) {
370
+ if (value === undefined)
371
+ return undefined;
372
+ if (typeof value !== "string" || !/^#[0-9a-fA-F]{6}$/.test(value.trim())) {
373
+ throw new UsageError(`${source} must be a hex color like #2ab1ac.`, "validation_failed");
374
+ }
375
+ return value.trim();
376
+ }
377
+ function flowZonePlanPosition(value, source) {
378
+ if (value === undefined)
379
+ return undefined;
380
+ const record = plainRecord(value);
381
+ if (!record) {
382
+ throw new UsageError(`${source} must be an object with x and y.`, "validation_failed");
383
+ }
384
+ return {
385
+ x: finiteNumberField(record, "x", source),
386
+ y: finiteNumberField(record, "y", source),
387
+ };
388
+ }
389
+ function flowZoneCurrentPosition(zone) {
390
+ const record = zone;
391
+ const position = plainRecord(record.position);
392
+ if (!position)
393
+ return undefined;
394
+ const x = position.x;
395
+ const y = position.y;
396
+ return typeof x === "number" && Number.isFinite(x) && typeof y === "number" && Number.isFinite(y)
397
+ ? { x, y, }
398
+ : undefined;
399
+ }
400
+ function flowZoneSamePosition(a, b) {
401
+ if (a === undefined || b === undefined)
402
+ return a === b;
403
+ return a.x === b.x && a.y === b.y;
404
+ }
405
+ function parseFlowZonePlanItem(value, source) {
406
+ if (typeof value === "string")
407
+ return parseFlowZoneObject(value);
408
+ const record = plainRecord(value);
409
+ if (!record) {
410
+ throw new UsageError(`${source} must be TYPE:ID or an object.`, "validation_failed");
411
+ }
412
+ const object = optionalStringField(record, ["object",]);
413
+ if (object)
414
+ return parseFlowZoneObject(object);
415
+ const objectType = optionalStringField(record, ["objectType", "type",]);
416
+ const objectId = optionalStringField(record, ["objectId", "id", "name",]);
417
+ if (!objectType || !objectId) {
418
+ throw new UsageError(`${source} must include objectType/type and objectId/id, or object as TYPE:ID.`, "validation_failed");
419
+ }
420
+ const projectKey = optionalStringField(record, ["projectKey", "project",]);
421
+ return {
422
+ objectType: flowZoneObjectType(objectType),
423
+ objectId,
424
+ ...(projectKey ? { projectKey, } : {}),
425
+ };
426
+ }
427
+ function addFlowZonePlanTypedItems(items, record, key, objectType, source) {
428
+ if (record[key] === undefined)
429
+ return;
430
+ for (const objectId of requiredStringArray(record[key], `${source}.${key}`)) {
431
+ items.push({ objectType, objectId, });
432
+ }
433
+ }
434
+ function flowZoneItemKey(item) {
435
+ return `${item.projectKey ?? ""}\0${item.objectType}\0${item.objectId}`;
436
+ }
437
+ function flowZonePlanLabel(plan) {
438
+ return plan.id ?? plan.name ?? "<unknown>";
439
+ }
440
+ function dedupeFlowZonePlanItems(items) {
441
+ const seen = new Set();
442
+ const result = [];
443
+ for (const item of items) {
444
+ const key = flowZoneItemKey(item);
445
+ if (seen.has(key))
446
+ continue;
447
+ seen.add(key);
448
+ result.push(item);
449
+ }
450
+ return result;
451
+ }
452
+ function flowZonePlanItemKeys(plan) {
453
+ const keys = new Set();
454
+ for (const zone of plan.zones) {
455
+ for (const item of zone.items)
456
+ keys.add(flowZoneItemKey(item));
457
+ }
458
+ return keys;
459
+ }
460
+ function validateUniqueFlowZoneAssignments(plan) {
461
+ const seen = new Map();
462
+ for (const zone of plan.zones) {
463
+ const label = flowZonePlanLabel(zone);
464
+ for (const item of zone.items) {
465
+ const key = flowZoneItemKey(item);
466
+ const previous = seen.get(key);
467
+ if (previous) {
468
+ throw new UsageError(`Flow object ${item.objectType}:${item.objectId} is assigned to both "${previous}" and "${label}".`, "validation_failed");
469
+ }
470
+ seen.set(key, label);
471
+ }
472
+ }
473
+ }
474
+ function parseFlowZoneOrganizePlan(input) {
475
+ const zones = input.zones;
476
+ if (!Array.isArray(zones) || zones.length === 0) {
477
+ throw new UsageError("Flow zone organize plan must include a non-empty zones array.", "validation_failed");
478
+ }
479
+ const plan = {
480
+ zones: zones.map((value, index) => {
481
+ const source = `zones[${index}]`;
482
+ const record = plainRecord(value);
483
+ if (!record)
484
+ throw new UsageError(`${source} must be an object.`, "validation_failed");
485
+ const id = optionalStringField(record, ["id", "zoneId",]);
486
+ const name = optionalStringField(record, ["name",]);
487
+ if (!id && !name) {
488
+ throw new UsageError(`${source} must include name or id.`, "validation_failed");
489
+ }
490
+ const items = [];
491
+ const rawItems = record.items ?? record.objects;
492
+ if (rawItems !== undefined) {
493
+ if (!Array.isArray(rawItems)) {
494
+ throw new UsageError(`${source}.items must be an array.`, "validation_failed");
495
+ }
496
+ rawItems.forEach((item, itemIndex) => {
497
+ items.push(parseFlowZonePlanItem(item, `${source}.items[${itemIndex}]`));
498
+ });
499
+ }
500
+ addFlowZonePlanTypedItems(items, record, "datasets", "DATASET", source);
501
+ addFlowZonePlanTypedItems(items, record, "recipes", "RECIPE", source);
502
+ addFlowZonePlanTypedItems(items, record, "folders", "MANAGED_FOLDER", source);
503
+ addFlowZonePlanTypedItems(items, record, "savedModels", "SAVED_MODEL", source);
504
+ addFlowZonePlanTypedItems(items, record, "modelEvaluationStores", "MODEL_EVALUATION_STORE", source);
505
+ addFlowZonePlanTypedItems(items, record, "streamingEndpoints", "STREAMING_ENDPOINT", source);
506
+ addFlowZonePlanTypedItems(items, record, "labelingTasks", "LABELING_TASK", source);
507
+ addFlowZonePlanTypedItems(items, record, "knowledgeBanks", "RETRIEVABLE_KNOWLEDGE", source);
508
+ return {
509
+ ...(id ? { id, } : {}),
510
+ ...(name ? { name, } : {}),
511
+ ...(record.color !== undefined
512
+ ? { color: flowZonePlanColor(record.color, `${source}.color`), }
513
+ : {}),
514
+ ...(record.position !== undefined
515
+ ? { position: flowZonePlanPosition(record.position, `${source}.position`), }
516
+ : {}),
517
+ items: dedupeFlowZonePlanItems(items),
518
+ };
519
+ }),
520
+ };
521
+ validateUniqueFlowZoneAssignments(plan);
522
+ return plan;
523
+ }
524
+ function readFlowZoneOrganizePlan(flags, usage) {
525
+ const data = typeof flags["file"] === "string"
526
+ ? parseJsonObject(readFileSync(flags["file"], "utf-8"), flags["file"])
527
+ : jsonInput(flags);
528
+ if (!data) {
529
+ throw new UsageError(`--data, --data-file, --file, or --stdin is required. Usage: ${usage}`, "missing_required_flag");
530
+ }
531
+ return parseFlowZoneOrganizePlan(data);
532
+ }
533
+ function findFlowZoneForPlan(zones, plan) {
534
+ if (plan.id) {
535
+ const byId = zones.find((zone) => zone.id === plan.id);
536
+ if (byId)
537
+ return byId;
538
+ }
539
+ if (!plan.name)
540
+ return undefined;
541
+ const byName = zones.filter((zone) => zone.name === plan.name);
542
+ if (byName.length > 1) {
543
+ throw new UsageError(`Multiple flow zones named "${plan.name}" exist; use id.`, "validation_failed");
544
+ }
545
+ return byName[0];
546
+ }
547
+ function ensureFlowZonePlanTarget(plan, existing) {
548
+ if (existing || plan.name)
549
+ return;
550
+ throw new UsageError(`Flow zone ${plan.id ?? "<unknown>"} was not found and cannot be created without name.`, "validation_failed");
551
+ }
552
+ function flowZoneExplicitItems(zone) {
553
+ return (zone.items ?? []).map((item) => ({
554
+ objectId: item.objectId,
555
+ objectType: item.objectType,
556
+ ...(item.projectKey ? { projectKey: item.projectKey, } : {}),
557
+ }));
558
+ }
559
+ function flowZonePruneItems(existing, plannedItemKeys) {
560
+ if (!existing)
561
+ return [];
562
+ return flowZoneExplicitItems(existing).filter((item) => !plannedItemKeys.has(flowZoneItemKey(item)));
563
+ }
564
+ function flowZoneOrganizeStep(plan, existing, sync, plannedItemKeys) {
565
+ ensureFlowZonePlanTarget(plan, existing);
566
+ const update = {};
567
+ if (existing && plan.name && plan.name !== existing.name)
568
+ update.name = plan.name;
569
+ if (existing && plan.color && plan.color !== existing.color)
570
+ update.color = plan.color;
571
+ if (existing && plan.position !== undefined
572
+ && !flowZoneSamePosition(flowZoneCurrentPosition(existing), plan.position)) {
573
+ update.position = plan.position;
574
+ }
575
+ const pruneItems = sync ? flowZonePruneItems(existing, plannedItemKeys) : [];
576
+ return {
577
+ target: {
578
+ ...(plan.id ? { id: plan.id, } : {}),
579
+ ...(plan.name ? { name: plan.name, } : {}),
580
+ ...(plan.color ? { color: plan.color, } : {}),
581
+ ...(plan.position ? { position: plan.position, } : {}),
582
+ },
583
+ ...(existing ? { existing: flowZoneSummary(existing), } : { create: true, }),
584
+ ...(Object.keys(update).length > 0 ? { update, } : {}),
585
+ moveItems: plan.items,
586
+ ...(pruneItems.length > 0 ? { pruneItems, } : {}),
587
+ };
588
+ }
589
+ function flowZoneValidationBucket(index, objectType) {
590
+ switch (objectType) {
591
+ case "DATASET":
592
+ return index.datasets;
593
+ case "RECIPE":
594
+ return index.recipes;
595
+ case "MANAGED_FOLDER":
596
+ return index.folders;
597
+ case "SAVED_MODEL":
598
+ case "MODEL_EVALUATION_STORE":
599
+ case "STREAMING_ENDPOINT":
600
+ case "LABELING_TASK":
601
+ case "RETRIEVABLE_KNOWLEDGE":
602
+ return index.all;
603
+ }
604
+ }
605
+ async function flowZoneValidationIndex(client, projectKey) {
606
+ const result = await client.projects.map({
607
+ projectKey,
608
+ maxNodes: 100_000,
609
+ maxEdges: 100_000,
610
+ });
611
+ const index = {
612
+ projectKey: result.map.projectKey,
613
+ all: new Set(),
614
+ datasets: new Set(),
615
+ recipes: new Set(),
616
+ folders: new Set(),
617
+ };
618
+ for (const node of result.map.nodes) {
619
+ index.all.add(node.id);
620
+ switch (node.kind) {
621
+ case "dataset":
622
+ index.datasets.add(node.id);
623
+ break;
624
+ case "recipe":
625
+ index.recipes.add(node.id);
626
+ break;
627
+ case "folder":
628
+ index.folders.add(node.id);
629
+ break;
630
+ case "other":
631
+ break;
632
+ }
633
+ }
634
+ return index;
635
+ }
636
+ async function validateFlowZoneOrganizeObjects(client, plan, projectKey) {
637
+ const indexes = new Map();
638
+ const missing = [];
639
+ const getIndex = async (itemProjectKey) => {
640
+ const requestedProjectKey = itemProjectKey ?? projectKey;
641
+ const cacheKey = requestedProjectKey ?? "";
642
+ const cached = indexes.get(cacheKey);
643
+ if (cached)
644
+ return cached;
645
+ const index = await flowZoneValidationIndex(client, requestedProjectKey);
646
+ indexes.set(cacheKey, index);
647
+ return index;
648
+ };
649
+ for (const zone of plan.zones) {
650
+ for (const item of zone.items) {
651
+ const index = await getIndex(item.projectKey);
652
+ const bucket = flowZoneValidationBucket(index, item.objectType);
653
+ if (bucket.has(item.objectId))
654
+ continue;
655
+ missing.push({
656
+ zone: flowZonePlanLabel(zone),
657
+ objectId: item.objectId,
658
+ objectType: item.objectType,
659
+ ...(item.projectKey ? { projectKey: item.projectKey, } : {}),
660
+ reason: `Object not found in project ${item.projectKey ?? index.projectKey}.`,
661
+ });
662
+ }
663
+ }
664
+ return { valid: missing.length === 0, missing, };
665
+ }
666
+ function throwFlowZoneValidationError(validation) {
667
+ if (validation.valid)
668
+ return;
669
+ const first = validation.missing[0];
670
+ const suffix = validation.missing.length > 1 ? ` and ${validation.missing.length - 1} more` : "";
671
+ throw new UsageError(`Flow zone organize validation failed: ${first?.objectType}:${first?.objectId} in zone "${first?.zone}" was not found${suffix}.`, "validation_failed");
672
+ }
343
673
  async function resolveFlowZoneIdFromFlags(client, flags, projectKey) {
344
674
  const zoneId = typeof flags["zone-id"] === "string" ? flags["zone-id"].trim() : "";
345
675
  if (zoneId)
@@ -713,7 +1043,7 @@ function resolveSqlInput(args, flags) {
713
1043
  if (sources.length > 1) {
714
1044
  throw new UsageError(`Choose exactly one SQL input source: --sql, --sql-file, --stdin, or one positional SQL argument. Usage: ${SQL_QUERY_USAGE}`);
715
1045
  }
716
- const query = sources[0].read();
1046
+ const query = stripUtf8Bom(sources[0].read());
717
1047
  if (query.trim().length === 0) {
718
1048
  throw new UsageError(`SQL input from ${sources[0].label} must not be empty. Usage: ${SQL_QUERY_USAGE}`);
719
1049
  }
@@ -1040,6 +1370,8 @@ const BOOLEAN_FLAGS = new Set([
1040
1370
  "no-backup",
1041
1371
  "payload-only",
1042
1372
  "allow-same-path",
1373
+ "sync",
1374
+ "validate-objects",
1043
1375
  ]);
1044
1376
  const SHORT_FLAGS = {
1045
1377
  h: "help",
@@ -2097,6 +2429,110 @@ const commands = {
2097
2429
  "dss flow-zone move ZONE_ID --object SAVED_MODEL:model_id",
2098
2430
  ],
2099
2431
  },
2432
+ organize: {
2433
+ handler: async (c, _a, f) => {
2434
+ const usage = "dss flow-zone organize (--data JSON|--data-file PATH|--file PATH|--stdin) [--sync] [--validate-objects] [--dry-run] [--project-key KEY]";
2435
+ const pk = f["project-key"];
2436
+ const plan = readFlowZoneOrganizePlan(f, usage);
2437
+ const sync = f["sync"] === true;
2438
+ const validateObjects = f["validate-objects"] === true;
2439
+ const zones = await c.flowZones.list(pk);
2440
+ const plannedItemKeys = flowZonePlanItemKeys(plan);
2441
+ const planned = plan.zones.map((zonePlan) => flowZoneOrganizeStep(zonePlan, findFlowZoneForPlan(zones, zonePlan), sync, plannedItemKeys));
2442
+ const validation = validateObjects
2443
+ ? await validateFlowZoneOrganizeObjects(c, plan, pk)
2444
+ : undefined;
2445
+ if (validation)
2446
+ throwFlowZoneValidationError(validation);
2447
+ const itemCount = plan.zones.reduce((count, zonePlan) => count + zonePlan.items.length, 0);
2448
+ const pruneItemCount = planned.reduce((count, step) => {
2449
+ const pruneItems = Array.isArray(step.pruneItems) ? step.pruneItems : [];
2450
+ return count + pruneItems.length;
2451
+ }, 0);
2452
+ if (f["dry-run"] === true) {
2453
+ return {
2454
+ dryRun: true,
2455
+ action: "organize",
2456
+ resource: "flow-zone",
2457
+ projectKey: pk,
2458
+ sync,
2459
+ validateObjects,
2460
+ zoneCount: plan.zones.length,
2461
+ itemCount,
2462
+ pruneItemCount,
2463
+ ...(validation ? { validation, } : {}),
2464
+ planned,
2465
+ };
2466
+ }
2467
+ const currentZones = [...zones,];
2468
+ const created = [];
2469
+ const updated = [];
2470
+ const moved = [];
2471
+ const pruned = [];
2472
+ for (const zonePlan of plan.zones) {
2473
+ let zone = findFlowZoneForPlan(currentZones, zonePlan);
2474
+ ensureFlowZonePlanTarget(zonePlan, zone);
2475
+ const pruneItems = sync ? flowZonePruneItems(zone, plannedItemKeys) : [];
2476
+ if (!zone) {
2477
+ zone = await c.flowZones.create({
2478
+ name: zonePlan.name,
2479
+ color: zonePlan.color,
2480
+ position: zonePlan.position,
2481
+ projectKey: pk,
2482
+ });
2483
+ currentZones.push(zone);
2484
+ created.push(zone);
2485
+ }
2486
+ else {
2487
+ const patch = {
2488
+ ...(zonePlan.name && zonePlan.name !== zone.name ? { name: zonePlan.name, } : {}),
2489
+ ...(zonePlan.color && zonePlan.color !== zone.color ? { color: zonePlan.color, } : {}),
2490
+ ...(zonePlan.position !== undefined
2491
+ && !flowZoneSamePosition(flowZoneCurrentPosition(zone), zonePlan.position)
2492
+ ? { position: zonePlan.position, }
2493
+ : {}),
2494
+ projectKey: pk,
2495
+ };
2496
+ if (patch.name !== undefined || patch.color !== undefined || patch.position !== undefined) {
2497
+ zone = await c.flowZones.update(zone.id, patch);
2498
+ const index = currentZones.findIndex((candidate) => candidate.id === zone.id);
2499
+ if (index !== -1)
2500
+ currentZones[index] = zone;
2501
+ updated.push(zone);
2502
+ }
2503
+ }
2504
+ if (zonePlan.items.length > 0) {
2505
+ await c.flowZones.moveItems(zone.id, zonePlan.items, pk);
2506
+ moved.push({ zoneId: zone.id, name: zone.name, items: zonePlan.items, });
2507
+ }
2508
+ if (pruneItems.length > 0) {
2509
+ await c.flowZones.moveItems("default", pruneItems, pk);
2510
+ pruned.push({ zoneId: "default", fromZoneId: zone.id, name: zone.name, items: pruneItems, });
2511
+ }
2512
+ }
2513
+ return {
2514
+ organized: true,
2515
+ action: "organize",
2516
+ resource: "flow-zone",
2517
+ projectKey: pk,
2518
+ sync,
2519
+ validateObjects,
2520
+ zoneCount: plan.zones.length,
2521
+ itemCount,
2522
+ pruneItemCount,
2523
+ created,
2524
+ updated,
2525
+ moved,
2526
+ pruned,
2527
+ };
2528
+ },
2529
+ usage: "dss flow-zone organize (--data JSON|--data-file PATH|--file PATH|--stdin) [--sync] [--validate-objects] [--dry-run] [--project-key KEY]",
2530
+ description: "Create/update flow zones and move objects from a declarative visual organization plan.",
2531
+ examples: [
2532
+ "dss flow-zone organize --file flow-zones.json --dry-run",
2533
+ `dss flow-zone organize --data '{"zones":[{"name":"Raw","color":"#64748b","datasets":["raw_orders"]}]}'`,
2534
+ ],
2535
+ },
2100
2536
  graph: {
2101
2537
  handler: (c, a, f) => {
2102
2538
  requireArgs(a, 1, "dss flow-zone graph <id>");
@@ -19,9 +19,9 @@ export { normalizeScenarioUpdateData, SCENARIO_CANONICAL_EDITABLE_FIELDS, type S
19
19
  export { SqlResource, } from "./resources/sql.js";
20
20
  export { VariablesResource, } from "./resources/variables.js";
21
21
  export { WikiResource, } from "./resources/wiki.js";
22
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "./schemas.js";
22
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "./schemas.js";
23
23
  export type { SafeParseResult, } from "./schemas.js";
24
- export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, ScenarioDetails, ScenarioStatus, ScenarioSummary, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "./schemas.js";
24
+ export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZonePosition, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, ScenarioDetails, ScenarioStatus, ScenarioSummary, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "./schemas.js";
25
25
  export { deepMerge, } from "./utils/deep-merge.js";
26
26
  export { type NormalizedFlowEdge, type NormalizedFlowMap, type NormalizedFlowNode, normalizeFlowGraph, } from "./utils/flow-map.js";
27
27
  export { sanitizeFileName, } from "./utils/sanitize.js";
package/dist/src/index.js CHANGED
@@ -24,7 +24,7 @@ export { SqlResource, } from "./resources/sql.js";
24
24
  export { VariablesResource, } from "./resources/variables.js";
25
25
  export { WikiResource, } from "./resources/wiki.js";
26
26
  // Schemas (TypeBox schema objects for runtime validation)
27
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "./schemas.js";
27
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "./schemas.js";
28
28
  // Utilities
29
29
  export { deepMerge, } from "./utils/deep-merge.js";
30
30
  export { normalizeFlowGraph, } from "./utils/flow-map.js";
@@ -306,9 +306,31 @@ function buildDatasetCreateBody(opts) {
306
306
  managed: opts.managed ?? true,
307
307
  };
308
308
  }
309
+ const DATASET_CLONE_PARAM_KEYS = [
310
+ "connection",
311
+ "path",
312
+ "table",
313
+ "schema",
314
+ "catalog",
315
+ "folderSmartId",
316
+ "metastoreTableName",
317
+ "mode",
318
+ ];
319
+ function cloneDatasetParams(params) {
320
+ const sourceParams = params && typeof params === "object" && !Array.isArray(params)
321
+ ? params
322
+ : {};
323
+ const cloned = {};
324
+ for (const key of DATASET_CLONE_PARAM_KEYS) {
325
+ const value = sourceParams[key];
326
+ if (value !== undefined)
327
+ cloned[key] = value;
328
+ }
329
+ return cloned;
330
+ }
309
331
  export function buildDatasetCloneSettings(source, targetName, projectKey, opts) {
310
332
  const params = {
311
- ...source.params,
333
+ ...cloneDatasetParams(source.params),
312
334
  ...(opts.path !== undefined ? { path: opts.path, } : {}),
313
335
  ...(opts.table !== undefined ? { table: opts.table, mode: "table", } : {}),
314
336
  ...(opts.metastoreTableName !== undefined
@@ -12,7 +12,7 @@ export declare class FlowZonesResource extends BaseResource {
12
12
  get(zoneId: string, projectKey?: string): Promise<FlowZone>;
13
13
  /** Create a flow zone. */
14
14
  create(opts: FlowZoneCreateOptions): Promise<FlowZone>;
15
- /** Update flow zone settings such as name and color. */
15
+ /** Update flow zone settings such as name, color, and manual position. */
16
16
  update(zoneId: string, opts: FlowZoneUpdateOptions): Promise<FlowZone>;
17
17
  /** Delete a flow zone. DSS moves its items back to the default zone. */
18
18
  delete(zoneId: string, projectKey?: string): Promise<void>;
@@ -24,15 +24,17 @@ export class FlowZonesResource extends BaseResource {
24
24
  const raw = await this.client.post(`/public/api/projects/${this.enc(opts.projectKey)}/flow/zones`, {
25
25
  name: opts.name,
26
26
  color: opts.color ?? "#2ab1ac",
27
+ ...(opts.position !== undefined ? { position: opts.position, } : {}),
27
28
  });
28
29
  return this.client.safeParse(FlowZoneSchema, raw, "flowZones.create");
29
30
  }
30
- /** Update flow zone settings such as name and color. */
31
+ /** Update flow zone settings such as name, color, and manual position. */
31
32
  async update(zoneId, opts) {
32
33
  const current = await this.get(zoneId, opts.projectKey);
33
34
  const merged = deepMerge(current, {
34
35
  ...(opts.name !== undefined ? { name: opts.name, } : {}),
35
36
  ...(opts.color !== undefined ? { color: opts.color, } : {}),
37
+ ...(opts.position !== undefined ? { position: opts.position, } : {}),
36
38
  });
37
39
  await this.client.putVoid(`/public/api/projects/${this.enc(opts.projectKey)}/flow/zones/${encodeURIComponent(zoneId)}`, merged);
38
40
  return this.get(zoneId, opts.projectKey);
@@ -53,6 +53,7 @@ export interface RecipeCloneOptions {
53
53
  copyOutputSettings?: boolean;
54
54
  outputPath?: string;
55
55
  metastoreTableName?: string;
56
+ recipeType?: string;
56
57
  }
57
58
  export interface RecipeCloneResult {
58
59
  sourceRecipeName: string;
@@ -108,7 +108,28 @@ function rewriteRefs(value, rewrites) {
108
108
  function escapedRegExp(value) {
109
109
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
110
110
  }
111
- function rewritePayload(payload, rewrites, payloadTextRewrites = {}) {
111
+ function isSqlRecipeType(recipeType) {
112
+ return typeof recipeType === "string" && recipeType.toLowerCase().includes("sql");
113
+ }
114
+ function rewriteSqlTableReferences(payload, rewrites) {
115
+ let next = payload;
116
+ for (const [from, to,] of Object.entries(rewrites)) {
117
+ if (!from)
118
+ continue;
119
+ const escaped = escapedRegExp(from);
120
+ const pattern = new RegExp(String
121
+ .raw `\b(FROM|JOIN)(\s+)(?:(["\`])${escaped}\3|(\[)${escaped}\]|${escaped})(?![A-Za-z0-9_.])`, "gi");
122
+ next = next.replace(pattern, (_match, keyword, space, quote, bracket) => {
123
+ if (quote)
124
+ return `${keyword}${space}${quote}${to}${quote}`;
125
+ if (bracket)
126
+ return `${keyword}${space}[${to}]`;
127
+ return `${keyword}${space}${to}`;
128
+ });
129
+ }
130
+ return next;
131
+ }
132
+ function rewritePayload(payload, rewrites, payloadTextRewrites = {}, recipeType) {
112
133
  if (payload === undefined
113
134
  || (Object.keys(rewrites).length === 0 && Object.keys(payloadTextRewrites).length === 0)) {
114
135
  return payload;
@@ -120,6 +141,9 @@ function rewritePayload(payload, rewrites, payloadTextRewrites = {}) {
120
141
  const escaped = escapedRegExp(from);
121
142
  next = next.replace(new RegExp(`\\bdataiku\\.(Dataset|Folder)\\(\\s*(['"])${escaped}\\2\\s*\\)`, "g"), (_match, kind, quote) => `dataiku.${kind}(${quote}${to}${quote})`);
122
143
  }
144
+ if (isSqlRecipeType(recipeType)) {
145
+ next = rewriteSqlTableReferences(next, rewrites);
146
+ }
123
147
  for (const [from, to,] of Object.entries(payloadTextRewrites)) {
124
148
  if (from.length > 0)
125
149
  next = next.split(from).join(to);
@@ -647,7 +671,7 @@ export class RecipesResource extends BaseResource {
647
671
  if (opts.payloadTextRewrites)
648
672
  Object.assign(payloadTextRewrites, opts.payloadTextRewrites);
649
673
  const recipe = cloneRecipeDefinition(source.recipe, opts.name, pk, graphRewrites);
650
- const payload = rewritePayload(source.payload, payloadRewrites, payloadTextRewrites);
674
+ const payload = rewritePayload(source.payload, payloadRewrites, payloadTextRewrites, opts.recipeType ?? source.recipe.type);
651
675
  const copiedOutputDatasets = [];
652
676
  if (opts.copyOutputSettings) {
653
677
  for (const [from, to,] of Object.entries(outputRewrites)) {
@@ -3,5 +3,5 @@
3
3
  * The types package (packages/types/) owns the TypeBox schema definitions.
4
4
  * SDK consumers get everything through this re-export.
5
5
  */
6
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
7
- export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, SafeParseResult, ScenarioDetails, ScenarioStatus, ScenarioSummary, ScenarioWaitResult, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "../packages/types/src/index.js";
6
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
7
+ export type { BuildMode, CodeEnvActionResult, CodeEnvCreateOptions, CodeEnvDetails, CodeEnvPackageList, CodeEnvSetPackagesOptions, CodeEnvSummary, CodeEnvUpdatePackagesOptions, CodeEnvUsage, CodeEnvWaitOptions, ConnectionSummary, DashboardDetails, DashboardSummary, DataQualityComputeResult, DataQualityProjectStatus, DataQualityRule, DataQualityRuleResult, DataQualityRules, DataQualityStatus, DataQualityStatusByPartition, DataQualityTimeline, DataQualityTimelineEntry, DatasetCreateOptions, DatasetDetails, DatasetSchema, DatasetSummary, FlowMapOptions, FlowZone, FlowZoneCreateOptions, FlowZoneItem, FlowZoneObjectType, FlowZonePosition, FlowZoneUpdateOptions, FolderCreateOptions, FolderDetails, FolderItem, FolderSummary, FutureState, FutureWaitResult, InsightDetails, InsightSummary, JobSummary, JobWaitResult, JupyterCell, JupyterNotebookContent, JupyterNotebookSummary, NotebookSession, ProjectDetails, ProjectMetadata, ProjectSummary, ProjectVariables, RecipeCreateOptions, RecipeCreateResult, RecipeDetails, RecipeSummary, SafeParseResult, ScenarioDetails, ScenarioStatus, ScenarioSummary, ScenarioWaitResult, SqlNotebookCell, SqlNotebookContent, SqlNotebookSummary, SqlQueryResponse, SqlQueryResult, SqlQuerySchema, WikiArticleData, WikiArticleMetadata, WikiSettings, WikiTaxonomyNode, } from "../packages/types/src/index.js";
@@ -3,4 +3,4 @@
3
3
  * The types package (packages/types/) owns the TypeBox schema definitions.
4
4
  * SDK consumers get everything through this re-export.
5
5
  */
6
- export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
6
+ export { BuildModeSchema, CodeEnvActionResultSchema, CodeEnvCreateOptionsSchema, CodeEnvDetailsSchema, CodeEnvPackageListSchema, CodeEnvSetPackagesOptionsSchema, CodeEnvSummaryArraySchema, CodeEnvSummarySchema, CodeEnvUpdatePackagesOptionsSchema, CodeEnvUsageArraySchema, CodeEnvWaitOptionsSchema, ConnectionSummarySchema, DashboardDetailsSchema, DashboardSummaryArraySchema, DashboardSummarySchema, DataQualityComputeResultSchema, DataQualityProjectStatusSchema, DataQualityRuleArraySchema, DataQualityRuleResultArraySchema, DataQualityRuleResultSchema, DataQualityRuleSchema, DataQualityRulesSchema, DataQualityStatusByPartitionSchema, DataQualityStatusSchema, DataQualityTimelineEntrySchema, DataQualityTimelineSchema, DatasetCreateOptionsSchema, DatasetDetailsSchema, DatasetSchemaSchema, DatasetSummaryArraySchema, DatasetSummarySchema, FlowMapOptionsSchema, FlowZoneArraySchema, FlowZoneCreateOptionsSchema, FlowZoneItemSchema, FlowZoneObjectTypeSchema, FlowZonePositionSchema, FlowZoneSchema, FlowZoneUpdateOptionsSchema, FolderCreateOptionsSchema, FolderDetailsSchema, FolderItemArraySchema, FolderItemSchema, FolderSummaryArraySchema, FolderSummarySchema, FutureStateSchema, FutureWaitResultSchema, InsightDetailsSchema, InsightSummaryArraySchema, InsightSummarySchema, JobSummaryArraySchema, JobSummarySchema, JobWaitResultSchema, JupyterCellSchema, JupyterNotebookContentSchema, JupyterNotebookSummaryArraySchema, JupyterNotebookSummarySchema, NotebookSessionArraySchema, NotebookSessionSchema, parseSchema, ProjectDetailsSchema, ProjectMetadataSchema, ProjectSummaryArraySchema, ProjectSummarySchema, ProjectVariablesSchema, RecipeCreateOptionsSchema, RecipeCreateResultSchema, RecipeDetailsSchema, RecipeSummaryArraySchema, RecipeSummarySchema, safeParseSchema, ScenarioDetailsSchema, ScenarioStatusSchema, ScenarioSummaryArraySchema, ScenarioSummarySchema, ScenarioWaitResultSchema, SqlNotebookCellSchema, SqlNotebookContentSchema, SqlNotebookSummaryArraySchema, SqlNotebookSummarySchema, SqlQueryResponseSchema, SqlQueryResultSchema, SqlQuerySchemaSchema, WikiArticleDataArraySchema, WikiArticleDataSchema, WikiArticleMetadataSchema, WikiSettingsSchema, WikiTaxonomyNodeSchema, } from "../packages/types/src/index.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dataiku-sdk",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "Dataiku DSS SDK and CLI for programmatic access to DSS REST APIs",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -282,6 +282,11 @@ export declare const FlowZoneItemSchema: import("@sinclair/typebox").TObject<{
282
282
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
283
283
  }>;
284
284
  export type FlowZoneItem = Static<typeof FlowZoneItemSchema>;
285
+ export declare const FlowZonePositionSchema: import("@sinclair/typebox").TObject<{
286
+ x: import("@sinclair/typebox").TNumber;
287
+ y: import("@sinclair/typebox").TNumber;
288
+ }>;
289
+ export type FlowZonePosition = Static<typeof FlowZonePositionSchema>;
285
290
  export declare const FlowZoneSchema: import("@sinclair/typebox").TObject<{
286
291
  id: import("@sinclair/typebox").TString;
287
292
  name: import("@sinclair/typebox").TString;
@@ -297,6 +302,10 @@ export declare const FlowZoneSchema: import("@sinclair/typebox").TObject<{
297
302
  objectType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"DATASET">, import("@sinclair/typebox").TLiteral<"MANAGED_FOLDER">, import("@sinclair/typebox").TLiteral<"SAVED_MODEL">, import("@sinclair/typebox").TLiteral<"RECIPE">, import("@sinclair/typebox").TLiteral<"MODEL_EVALUATION_STORE">, import("@sinclair/typebox").TLiteral<"STREAMING_ENDPOINT">, import("@sinclair/typebox").TLiteral<"LABELING_TASK">, import("@sinclair/typebox").TLiteral<"RETRIEVABLE_KNOWLEDGE">]>;
298
303
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
299
304
  }>>>;
305
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
306
+ x: import("@sinclair/typebox").TNumber;
307
+ y: import("@sinclair/typebox").TNumber;
308
+ }>>;
300
309
  }>;
301
310
  export type FlowZone = Static<typeof FlowZoneSchema>;
302
311
  export declare const FlowZoneArraySchema: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
@@ -314,17 +323,29 @@ export declare const FlowZoneArraySchema: import("@sinclair/typebox").TArray<imp
314
323
  objectType: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"DATASET">, import("@sinclair/typebox").TLiteral<"MANAGED_FOLDER">, import("@sinclair/typebox").TLiteral<"SAVED_MODEL">, import("@sinclair/typebox").TLiteral<"RECIPE">, import("@sinclair/typebox").TLiteral<"MODEL_EVALUATION_STORE">, import("@sinclair/typebox").TLiteral<"STREAMING_ENDPOINT">, import("@sinclair/typebox").TLiteral<"LABELING_TASK">, import("@sinclair/typebox").TLiteral<"RETRIEVABLE_KNOWLEDGE">]>;
315
324
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
316
325
  }>>>;
326
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
327
+ x: import("@sinclair/typebox").TNumber;
328
+ y: import("@sinclair/typebox").TNumber;
329
+ }>>;
317
330
  }>>;
318
331
  export declare const FlowZoneCreateOptionsSchema: import("@sinclair/typebox").TObject<{
319
332
  name: import("@sinclair/typebox").TString;
320
333
  color: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
321
334
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
335
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
336
+ x: import("@sinclair/typebox").TNumber;
337
+ y: import("@sinclair/typebox").TNumber;
338
+ }>>;
322
339
  }>;
323
340
  export type FlowZoneCreateOptions = Static<typeof FlowZoneCreateOptionsSchema>;
324
341
  export declare const FlowZoneUpdateOptionsSchema: import("@sinclair/typebox").TObject<{
325
342
  name: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
326
343
  color: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
327
344
  projectKey: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
345
+ position: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
346
+ x: import("@sinclair/typebox").TNumber;
347
+ y: import("@sinclair/typebox").TNumber;
348
+ }>>;
328
349
  }>;
329
350
  export type FlowZoneUpdateOptions = Static<typeof FlowZoneUpdateOptionsSchema>;
330
351
  export declare const FolderCreateOptionsSchema: import("@sinclair/typebox").TObject<{
@@ -340,6 +340,10 @@ export const FlowZoneItemSchema = Type.Object({
340
340
  objectType: FlowZoneObjectTypeSchema,
341
341
  projectKey: Type.Optional(Type.String()),
342
342
  }, { additionalProperties: true, });
343
+ export const FlowZonePositionSchema = Type.Object({
344
+ x: Type.Number(),
345
+ y: Type.Number(),
346
+ }, { additionalProperties: false, });
343
347
  export const FlowZoneSchema = Type.Object({
344
348
  id: Type.String(),
345
349
  name: Type.String(),
@@ -347,17 +351,20 @@ export const FlowZoneSchema = Type.Object({
347
351
  projectKey: Type.Optional(Type.String()),
348
352
  items: Type.Optional(Type.Array(FlowZoneItemSchema)),
349
353
  shared: Type.Optional(Type.Array(FlowZoneItemSchema)),
354
+ position: Type.Optional(FlowZonePositionSchema),
350
355
  }, { additionalProperties: true, });
351
356
  export const FlowZoneArraySchema = Type.Array(FlowZoneSchema);
352
357
  export const FlowZoneCreateOptionsSchema = Type.Object({
353
358
  name: Type.String(),
354
359
  color: Type.Optional(Type.String()),
355
360
  projectKey: Type.Optional(Type.String()),
361
+ position: Type.Optional(FlowZonePositionSchema),
356
362
  }, { additionalProperties: false, });
357
363
  export const FlowZoneUpdateOptionsSchema = Type.Object({
358
364
  name: Type.Optional(Type.String()),
359
365
  color: Type.Optional(Type.String()),
360
366
  projectKey: Type.Optional(Type.String()),
367
+ position: Type.Optional(FlowZonePositionSchema),
361
368
  }, { additionalProperties: false, });
362
369
  // ---------------------------------------------------------------------------
363
370
  // Folders