@transloadit/node 4.7.7 → 4.8.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.
Files changed (33) hide show
  1. package/README.md +46 -19
  2. package/dist/cli/generateIntentDocs.d.ts +5 -1
  3. package/dist/cli/generateIntentDocs.d.ts.map +1 -1
  4. package/dist/cli/generateIntentDocs.js +25 -9
  5. package/dist/cli/generateIntentDocs.js.map +1 -1
  6. package/dist/cli/intentCommandSpecs.d.ts.map +1 -1
  7. package/dist/cli/intentCommandSpecs.js +4 -6
  8. package/dist/cli/intentCommandSpecs.js.map +1 -1
  9. package/dist/cli/intentRuntime.d.ts.map +1 -1
  10. package/dist/cli/intentRuntime.js +4 -4
  11. package/dist/cli/intentRuntime.js.map +1 -1
  12. package/dist/cli/semanticIntents/imageDescribe.d.ts +3 -1
  13. package/dist/cli/semanticIntents/imageDescribe.d.ts.map +1 -1
  14. package/dist/cli/semanticIntents/imageDescribe.js +1 -1
  15. package/dist/cli/semanticIntents/imageDescribe.js.map +1 -1
  16. package/dist/cli/semanticIntents/imageGenerate.d.ts +94 -0
  17. package/dist/cli/semanticIntents/imageGenerate.d.ts.map +1 -0
  18. package/dist/cli/semanticIntents/imageGenerate.js +215 -0
  19. package/dist/cli/semanticIntents/imageGenerate.js.map +1 -0
  20. package/dist/cli/semanticIntents/index.d.ts +3 -1
  21. package/dist/cli/semanticIntents/index.d.ts.map +1 -1
  22. package/dist/cli/semanticIntents/index.js +2 -0
  23. package/dist/cli/semanticIntents/index.js.map +1 -1
  24. package/dist/cli/semanticIntents/markdownPdf.js +1 -1
  25. package/dist/cli/semanticIntents/markdownPdf.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/cli/generateIntentDocs.ts +28 -9
  28. package/src/cli/intentCommandSpecs.ts +4 -9
  29. package/src/cli/intentRuntime.ts +8 -3
  30. package/src/cli/semanticIntents/imageDescribe.ts +4 -1
  31. package/src/cli/semanticIntents/imageGenerate.ts +254 -0
  32. package/src/cli/semanticIntents/index.ts +6 -1
  33. package/src/cli/semanticIntents/markdownPdf.ts +1 -1
