@bedolla/enrivision 0.1.5 → 0.1.7

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 (64) hide show
  1. package/README.md +43 -9
  2. package/dist/client/EnriProxyClient.d.ts +296 -248
  3. package/dist/client/EnriProxyClient.d.ts.map +1 -1
  4. package/dist/client/EnriProxyClient.js +849 -119
  5. package/dist/client/EnriProxyClient.js.map +1 -1
  6. package/dist/client/EnriProxyClientContract.d.ts +478 -0
  7. package/dist/client/EnriProxyClientContract.d.ts.map +1 -0
  8. package/dist/client/EnriProxyClientContract.js +136 -0
  9. package/dist/client/EnriProxyClientContract.js.map +1 -0
  10. package/dist/index.js +23 -12
  11. package/dist/index.js.map +1 -1
  12. package/dist/package-info.d.ts +28 -0
  13. package/dist/package-info.d.ts.map +1 -1
  14. package/dist/package-info.js +28 -0
  15. package/dist/package-info.js.map +1 -1
  16. package/dist/server/EnriVisionServer.d.ts +186 -0
  17. package/dist/server/EnriVisionServer.d.ts.map +1 -1
  18. package/dist/server/EnriVisionServer.js +804 -94
  19. package/dist/server/EnriVisionServer.js.map +1 -1
  20. package/dist/shared/codepointTruncation.d.ts +61 -0
  21. package/dist/shared/codepointTruncation.d.ts.map +1 -0
  22. package/dist/shared/codepointTruncation.js +73 -0
  23. package/dist/shared/codepointTruncation.js.map +1 -0
  24. package/dist/shared/mediaUrlFetcher.d.ts +247 -9
  25. package/dist/shared/mediaUrlFetcher.d.ts.map +1 -1
  26. package/dist/shared/mediaUrlFetcher.js +712 -53
  27. package/dist/shared/mediaUrlFetcher.js.map +1 -1
  28. package/dist/shared/tar.d.ts +82 -2
  29. package/dist/shared/tar.d.ts.map +1 -1
  30. package/dist/shared/tar.js +106 -43
  31. package/dist/shared/tar.js.map +1 -1
  32. package/dist/shared/validation.d.ts +96 -2
  33. package/dist/shared/validation.d.ts.map +1 -1
  34. package/dist/shared/validation.js +169 -10
  35. package/dist/shared/validation.js.map +1 -1
  36. package/dist/tools/AnalyzeMediaContract.d.ts +462 -0
  37. package/dist/tools/AnalyzeMediaContract.d.ts.map +1 -0
  38. package/dist/tools/AnalyzeMediaContract.js +161 -0
  39. package/dist/tools/AnalyzeMediaContract.js.map +1 -0
  40. package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts +35 -0
  41. package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts.map +1 -0
  42. package/dist/tools/AnalyzeMediaExtractionSanitizer.js +214 -0
  43. package/dist/tools/AnalyzeMediaExtractionSanitizer.js.map +1 -0
  44. package/dist/tools/AnalyzeMediaInputResolver.d.ts +250 -0
  45. package/dist/tools/AnalyzeMediaInputResolver.d.ts.map +1 -0
  46. package/dist/tools/AnalyzeMediaInputResolver.js +430 -0
  47. package/dist/tools/AnalyzeMediaInputResolver.js.map +1 -0
  48. package/dist/tools/AnalyzeMediaParamParser.d.ts +307 -0
  49. package/dist/tools/AnalyzeMediaParamParser.d.ts.map +1 -0
  50. package/dist/tools/AnalyzeMediaParamParser.js +843 -0
  51. package/dist/tools/AnalyzeMediaParamParser.js.map +1 -0
  52. package/dist/tools/AnalyzeMediaResumableUploader.d.ts +244 -0
  53. package/dist/tools/AnalyzeMediaResumableUploader.d.ts.map +1 -0
  54. package/dist/tools/AnalyzeMediaResumableUploader.js +549 -0
  55. package/dist/tools/AnalyzeMediaResumableUploader.js.map +1 -0
  56. package/dist/tools/AnalyzeMediaTarPackager.d.ts +42 -0
  57. package/dist/tools/AnalyzeMediaTarPackager.d.ts.map +1 -0
  58. package/dist/tools/AnalyzeMediaTarPackager.js +245 -0
  59. package/dist/tools/AnalyzeMediaTarPackager.js.map +1 -0
  60. package/dist/tools/AnalyzeMediaTool.d.ts +156 -294
  61. package/dist/tools/AnalyzeMediaTool.d.ts.map +1 -1
  62. package/dist/tools/AnalyzeMediaTool.js +611 -457
  63. package/dist/tools/AnalyzeMediaTool.js.map +1 -1
  64. package/package.json +2 -1
