@zapier/zapier-sdk-cli 0.4.3 → 0.5.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/CHANGELOG.md +22 -0
- package/README.md +298 -0
- package/dist/cli.js +96 -46
- package/dist/src/commands/bundle-code/cli.js +1 -1
- package/dist/src/commands/generate-types/cli.js +13 -4
- package/dist/src/utils/api/client.d.ts +3 -3
- package/dist/src/utils/cli-generator-utils.d.ts +2 -2
- package/dist/src/utils/cli-generator.js +29 -20
- package/dist/src/utils/log.d.ts +4 -4
- package/dist/src/utils/parameter-resolver.d.ts +1 -1
- package/dist/src/utils/parameter-resolver.js +33 -22
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/commands/bundle-code/cli.ts +19 -4
- package/src/commands/generate-types/cli.ts +21 -6
- package/src/utils/api/client.ts +3 -3
- package/src/utils/cli-generator-utils.ts +7 -7
- package/src/utils/cli-generator.ts +80 -45
- package/src/utils/log.ts +4 -4
- package/src/utils/parameter-resolver.ts +79 -42
|
@@ -22,8 +22,8 @@ interface ResolvableParameter {
|
|
|
22
22
|
|
|
23
23
|
interface ResolverContext {
|
|
24
24
|
sdk: ZapierSdk;
|
|
25
|
-
currentParams:
|
|
26
|
-
resolvedParams:
|
|
25
|
+
currentParams: Record<string, unknown>;
|
|
26
|
+
resolvedParams: Record<string, unknown>;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// ============================================================================
|
|
@@ -33,9 +33,9 @@ interface ResolverContext {
|
|
|
33
33
|
export class SchemaParameterResolver {
|
|
34
34
|
async resolveParameters(
|
|
35
35
|
schema: z.ZodSchema,
|
|
36
|
-
providedParams:
|
|
36
|
+
providedParams: unknown,
|
|
37
37
|
sdk: ZapierSdk,
|
|
38
|
-
): Promise<
|
|
38
|
+
): Promise<unknown> {
|
|
39
39
|
// 1. Try to parse with current parameters
|
|
40
40
|
const parseResult = schema.safeParse(providedParams);
|
|
41
41
|
|
|
@@ -102,11 +102,11 @@ export class SchemaParameterResolver {
|
|
|
102
102
|
return parseResult.data;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
// 2. Resolve functionally required parameters
|
|
106
|
-
const resolvedParams = { ...providedParams };
|
|
105
|
+
// 2. Resolve functionally required parameters first
|
|
106
|
+
const resolvedParams = { ...(providedParams as Record<string, unknown>) };
|
|
107
107
|
const context: ResolverContext = {
|
|
108
108
|
sdk,
|
|
109
|
-
currentParams: providedParams,
|
|
109
|
+
currentParams: providedParams as Record<string, unknown>,
|
|
110
110
|
resolvedParams,
|
|
111
111
|
};
|
|
112
112
|
|
|
@@ -356,7 +356,10 @@ export class SchemaParameterResolver {
|
|
|
356
356
|
}
|
|
357
357
|
|
|
358
358
|
private async resolveFieldsRecursively(
|
|
359
|
-
resolver:
|
|
359
|
+
resolver: {
|
|
360
|
+
fetch: (sdk: unknown, params: unknown) => Promise<unknown[]>;
|
|
361
|
+
prompt: (items: unknown[], params: unknown) => unknown;
|
|
362
|
+
},
|
|
360
363
|
context: ResolverContext,
|
|
361
364
|
param: ResolvableParameter,
|
|
362
365
|
): Promise<Record<string, any>> {
|
|
@@ -399,7 +402,11 @@ export class SchemaParameterResolver {
|
|
|
399
402
|
|
|
400
403
|
// Find new fields that we haven't processed yet
|
|
401
404
|
const newFields = fields.filter(
|
|
402
|
-
(field:
|
|
405
|
+
(field: unknown) =>
|
|
406
|
+
!(
|
|
407
|
+
(field as { key: string }).key &&
|
|
408
|
+
processedFieldKeys.has((field as { key: string }).key)
|
|
409
|
+
),
|
|
403
410
|
);
|
|
404
411
|
|
|
405
412
|
if (newFields.length === 0) {
|
|
@@ -409,10 +416,10 @@ export class SchemaParameterResolver {
|
|
|
409
416
|
|
|
410
417
|
// Separate new required and optional fields
|
|
411
418
|
const newRequiredFields = newFields.filter(
|
|
412
|
-
(field:
|
|
419
|
+
(field: unknown) => (field as { required: boolean }).required,
|
|
413
420
|
);
|
|
414
421
|
const newOptionalFields = newFields.filter(
|
|
415
|
-
(field:
|
|
422
|
+
(field: unknown) => !(field as { required: boolean }).required,
|
|
416
423
|
);
|
|
417
424
|
|
|
418
425
|
// Prompt for new required fields
|
|
@@ -424,7 +431,7 @@ export class SchemaParameterResolver {
|
|
|
424
431
|
);
|
|
425
432
|
for (const field of newRequiredFields) {
|
|
426
433
|
await this.promptForField(field, inputs);
|
|
427
|
-
processedFieldKeys.add(field.key);
|
|
434
|
+
processedFieldKeys.add((field as { key: string }).key);
|
|
428
435
|
}
|
|
429
436
|
}
|
|
430
437
|
|
|
@@ -458,12 +465,12 @@ export class SchemaParameterResolver {
|
|
|
458
465
|
console.log(chalk.cyan(`\nOptional fields:`));
|
|
459
466
|
for (const field of newOptionalFields) {
|
|
460
467
|
await this.promptForField(field, inputs);
|
|
461
|
-
processedFieldKeys.add(field.key);
|
|
468
|
+
processedFieldKeys.add((field as { key: string }).key);
|
|
462
469
|
}
|
|
463
470
|
} else {
|
|
464
471
|
// Mark these fields as processed even if skipped to avoid re-asking
|
|
465
|
-
newOptionalFields.forEach((field:
|
|
466
|
-
processedFieldKeys.add(field.key),
|
|
472
|
+
newOptionalFields.forEach((field: unknown) =>
|
|
473
|
+
processedFieldKeys.add((field as { key: string }).key),
|
|
467
474
|
);
|
|
468
475
|
}
|
|
469
476
|
}
|
|
@@ -488,48 +495,73 @@ export class SchemaParameterResolver {
|
|
|
488
495
|
return inputs;
|
|
489
496
|
}
|
|
490
497
|
|
|
491
|
-
private getNestedValue(obj:
|
|
492
|
-
return path.reduce(
|
|
498
|
+
private getNestedValue(obj: unknown, path: string[]): unknown {
|
|
499
|
+
return path.reduce(
|
|
500
|
+
(current, key) => (current as Record<string, unknown>)?.[key],
|
|
501
|
+
obj,
|
|
502
|
+
);
|
|
493
503
|
}
|
|
494
504
|
|
|
495
|
-
private setNestedValue(obj:
|
|
505
|
+
private setNestedValue(obj: unknown, path: string[], value: unknown): void {
|
|
496
506
|
const lastKey = path[path.length - 1];
|
|
497
507
|
const parent = path.slice(0, -1).reduce((current, key) => {
|
|
498
|
-
|
|
499
|
-
|
|
508
|
+
const currentObj = current as Record<string, unknown>;
|
|
509
|
+
if (!(key in currentObj)) {
|
|
510
|
+
currentObj[key] = {};
|
|
500
511
|
}
|
|
501
|
-
return
|
|
502
|
-
}, obj)
|
|
512
|
+
return currentObj[key];
|
|
513
|
+
}, obj) as Record<string, unknown>;
|
|
503
514
|
parent[lastKey] = value;
|
|
504
515
|
}
|
|
505
516
|
|
|
506
517
|
private async promptForField(
|
|
507
|
-
field:
|
|
518
|
+
field: unknown,
|
|
508
519
|
inputs: Record<string, any>,
|
|
509
520
|
): Promise<void> {
|
|
510
|
-
const
|
|
511
|
-
type
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
521
|
+
const fieldObj = field as {
|
|
522
|
+
type?: string;
|
|
523
|
+
key: string;
|
|
524
|
+
label?: string;
|
|
525
|
+
required?: boolean;
|
|
526
|
+
helpText?: string;
|
|
527
|
+
default?: unknown;
|
|
528
|
+
choices?: Array<{ label?: string; value: unknown }>;
|
|
516
529
|
};
|
|
517
530
|
|
|
518
|
-
|
|
531
|
+
const fieldPrompt: Record<string, unknown> = {
|
|
532
|
+
type: fieldObj.type === "boolean" ? "confirm" : "input",
|
|
533
|
+
name: fieldObj.key,
|
|
534
|
+
message: `${fieldObj.label || fieldObj.key}${fieldObj.required ? " (required)" : " (optional)"}:`,
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
if (fieldObj.helpText) {
|
|
538
|
+
fieldPrompt.prefix = chalk.gray(`ℹ ${fieldObj.helpText}\n`);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (fieldObj.default !== undefined) {
|
|
542
|
+
fieldPrompt.default = fieldObj.default;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
if (fieldObj.choices && fieldObj.choices.length > 0) {
|
|
519
546
|
fieldPrompt.type = "list";
|
|
520
|
-
(fieldPrompt as
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
547
|
+
(fieldPrompt as { choices: unknown[] }).choices = fieldObj.choices.map(
|
|
548
|
+
(choice: unknown) => {
|
|
549
|
+
const choiceObj = choice as { label?: unknown; value: unknown };
|
|
550
|
+
return {
|
|
551
|
+
name: choiceObj.label || choiceObj.value,
|
|
552
|
+
value: choiceObj.value,
|
|
553
|
+
};
|
|
554
|
+
},
|
|
555
|
+
);
|
|
524
556
|
}
|
|
525
557
|
|
|
526
558
|
try {
|
|
527
559
|
const answer = await inquirer.prompt([fieldPrompt as any]);
|
|
528
560
|
|
|
529
|
-
if (answer[
|
|
530
|
-
inputs[
|
|
531
|
-
} else if (
|
|
532
|
-
throw new Error(`Required field ${
|
|
561
|
+
if (answer[fieldObj.key] !== undefined && answer[fieldObj.key] !== "") {
|
|
562
|
+
inputs[fieldObj.key] = answer[fieldObj.key];
|
|
563
|
+
} else if (fieldObj.required) {
|
|
564
|
+
throw new Error(`Required field ${fieldObj.key} cannot be empty`);
|
|
533
565
|
}
|
|
534
566
|
} catch (error) {
|
|
535
567
|
if (this.isUserCancellation(error)) {
|
|
@@ -540,11 +572,16 @@ export class SchemaParameterResolver {
|
|
|
540
572
|
}
|
|
541
573
|
}
|
|
542
574
|
|
|
543
|
-
private isUserCancellation(error:
|
|
575
|
+
private isUserCancellation(error: unknown): boolean {
|
|
576
|
+
const errorObj = error as {
|
|
577
|
+
name?: string;
|
|
578
|
+
message?: string;
|
|
579
|
+
isTTYError?: boolean;
|
|
580
|
+
};
|
|
544
581
|
return (
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
582
|
+
errorObj?.name === "ExitPromptError" ||
|
|
583
|
+
errorObj?.message?.includes("User force closed") ||
|
|
584
|
+
errorObj?.isTTYError === true
|
|
548
585
|
);
|
|
549
586
|
}
|
|
550
587
|
}
|