@@ -0,0 +1,94 @@
1
+ import type { PreparedIntentInputs } from '../intentRuntime.ts';
2
+ declare function createImageGenerateStep(rawValues: Record<string, unknown>, context: {
3
+ hasInputs: boolean;
4
+ }): Record<string, unknown>;
5
+ export declare const imageGenerateSemanticIntentDescriptor: {
6
+ readonly createStep: typeof createImageGenerateStep;
7
+ readonly execution: {
8
+ readonly kind: "dynamic-step";
9
+ readonly handler: "image-generate";
10
+ readonly resultStepName: "generate";
11
+ readonly fields: readonly [{
12
+ readonly name: "prompt";
13
+ readonly kind: "string";
14
+ readonly propertyName: "prompt";
15
+ readonly optionFlags: "--prompt";
16
+ readonly description: "The prompt describing the desired image content.";
17
+ readonly required: true;
18
+ readonly exampleValue: string;
19
+ }, {
20
+ readonly name: "model";
21
+ readonly kind: "string";
22
+ readonly propertyName: "model";
23
+ readonly optionFlags: "--model";
24
+ readonly description: "The AI model to use for image generation. Defaults to google/nano-banana-2.";
25
+ readonly required: false;
26
+ readonly exampleValue: "google/nano-banana-2";
27
+ }, {
28
+ readonly name: "format";
29
+ readonly kind: "string";
30
+ readonly propertyName: "format";
31
+ readonly optionFlags: "--format";
32
+ readonly description: "Format of the generated image.";
33
+ readonly required: false;
34
+ readonly exampleValue: "jpg";
35
+ }, {
36
+ readonly name: "seed";
37
+ readonly kind: "number";
38
+ readonly propertyName: "seed";
39
+ readonly optionFlags: "--seed";
40
+ readonly description: "Seed for the random number generator.";
41
+ readonly required: false;
42
+ }, {
43
+ readonly name: "aspectRatio";
44
+ readonly kind: "string";
45
+ readonly propertyName: "aspectRatio";
46
+ readonly optionFlags: "--aspect-ratio";
47
+ readonly description: "Aspect ratio of the generated image.";
48
+ readonly required: false;
49
+ }, {
50
+ readonly name: "height";
51
+ readonly kind: "number";
52
+ readonly propertyName: "height";
53
+ readonly optionFlags: "--height";
54
+ readonly description: "Height of the generated image.";
55
+ readonly required: false;
56
+ }, {
57
+ readonly name: "width";
58
+ readonly kind: "number";
59
+ readonly propertyName: "width";
60
+ readonly optionFlags: "--width";
61
+ readonly description: "Width of the generated image.";
62
+ readonly required: false;
63
+ }, {
64
+ readonly name: "style";
65
+ readonly kind: "string";
66
+ readonly propertyName: "style";
67
+ readonly optionFlags: "--style";
68
+ readonly description: "Style of the generated image.";
69
+ readonly required: false;
70
+ }, {
71
+ readonly name: "numOutputs";
72
+ readonly kind: "number";
73
+ readonly propertyName: "numOutputs";
74
+ readonly optionFlags: "--num-outputs";
75
+ readonly description: "Number of image variants to generate.";
76
+ readonly required: false;
77
+ }];
78
+ };
79
+ readonly inputPolicy: {
80
+ readonly kind: "optional";
81
+ readonly field: "prompt";
82
+ readonly attachUseWhenInputsProvided: false;
83
+ };
84
+ readonly outputDescription: "Write the result to this path";
85
+ readonly prepareInputs: (preparedInputs: PreparedIntentInputs) => Promise<PreparedIntentInputs>;
86
+ readonly presentation: {
87
+ readonly description: "Generate images from text prompts";
88
+ readonly details: "Runs `/image/generate`. Without inputs, this is text-to-image. With one or more `--input` files, the inputs are bundled into a single assembly so the prompt can refer to them by filename.";
89
+ readonly examples: Array<[string, string]>;
90
+ };
91
+ readonly runnerKind: "bundled";
92
+ };
93
+ export {};
94
+ //# sourceMappingURL=imageGenerate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageGenerate.d.ts","sourceRoot":"","sources":["../../../src/cli/semanticIntents/imageGenerate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0B,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAuJvF,iBAAS,uBAAuB,CAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2DzB;AAoBD,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAnI3C,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;CAsJe,CAAA"}
@@ -0,0 +1,215 @@
1
+ import { basename } from 'node:path';
2
+ import { parseOptionalEnumValue } from "./parsing.js";
3
+ const defaultImageGenerateModel = 'google/nano-banana-2';
4
+ const imageGenerateFormats = ['jpeg', 'jpg', 'png', 'gif', 'webp', 'svg'];
5
+ const imageGenerateOptionDefinitions = [
6
+ {
7
+ name: 'prompt',
8
+ kind: 'string',
9
+ propertyName: 'prompt',
10
+ optionFlags: '--prompt',
11
+ description: 'The prompt describing the desired image content.',
12
+ required: true,
13
+ exampleValue: JSON.stringify('A red bicycle in a studio'),
14
+ },
15
+ {
16
+ name: 'model',
17
+ kind: 'string',
18
+ propertyName: 'model',
19
+ optionFlags: '--model',
20
+ description: `The AI model to use for image generation. Defaults to ${defaultImageGenerateModel}.`,
21
+ required: false,
22
+ exampleValue: defaultImageGenerateModel,
23
+ },
24
+ {
25
+ name: 'format',
26
+ kind: 'string',
27
+ propertyName: 'format',
28
+ optionFlags: '--format',
29
+ description: 'Format of the generated image.',
30
+ required: false,
31
+ exampleValue: 'jpg',
32
+ },
33
+ {
34
+ name: 'seed',
35
+ kind: 'number',
36
+ propertyName: 'seed',
37
+ optionFlags: '--seed',
38
+ description: 'Seed for the random number generator.',
39
+ required: false,
40
+ },
41
+ {
42
+ name: 'aspectRatio',
43
+ kind: 'string',
44
+ propertyName: 'aspectRatio',
45
+ optionFlags: '--aspect-ratio',
46
+ description: 'Aspect ratio of the generated image.',
47
+ required: false,
48
+ },
49
+ {
50
+ name: 'height',
51
+ kind: 'number',
52
+ propertyName: 'height',
53
+ optionFlags: '--height',
54
+ description: 'Height of the generated image.',
55
+ required: false,
56
+ },
57
+ {
58
+ name: 'width',
59
+ kind: 'number',
60
+ propertyName: 'width',
61
+ optionFlags: '--width',
62
+ description: 'Width of the generated image.',
63
+ required: false,
64
+ },
65
+ {
66
+ name: 'style',
67
+ kind: 'string',
68
+ propertyName: 'style',
69
+ optionFlags: '--style',
70
+ description: 'Style of the generated image.',
71
+ required: false,
72
+ },
73
+ {
74
+ name: 'numOutputs',
75
+ kind: 'number',
76
+ propertyName: 'numOutputs',
77
+ optionFlags: '--num-outputs',
78
+ description: 'Number of image variants to generate.',
79
+ required: false,
80
+ },
81
+ ];
82
+ const imageGenerateCommandPresentation = {
83
+ description: 'Generate images from text prompts',
84
+ details: 'Runs `/image/generate`. Without inputs, this is text-to-image. With one or more `--input` files, the inputs are bundled into a single assembly so the prompt can refer to them by filename.',
85
+ examples: [
86
+ [
87
+ 'Generate an image from text',
88
+ 'transloadit image generate --prompt "A red bicycle in a studio" --out output.png',
89
+ ],
90
+ [
91
+ 'Guide generation with one input image',
92
+ 'transloadit image generate --input subject.jpg --prompt "Place subject.jpg on a magazine cover" --out output.png',
93
+ ],
94
+ [
95
+ 'Guide generation with multiple input images',
96
+ 'transloadit image generate --input person1.jpg --input person2.jpg --input background.jpg --prompt "Place person1.jpg feeding person2.jpg in front of background.jpg" --out output.png',
97
+ ],
98
+ ],
99
+ };
100
+ function parseOptionalFormat(value) {
101
+ return parseOptionalEnumValue({
102
+ flagName: '--format',
103
+ supportedValues: imageGenerateFormats,
104
+ value,
105
+ });
106
+ }
107
+ function parseRequiredPrompt(value) {
108
+ if (typeof value !== 'string' || value.trim() === '') {
109
+ throw new Error('image generate requires --prompt');
110
+ }
111
+ return value;
112
+ }
113
+ function parseOptionalNumber(flagName, value) {
114
+ if (value == null || value === '') {
115
+ return undefined;
116
+ }
117
+ const numericValue = typeof value === 'number' ? value : Number(String(value).trim());
118
+ if (Number.isNaN(numericValue)) {
119
+ throw new Error(`${flagName} must be a number`);
120
+ }
121
+ return numericValue;
122
+ }
123
+ function parseOptionalIntegerRange(flagName, value, { max, min }) {
124
+ const numericValue = parseOptionalNumber(flagName, value);
125
+ if (numericValue == null) {
126
+ return undefined;
127
+ }
128
+ if (!Number.isInteger(numericValue) || numericValue < min || numericValue > max) {
129
+ throw new Error(`${flagName} must be an integer between ${min} and ${max}`);
130
+ }
131
+ return numericValue;
132
+ }
133
+ function createImageGenerateStep(rawValues, context) {
134
+ const step = {
135
+ robot: '/image/generate',
136
+ result: true,
137
+ model: defaultImageGenerateModel,
138
+ prompt: parseRequiredPrompt(rawValues.prompt),
139
+ };
140
+ if (context.hasInputs) {
141
+ step.use = {
142
+ steps: [':original'],
143
+ bundle_steps: true,
144
+ };
145
+ }
146
+ const model = rawValues.model;
147
+ if (typeof model === 'string' && model.trim() !== '') {
148
+ step.model = model;
149
+ }
150
+ const format = parseOptionalFormat(rawValues.format);
151
+ if (format != null) {
152
+ step.format = format;
153
+ }
154
+ const seed = parseOptionalNumber('--seed', rawValues.seed);
155
+ if (seed != null) {
156
+ step.seed = seed;
157
+ }
158
+ const aspectRatio = rawValues.aspectRatio;
159
+ if (typeof aspectRatio === 'string' && aspectRatio.trim() !== '') {
160
+ step.aspect_ratio = aspectRatio;
161
+ }
162
+ const height = parseOptionalNumber('--height', rawValues.height);
163
+ if (height != null) {
164
+ step.height = height;
165
+ }
166
+ const width = parseOptionalNumber('--width', rawValues.width);
167
+ if (width != null) {
168
+ step.width = width;
169
+ }
170
+ const style = rawValues.style;
171
+ if (typeof style === 'string' && style.trim() !== '') {
172
+ step.style = style;
173
+ }
174
+ const numOutputs = parseOptionalIntegerRange('--num-outputs', rawValues.numOutputs, {
175
+ min: 1,
176
+ max: 10,
177
+ });
178
+ if (numOutputs != null) {
179
+ step.num_outputs = numOutputs;
180
+ }
181
+ return step;
182
+ }
183
+ function ensureUniqueInputBasenames(preparedInputs) {
184
+ const seenBasenames = new Map();
185
+ for (const input of preparedInputs.inputs) {
186
+ const inputBasename = basename(input);
187
+ const previousInput = seenBasenames.get(inputBasename);
188
+ if (previousInput != null) {
189
+ throw new Error(`image generate requires unique input basenames when prompts refer to files; found duplicate ${inputBasename} in ${previousInput} and ${input}`);
190
+ }
191
+ seenBasenames.set(inputBasename, input);
192
+ }
193
+ return preparedInputs;
194
+ }
195
+ export const imageGenerateSemanticIntentDescriptor = {
196
+ createStep: createImageGenerateStep,
197
+ execution: {
198
+ kind: 'dynamic-step',
199
+ handler: 'image-generate',
200
+ resultStepName: 'generate',
201
+ fields: imageGenerateOptionDefinitions,
202
+ },
203
+ inputPolicy: {
204
+ kind: 'optional',
205
+ field: 'prompt',
206
+ attachUseWhenInputsProvided: false,
207
+ },
208
+ outputDescription: 'Write the result to this path',
209
+ async prepareInputs(preparedInputs) {
210
+ return await Promise.resolve(ensureUniqueInputBasenames(preparedInputs));
211
+ },
212
+ presentation: imageGenerateCommandPresentation,
213
+ runnerKind: 'bundled',
214
+ };
215
+ //# sourceMappingURL=imageGenerate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imageGenerate.js","sourceRoot":"","sources":["../../../src/cli/semanticIntents/imageGenerate.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,9 @@ export interface SemanticIntentPresentation {
6
6
  examples: Array<[string, string]>;