@@ -15,7 +15,7 @@
15
15
  */
16
16
  export function assertObject(value, name) {
17
17
  if (typeof value !== "object" || value === null || Array.isArray(value)) {
18
- throw new Error(`${name} must be an object.`);
18
+ throw new Error(`${name} debe ser un objeto. / ${name} must be an object.`);
19
19
  }
20
20
  return value;
21
21
  }
@@ -28,11 +28,11 @@ export function assertObject(value, name) {
28
28
  */
29
29
  export function assertNonEmptyString(value, name) {
30
30
  if (typeof value !== "string") {
31
- throw new Error(`${name} must be a string.`);
31
+ throw new Error(`${name} debe ser una cadena de texto. / ${name} must be a string.`);
32
32
  }
33
33
  const trimmed = value.trim();
34
34
  if (!trimmed) {
35
- throw new Error(`${name} must be a non-empty string.`);
35
+ throw new Error(`${name} debe ser una cadena de texto no vacía. / ${name} must be a non-empty string.`);
36
36
  }
37
37
  return trimmed;
38
38
  }
@@ -50,23 +50,41 @@ export function optionalString(value) {
50
50
  return trimmed ? trimmed : undefined;
51
51
  }
52
52
  /**
53
- * Returns an integer when the value is a number or numeric string, otherwise undefined.
53
+ * Returns an integer when the value is an integer number or an integer
54
+ * numeric string, otherwise undefined.
55
+ *
56
+ * @remarks
57
+ * Strict by design: fractional numbers (`7.9`) and fractional strings
58
+ * (`"7.9"`) are rejected (undefined) so callers fail with a Spanish
59
+ * coaching error instead of silently flooring to `7`.
54
60
  *
55
61
  * @param value - Value to validate
56
62
  * @returns Parsed integer or undefined
57
63
  */
58
64
  export function optionalInt(value) {
59
- if (typeof value === "number" && Number.isFinite(value)) {
60
- return Math.floor(value);
65
+ if (typeof value === "number") {
66
+ return Number.isInteger(value) ? value : undefined;
61
67
  }
62
68
  if (typeof value === "string" && value.trim()) {
63
- const parsed = Number.parseInt(value.trim(), 10);
69
+ const trimmed = value.trim();
70
+ if (!/^[+-]?\d+$/u.test(trimmed)) {
71
+ return undefined;
72
+ }
73
+ const parsed = Number.parseInt(trimmed, 10);
64
74
  return Number.isFinite(parsed) ? parsed : undefined;
65
75
  }
66
76
  return undefined;
67
77
  }
68
78
  /**
69
- * Returns a number when the value is a number or numeric string, otherwise undefined.
79
+ * Returns a number when the value is a number or a complete numeric string, otherwise undefined.
80
+ *
81
+ * @remarks
82
+ * Strict by design: partial numerics (`"12:34"`, `"754s"`, `"1e"`) and
83
+ * exponent spellings (`"1e3"`) are rejected (undefined) so callers fail
84
+ * with a Spanish coaching error instead of silently parsing a prefix
85
+ * (`parseFloat("12:34") === 12`). Mirrors the anchored-string policy of
86
+ * {@link optionalFraction} and {@link optionalInt} plus EnriCode
87
+ * `coerceCompleteNumber` and the proxy `requireValidFloat`/`requireValidInt`.
70
88
  *
71
89
  * @param value - Value to validate
72
90
  * @returns Parsed number or undefined
@@ -76,20 +94,161 @@ export function optionalNumber(value) {
76
94
  return value;
77
95
  }
78
96
  if (typeof value === "string" && value.trim()) {
79
- const parsed = Number.parseFloat(value.trim());
97
+ const trimmed = value.trim();
98
+ if (!/^[+-]?(\d+(\.\d+)?|\.\d+)$/u.test(trimmed)) {
99
+ return undefined;
100
+ }
101
+ const parsed = Number.parseFloat(trimmed);
80
102
  return Number.isFinite(parsed) ? parsed : undefined;
81
103
  }
82
104
  return undefined;
83
105
  }
106
+ /**
107
+ * Returns a trimmed string when present, failing on non-string values.
108
+ *
109
+ * @remarks
110
+ * Strict by design: when the key exists (anything but `undefined`) with a
111
+ * non-string value (`123`, `{}`, `null`), callers get a Spanish coaching
112
+ * error instead of silently dropping the value (which hides model mistakes
113
+ * such as `language: 5`). Absent keys stay `undefined`; blank strings
114
+ * collapse to `undefined`.
115
+ *
116
+ * @param value - Raw field value.
117
+ * @param fieldName - Dotted field name for error messages.
118
+ * @returns Trimmed string or undefined when absent/blank.
119
+ * @throws Error with an Spanish-first bilingual message when present but not a string.
120
+ */
121
+ export function assertOptionalString(value, fieldName) {
122
+ if (typeof value === "undefined") {
123
+ return undefined;
124
+ }
125
+ if (typeof value !== "string") {
126
+ throw new Error(`${fieldName} debe ser una cadena de texto. / ${fieldName} must be a string.`);
127
+ }
128
+ const trimmed = value.trim();
129
+ return trimmed ? trimmed : undefined;
130
+ }
84
131
  /**
85
132
  * Returns a boolean when the value is a boolean, otherwise undefined.
86
133
  *
134
+ * @remarks
135
+ * Strict by design: truthy strings such as `"true"` are NOT coerced and
136
+ * return undefined so callers can fail with a Spanish coaching error.
137
+ *
87
138
  * @param value - Value to validate
88
139
  * @returns Boolean or undefined
89
140
  */
90
141
  export function optionalBoolean(value) {
91
142
  return typeof value === "boolean" ? value : undefined;
92
143
  }
144
+ /**
145
+ * Validates an optional boolean knob, accepting booleans plus `"true"`/`"false"` strings.
146
+ *
147
+ * @remarks
148
+ * Small-model parity with EnriCode `readOptionalBoolean`: `"true"` and
149
+ * `"false"` (trimmed, case-insensitive) coerce; every other present value
150
+ * fails in Spanish (`"yes"`, `1`, `{}` never coerce silently).
151
+ *
152
+ * @param value - Raw knob value.
153
+ * @param fieldName - Dotted field name for error messages.
154
+ * @returns Boolean or undefined when absent.
155
+ * @throws Error with an Spanish-first bilingual message when present but not a boolean nor a true/false string.
156
+ */
157
+ export function assertOptionalBoolean(value, fieldName) {
158
+ if (typeof value === "undefined") {
159
+ return undefined;
160
+ }
161
+ if (typeof value === "boolean") {
162
+ return value;
163
+ }
164
+ if (typeof value === "string") {
165
+ const normalized = value.trim().toLowerCase();
166
+ if (normalized === "true") {
167
+ return true;
168
+ }
169
+ if (normalized === "false") {
170
+ return false;
171
+ }
172
+ }
173
+ throw new Error(`${fieldName} debe ser un booleano (true o false; también vale "true"/"false"). / ${fieldName} must be a boolean (true or false; "true"/"false" also work).`);
174
+ }
175
+ /**
176
+ * Parses a relative [0,1] fraction from a number or a complete numeric string.
177
+ *
178
+ * @remarks
179
+ * Strict by design: booleans, empty strings, and partial numerics are
180
+ * rejected instead of being coerced (`Number(true) === 1`).
181
+ *
182
+ * @param value - Raw fraction value.
183
+ * @returns Parsed finite number or undefined when unparseable.
184
+ */
185
+ export function optionalFraction(value) {
186
+ if (typeof value === "number") {
187
+ return Number.isFinite(value) ? value : undefined;
188
+ }
189
+ if (typeof value === "string" && value.trim()) {
190
+ const trimmed = value.trim();
191
+ if (!/^[+-]?(\d+(\.\d+)?|\.\d+)$/u.test(trimmed)) {
192
+ return undefined;
193
+ }
194
+ const parsed = Number.parseFloat(trimmed);
195
+ return Number.isFinite(parsed) ? parsed : undefined;
196
+ }
197
+ return undefined;
198
+ }
199
+ /**
200
+ * Builds the shared Spanish-first bilingual honesty warning for one clamped clip window.
201
+ *
202
+ * @remarks
203
+ * Single builder for the parser and the direct-client backstop so both surfaces
204
+ * declare the exact analyzed window with identical wording. The Spanish half keeps
205
+ * the `La ventana pedida (inicio …) … se recortó la duración` prefix family shared with
206
+ * EnriCode `buildClipWindowClampedWarning` (`La ventana del clip pedida … recortó`),
207
+ * so es-MX parity fixtures keep matching on both sides.
208
+ *
209
+ * @param startSeconds - Effective analyzed window start in seconds.
210
+ * @param requestedDurationSeconds - Requested window duration in seconds (before clamping).
211
+ * @param clampedDurationSeconds - Analyzed window duration in seconds (after clamping).
212
+ * @param maxSeconds - Clip-window cap in seconds (86400, 24 h).
213
+ * @returns Spanish-first bilingual warning naming the requested and analyzed windows.
214
+ */
215
+ export function buildClipWindowClampedWarning(startSeconds, requestedDurationSeconds, clampedDurationSeconds, maxSeconds) {
216
+ const requestedEnd = startSeconds + requestedDurationSeconds;
217
+ const english = `Requested clip window (start ${String(startSeconds)} s + duration ${String(requestedDurationSeconds)} s = end ${String(requestedEnd)} s)` +
218
+ ` exceeds the 24 h limit: trimmed duration to ${String(clampedDurationSeconds)} s (end ${String(maxSeconds)} s).`;
219
+ const spanish = `La ventana pedida (inicio ${String(startSeconds)} s + duración ${String(requestedDurationSeconds)} s = fin ${String(requestedEnd)} s)` +
220
+ ` excede el límite de 24 h: se recortó la duración a ${String(clampedDurationSeconds)} s (fin ${String(maxSeconds)} s).`;
221
+ return `${spanish} / ${english}`;
222
+ }
223
+ /**
224
+ * Resolves a timeout override from a raw environment string.
225
+ *
226
+ * @remarks
227
+ * Strict by design: only `^\d+$` with a value `> 0` is accepted. Anything
228
+ * else present (`"30s"`, `"1e4"`, `"0"`, `"-5"`) falls back to
229
+ * `fallbackMs` with a bilingual stderr warning instead of silently using a
230
+ * garbage budget (`parseInt("30s") === 30`).
231
+ *
232
+ * @param raw - Raw environment value (already trimmed, may be empty).
233
+ * @param envName - Environment variable name for the warning.
234
+ * @param fallbackMs - Fallback timeout in milliseconds.
235
+ * @returns Resolved timeout plus a Spanish warning, or null when clean.
236
+ */
237
+ export function resolveTimeoutMs(raw, envName, fallbackMs) {
238
+ if (!raw) {
239
+ return { timeoutMs: fallbackMs, warning: null };
240
+ }
241
+ if (/^\d+$/u.test(raw)) {
242
+ const parsed = Number.parseInt(raw, 10);
243
+ if (Number.isSafeInteger(parsed) && parsed > 0) {
244
+ return { timeoutMs: parsed, warning: null };
245
+ }
246
+ }
247
+ return {
248
+ timeoutMs: fallbackMs,
249
+ warning: `${envName} inválido ('${raw}'); se usa ${String(fallbackMs)}ms. / ${envName} invalid ('${raw}'); using ${String(fallbackMs)}ms.`,
250
+ };
251
+ }
93
252
  /**
94
253
  * Asserts that a string looks like an HTTP(S) URL.
95
254
  *
@@ -100,7 +259,7 @@ export function optionalBoolean(value) {
100
259
  export function assertHttpUrl(value, name) {
101
260
  const url = assertNonEmptyString(value, name);
102
261
  if (!url.startsWith("http://") && !url.startsWith("https://")) {
103
- throw new Error(`${name} must start with http:// or https://`);
262
+ throw new Error(`${name} debe comenzar con http:// o https://. / ${name} must start with http:// or https://.`);
104
263
  }
105
264
  return url.replace(/\/+$/, "");
106
265
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/shared/validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/shared/validation.ts"],"names":[],"mappings":"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"}