7
7
  }
8
8
  export interface SemanticIntentDescriptor {
9
- createStep: (rawValues: Record<string, unknown>) => Record<string, unknown>;
9
+ createStep: (rawValues: Record<string, unknown>, context: {
10
+ hasInputs: boolean;
11
+ }) => Record<string, unknown>;
10
12
  execution: IntentDynamicStepExecutionDefinition;
11
13
  inputPolicy: IntentInputPolicy;
12
14
  outputDescription: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/semanticIntents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EACV,oCAAoC,EACpC,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAO5B,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3E,SAAS,EAAE,oCAAoC,CAAA;IAC/C,WAAW,EAAE,iBAAiB,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,CACd,cAAc,EAAE,oBAAoB,EACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClC,YAAY,EAAE,0BAA0B,CAAA;IACxC,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAYD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAMlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/semanticIntents/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EACV,oCAAoC,EACpC,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,qBAAqB,CAAA;AAQ5B,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,CACV,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,SAAS,EAAE,oCAAoC,CAAA;IAC/C,WAAW,EAAE,iBAAiB,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,CACd,cAAc,EAAE,oBAAoB,EACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC/B,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAClC,YAAY,EAAE,0BAA0B,CAAA;IACxC,UAAU,EAAE,gBAAgB,CAAA;CAC7B;AAaD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAMlF"}
@@ -1,7 +1,9 @@
1
1
  import { imageDescribeSemanticIntentDescriptor } from "./imageDescribe.js";
2
+ import { imageGenerateSemanticIntentDescriptor } from "./imageGenerate.js";
2
3
  import { markdownDocxSemanticIntentDescriptor, markdownPdfSemanticIntentDescriptor, } from "./markdownPdf.js";
3
4
  const semanticIntentDescriptors = {
4
5
  'image-describe': imageDescribeSemanticIntentDescriptor,
6
+ 'image-generate': imageGenerateSemanticIntentDescriptor,
5
7
  'markdown-pdf': {
6
8
  ...markdownPdfSemanticIntentDescriptor,
7
9
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/semanticIntents/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,kBAAkB,CAAA;AAqBzB,MAAM,yBAAyB,GAA6C;IAC1E,gBAAgB,EAAE,qCAAqC;IACvD,cAAc,EAAE;QACd,GAAG,mCAAmC;KACvC;IACD,eAAe,EAAE;QACf,GAAG,oCAAoC;KACxC;CACF,CAAA;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,IAAI,CAAC,CAAC,IAAI,IAAI,yBAAyB,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,GAAG,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/semanticIntents/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,qCAAqC,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EACL,oCAAoC,EACpC,mCAAmC,GACpC,MAAM,kBAAkB,CAAA;AAwBzB,MAAM,yBAAyB,GAA6C;IAC1E,gBAAgB,EAAE,qCAAqC;IACvD,gBAAgB,EAAE,qCAAqC;IACvD,cAAc,EAAE;QACd,GAAG,mCAAmC;KACvC;IACD,eAAe,EAAE;QACf,GAAG,oCAAoC;KACxC;CACF,CAAA;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,IAAI,CAAC,CAAC,IAAI,IAAI,yBAAyB,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,GAAG,CAAC,CAAA;IAC5E,CAAC;IAED,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC"}
@@ -52,7 +52,7 @@ function createMarkdownConvertSemanticIntent({ description, details, exampleOutp
52
52
  ],
53
53
  };
54
54
  return {
55
- createStep(rawValues) {
55
+ createStep(rawValues, _context) {
56
56
  return {
57
57
  robot: '/document/convert',
58
58
  use: ':original',
@@ -1 +1 @@
1
- {"version":3,"file":"markdownPdf.js","sourceRoot":"","sources":["../../../src/cli/semanticIntents/markdownPdf.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,qBAAqB,GAAG,KAAK,CAAA;AACnC,MAAM,oBAAoB,GAAG,QAAQ,CAAA;AACrC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,KAAK,CAAU,CAAA;AACtD,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAA;AAElD,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,CACL,sBAAsB,CAAC;QACrB,QAAQ,EAAE,mBAAmB;QAC7B,eAAe,EAAE,eAAe;QAChC,KAAK;KACN,CAAC,IAAI,qBAAqB,CAC5B,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CACL,sBAAsB,CAAC;QACrB,QAAQ,EAAE,kBAAkB;QAC5B,eAAe,EAAE,cAAc;QAC/B,KAAK;KACN,CAAC,IAAI,oBAAoB,CAC3B,CAAA;AACH,CAAC;AAED,MAAM,yBAAyB,GAAG;IAChC;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,KAAK;KAChB;CACmD,CAAA;AAEtD,SAAS,mCAAmC,CAAC,EAC3C,WAAW,EACX,OAAO,EACP,aAAa,EACb,MAAM,EACN,OAAO,GAOR;IACC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IACxC,MAAM,YAAY,GAAG;QACnB,WAAW;QACX,OAAO;QACP,QAAQ,EAAE;YACR;gBACE,+BAA+B,WAAW,OAAO;gBACjD,wBAAwB,MAAM,4BAA4B,aAAa,EAAE;aAC1E;YACD;gBACE,0DAA0D;gBAC1D,wBAAwB,MAAM,iCAAiC;aAChE;SACF;KACmC,CAAA;IAEtC,OAAO;QACL,UAAU,CAAC,SAAS;YAClB,OAAO;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,IAAI;gBACZ,MAAM;gBACN,eAAe,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;gBAChE,cAAc,EAAE,oBAAoB,CAAC,SAAS,CAAC,aAAa,CAAC;gBAC7D,8FAA8F;gBAC9F,wEAAwE;aACzE,CAAA;QACH,CAAC;QACD,SAAS,EAAE;YACT,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,cAAc,EAAE,SAAS;YACzB,MAAM,EAAE,yBAAyB;SAClC;QACD,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QACjC,iBAAiB,EAAE,sBAAsB,WAAW,4BAA4B;QAChF,YAAY;QACZ,UAAU,EAAE,WAAW;KACxB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAAG,mCAAmC,CAAC;IACrF,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EACL,6JAA6J;IAC/J,aAAa,EAAE,YAAY;IAC3B,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,cAAc;CACxB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,mCAAmC,CAAC;IACtF,WAAW,EAAE,yCAAyC;IACtD,OAAO,EACL,wHAAwH;IAC1H,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA"}
1
+ {"version":3,"file":"markdownPdf.js","sourceRoot":"","sources":["../../../src/cli/semanticIntents/markdownPdf.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,qBAAqB,GAAG,KAAK,CAAA;AACnC,MAAM,oBAAoB,GAAG,QAAQ,CAAA;AACrC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,KAAK,CAAU,CAAA;AACtD,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAA;AAElD,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,CACL,sBAAsB,CAAC;QACrB,QAAQ,EAAE,mBAAmB;QAC7B,eAAe,EAAE,eAAe;QAChC,KAAK;KACN,CAAC,IAAI,qBAAqB,CAC5B,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CACL,sBAAsB,CAAC;QACrB,QAAQ,EAAE,kBAAkB;QAC5B,eAAe,EAAE,cAAc;QAC/B,KAAK;KACN,CAAC,IAAI,oBAAoB,CAC3B,CAAA;AACH,CAAC;AAED,MAAM,yBAAyB,GAAG;IAChC;QACE,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,mBAAmB;QAChC,WAAW,EAAE,qDAAqD;QAClE,QAAQ,EAAE,KAAK;KAChB;IACD;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,KAAK;KAChB;CACmD,CAAA;AAEtD,SAAS,mCAAmC,CAAC,EAC3C,WAAW,EACX,OAAO,EACP,aAAa,EACb,MAAM,EACN,OAAO,GAOR;IACC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAA;IACxC,MAAM,YAAY,GAAG;QACnB,WAAW;QACX,OAAO;QACP,QAAQ,EAAE;YACR;gBACE,+BAA+B,WAAW,OAAO;gBACjD,wBAAwB,MAAM,4BAA4B,aAAa,EAAE;aAC1E;YACD;gBACE,0DAA0D;gBAC1D,wBAAwB,MAAM,iCAAiC;aAChE;SACF;KACmC,CAAA;IAEtC,OAAO;QACL,UAAU,CAAC,SAAS,EAAE,QAAQ;YAC5B,OAAO;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,GAAG,EAAE,WAAW;gBAChB,MAAM,EAAE,IAAI;gBACZ,MAAM;gBACN,eAAe,EAAE,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC;gBAChE,cAAc,EAAE,oBAAoB,CAAC,SAAS,CAAC,aAAa,CAAC;gBAC7D,8FAA8F;gBAC9F,wEAAwE;aACzE,CAAA;QACH,CAAC;QACD,SAAS,EAAE;YACT,IAAI,EAAE,cAAc;YACpB,OAAO;YACP,cAAc,EAAE,SAAS;YACzB,MAAM,EAAE,yBAAyB;SAClC;QACD,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QACjC,iBAAiB,EAAE,sBAAsB,WAAW,4BAA4B;QAChF,YAAY;QACZ,UAAU,EAAE,WAAW;KACxB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAAG,mCAAmC,CAAC;IACrF,WAAW,EAAE,+BAA+B;IAC5C,OAAO,EACL,6JAA6J;IAC/J,aAAa,EAAE,YAAY;IAC3B,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,cAAc;CACxB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oCAAoC,GAAG,mCAAmC,CAAC;IACtF,WAAW,EAAE,yCAAyC;IACtD,OAAO,EACL,wHAAwH;IAC1H,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,eAAe;CACzB,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transloadit/node",
3
- "version": "4.7.7",
3
+ "version": "4.8.0",
4
4
  "description": "Node.js SDK for Transloadit",
5
5
  "homepage": "https://github.com/transloadit/node-sdk/tree/main/packages/node",
6
6
  "bugs": {
@@ -1,5 +1,6 @@
1
1
  import { mkdir, readFile, writeFile } from 'node:fs/promises'
2
2
  import { dirname } from 'node:path'
3
+ import { pathToFileURL } from 'node:url'
3
4
  import {
4
5
  getConcurrencyOptionDocumentation,
5
6
  getDeleteAfterProcessingOptionDocumentation,
@@ -127,7 +128,14 @@ function getBackendSummary(catalogDefinition: IntentDefinition): string {
127
128
  function getUsage(definition: ResolvedIntentCommandDefinition): string {
128
129
  const parts = ['npx transloadit', ...definition.paths]
129
130
  if (definition.runnerKind !== 'no-input') {
130
- parts.push('--input', '<path|dir|url|->')
131
+ if (
132
+ 'inputPolicy' in definition.intentDefinition &&
133
+ definition.intentDefinition.inputPolicy.kind === 'optional'
134
+ ) {
135
+ parts.push('[--input', '<path|dir|url|->]')
136
+ } else {
137
+ parts.push('--input', '<path|dir|url|->')
138
+ }
131
139
  }
132
140
  parts.push('[options]')
133
141
  return parts.join(' ')
@@ -322,7 +330,7 @@ function renderAtAGlanceTable(definitions: ResolvedIntentCommandDefinition[]): s
322
330
  )
323
331
  }
324
332
 
325
- function renderIntentDocsBody({
333
+ export function renderIntentDocsBody({
326
334
  definitions,
327
335
  headingLevel,
328
336
  }: {
@@ -359,6 +367,15 @@ function renderIntentDocsBody({
359
367
  return lines.join('\n').trim()
360
368
  }
361
369
 
370
+ function isEntrypoint(): boolean {
371
+ const entrypoint = process.argv[1]
372
+ if (entrypoint == null) {
373
+ return false
374
+ }
375
+
376
+ return import.meta.url === pathToFileURL(entrypoint).href
377
+ }
378
+
362
379
  function replaceGeneratedBlock({
363
380
  endMarker,
364
381
  markdown,
@@ -410,10 +427,12 @@ async function main(): Promise<void> {
410
427
  await writeFile(readmeUrl, `${nextReadme}\n`)
411
428
  }
412
429
 
413
- main().catch((error) => {
414
- if (!(error instanceof Error)) {
415
- throw new Error(`Was thrown a non-error: ${String(error)}`)
416
- }
417
- console.error(error)
418
- process.exit(1)
419
- })
430
+ if (isEntrypoint()) {
431
+ main().catch((error) => {
432
+ if (!(error instanceof Error)) {
433
+ throw new Error(`Was thrown a non-error: ${String(error)}`)
434
+ }
435
+ console.error(error)
436
+ process.exit(1)
437
+ })
438
+ }
@@ -37,10 +37,6 @@ import {
37
37
  robotImageBgremoveInstructionsSchema,
38
38
  meta as robotImageBgremoveMeta,
39
39
  } from '../alphalib/types/robots/image-bgremove.ts'
40
- import {
41
- robotImageGenerateInstructionsSchema,
42
- meta as robotImageGenerateMeta,
43
- } from '../alphalib/types/robots/image-generate.ts'
44
40
  import {
45
41
  robotImageOptimizeInstructionsSchema,
46
42
  meta as robotImageOptimizeMeta,
@@ -169,11 +165,10 @@ export function findIntentDefinitionByPaths(
169
165
  }
170
166
 
171
167
  export const intentCatalog = [
172
- defineRobotIntent({
173
- kind: 'robot',
174
- robot: '/image/generate',
175
- meta: robotImageGenerateMeta,
176
- schema: robotImageGenerateInstructionsSchema,
168
+ defineSemanticIntent({
169
+ kind: 'semantic',
170
+ paths: ['image', 'generate'],
171
+ semantic: 'image-generate',
177
172
  }),
178
173
  defineRobotIntent({
179
174
  kind: 'robot',
@@ -318,8 +318,9 @@ function createSingleStep(
318
318
  function createDynamicIntentStep(
319
319
  execution: IntentDynamicStepExecutionDefinition,
320
320
  rawValues: Record<string, unknown>,
321
+ hasInputs: boolean,
321
322
  ): Record<string, unknown> {
322
- return getSemanticIntentDescriptor(execution.handler).createStep(rawValues)
323
+ return getSemanticIntentDescriptor(execution.handler).createStep(rawValues, { hasInputs })
323
324
  }
324
325
 
325
326
  function requiresLocalInput(
@@ -367,7 +368,11 @@ async function executeIntentCommand({
367
368
  rawValues,
368
369
  createOptions.inputs.length > 0,
369
370
  )
370
- : createDynamicIntentStep(definition.execution, rawValues),
371
+ : createDynamicIntentStep(
372
+ definition.execution,
373
+ rawValues,
374
+ createOptions.inputs.length > 0,
375
+ ),
371
376
  } as AssembliesCreateOptions['stepsData'],
372
377
  }
373
378
 
@@ -563,7 +568,7 @@ abstract class GeneratedFileIntentCommandBase extends GeneratedIntentCommandBase
563
568
 
564
569
  const execution = this.getIntentDefinition().execution
565
570
  if (execution.kind === 'dynamic-step') {
566
- createDynamicIntentStep(execution, rawValues)
571
+ createDynamicIntentStep(execution, rawValues, this.getProvidedInputCount() > 0)
567
572
  }
568
573
 
569
574
  return undefined
@@ -212,7 +212,10 @@ function buildDescribeAiChatMessages({
212
212
  }
213
213
  }
214
214
 
215
- function createImageDescribeStep(rawValues: Record<string, unknown>): Record<string, unknown> {
215
+ function createImageDescribeStep(
216
+ rawValues: Record<string, unknown>,
217
+ _context: { hasInputs: boolean },
218
+ ): Record<string, unknown> {
216
219
  const { fields, profile } = resolveImageDescribeRequest(rawValues)
217
220
  if (fields.length === 1 && fields[0] === 'labels') {
218
221
  return {