@apify/actor-utils 0.1.0 → 0.1.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.
@@ -0,0 +1,3 @@
1
+ export { safePushData, isSchemaValidationError } from './src/safePushData.js';
2
+ export type { ValidationError, DroppedItem, SafePushDataResult, SafePushDataOptions, PushFn, } from './src/safePushData.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,YAAY,EACR,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,mBAAmB,EACnB,MAAM,GACT,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { safePushData, isSchemaValidationError } from './src/safePushData.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,46 @@
1
+ declare const SCHEMA_ERROR_TYPE = "schema-validation-error";
2
+ export interface ValidationError {
3
+ instancePath: string;
4
+ schemaPath?: string;
5
+ keyword: string;
6
+ params?: Record<string, unknown>;
7
+ message?: string;
8
+ }
9
+ interface InvalidItem {
10
+ itemPosition: number;
11
+ validationErrors: ValidationError[];
12
+ }
13
+ interface SchemaValidationError {
14
+ type: typeof SCHEMA_ERROR_TYPE;
15
+ statusCode: 400;
16
+ message: string;
17
+ data: {
18
+ invalidItems: InvalidItem[];
19
+ };
20
+ }
21
+ export declare function isSchemaValidationError(err: unknown): err is SchemaValidationError;
22
+ export interface DroppedItem<T> {
23
+ item: T;
24
+ errors: ValidationError[];
25
+ }
26
+ export interface SafePushDataResult<T> {
27
+ pushed: number;
28
+ dropped: DroppedItem<T>[];
29
+ attempts: number;
30
+ }
31
+ export interface SafePushDataOptions {
32
+ maxAttempts?: number;
33
+ }
34
+ export type PushFn<T> = (items: T[]) => Promise<unknown>;
35
+ /**
36
+ * Push `input` via `pushFn`, surviving Apify dataset schema-validation
37
+ * failures by cleaning offending items and retrying.
38
+ *
39
+ * `pushFn` is mandatory and intentionally not bundled — a CI check forbids
40
+ * direct `.pushData()` calls in this library, so the binding lives at the
41
+ * call site: `(b) => Actor.pushData(b)` or
42
+ * `(b) => client.dataset(id).pushItems(b)`.
43
+ */
44
+ export declare function safePushData<T>(pushFn: PushFn<T>, input: T | T[], options?: SafePushDataOptions): Promise<SafePushDataResult<T>>;
45
+ export {};
46
+ //# sourceMappingURL=safePushData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePushData.d.ts","sourceRoot":"","sources":["../../src/safePushData.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,iBAAiB,4BAA4B,CAAC;AAKpD,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,WAAW;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,eAAe,EAAE,CAAC;CACvC;AAKD,UAAU,qBAAqB;IAC3B,IAAI,EAAE,OAAO,iBAAiB,CAAC;IAC/B,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QAAE,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;CACzC;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,qBAAqB,CAMlF;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EACjB,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EACd,OAAO,GAAE,mBAAwB,GAClC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAehC"}
@@ -0,0 +1,312 @@
1
+ // safePushData: parse the Apify dataset schema-validation error, repair the
2
+ // offending items (strip bad fields, placeholder missing required ones), and
3
+ // retry the push.
4
+ const SCHEMA_ERROR_TYPE = 'schema-validation-error';
5
+ export function isSchemaValidationError(err) {
6
+ if (!err || typeof err !== 'object')
7
+ return false;
8
+ const e = err;
9
+ if (e.type !== SCHEMA_ERROR_TYPE)
10
+ return false;
11
+ if (e.statusCode !== 400)
12
+ return false;
13
+ return Array.isArray(e.data?.invalidItems);
14
+ }
15
+ /**
16
+ * Push `input` via `pushFn`, surviving Apify dataset schema-validation
17
+ * failures by cleaning offending items and retrying.
18
+ *
19
+ * `pushFn` is mandatory and intentionally not bundled — a CI check forbids
20
+ * direct `.pushData()` calls in this library, so the binding lives at the
21
+ * call site: `(b) => Actor.pushData(b)` or
22
+ * `(b) => client.dataset(id).pushItems(b)`.
23
+ */
24
+ export async function safePushData(pushFn, input, options = {}) {
25
+ const items = Array.isArray(input) ? input : [input];
26
+ // Happy path: assume validation will succeed (the overwhelmingly common
27
+ // case). No working copies, no maps, no per-item wrapper objects — just
28
+ // hand the caller's array to pushFn and return on success.
29
+ try {
30
+ await pushFn(items);
31
+ return { pushed: items.length, dropped: [], attempts: 1 };
32
+ }
33
+ catch (err) {
34
+ if (!isSchemaValidationError(err))
35
+ throw err;
36
+ // Clamp to >=1: the initial push above always counts as one attempt,
37
+ // so 0/negative would make the reported `attempts` lie about it.
38
+ return cleanAndRetry(pushFn, items, err, Math.max(1, options.maxAttempts ?? 5));
39
+ }
40
+ }
41
+ async function cleanAndRetry(pushFn, originalItems, initialError, maxAttempts) {
42
+ // working[i] is what we'll send on the next push. We mutate this array
43
+ // in place (splicing drops, replacing cleaned entries); the caller's
44
+ // `originalItems` is never touched.
45
+ const working = originalItems.slice();
46
+ // Parallel to `working`. Holds the original (untouched) reference so a
47
+ // dropped report shows what the caller actually passed in, even if the
48
+ // item was partially cleaned before being dropped on a later round.
49
+ const originalAt = originalItems.slice();
50
+ // Parallel to `working`. Tracks which paths inside each item are
51
+ // placeholders we set (vs. real user data). Needed so we can chase
52
+ // follow-up type/minLength/enum errors on the placeholder field
53
+ // without looping forever; for user-supplied fields the existing
54
+ // "delete the field" behaviour stays in effect.
55
+ const placeholderPaths = originalItems.map(() => new Set());
56
+ // Parallel to `working`. The validation errors that were last reported
57
+ // for this position — kept so a give-up drop (maxAttempts exceeded) can
58
+ // still report *why*, not just that it gave up.
59
+ const lastErrorsAt = originalItems.map(() => []);
60
+ const dropped = [];
61
+ let attempts = 1;
62
+ let lastError = initialError;
63
+ while (true) {
64
+ // Process this round's errors. Highest position first so the splices
65
+ // below don't shift positions we still need to look at.
66
+ const invalids = lastError.data.invalidItems.slice().sort((a, b) => b.itemPosition - a.itemPosition);
67
+ for (const invalid of invalids) {
68
+ const i = invalid.itemPosition;
69
+ // Guard against a malformed/unexpected error payload (e.g. a
70
+ // position outside the batch we actually sent) instead of
71
+ // crashing on `working[i]` being undefined.
72
+ if (i < 0 || i >= working.length) {
73
+ console.log(`safePushData: ignoring out-of-range itemPosition ${i} in validation error response.`);
74
+ continue;
75
+ }
76
+ const cleaned = cleanItemFields(working[i], invalid.validationErrors, placeholderPaths[i]);
77
+ if (cleaned === null) {
78
+ dropped.push({ item: originalAt[i], errors: invalid.validationErrors });
79
+ working.splice(i, 1);
80
+ originalAt.splice(i, 1);
81
+ placeholderPaths.splice(i, 1);
82
+ lastErrorsAt.splice(i, 1);
83
+ }
84
+ else {
85
+ working[i] = cleaned;
86
+ lastErrorsAt[i] = invalid.validationErrors;
87
+ }
88
+ }
89
+ console.log(`safePushData: schema validation failed on attempt ${attempts}: ` +
90
+ `${lastError.data.invalidItems.length} invalid item(s); ` +
91
+ `retrying with ${working.length} item(s).`);
92
+ if (working.length === 0) {
93
+ return { pushed: originalItems.length - dropped.length, dropped, attempts };
94
+ }
95
+ attempts++;
96
+ if (attempts > maxAttempts) {
97
+ console.log(`safePushData: gave up after ${maxAttempts} attempts with ${working.length} item(s) still failing.`);
98
+ for (let i = 0; i < working.length; i++) {
99
+ dropped.push({ item: originalAt[i], errors: lastErrorsAt[i] });
100
+ }
101
+ return { pushed: originalItems.length - dropped.length, dropped, attempts: maxAttempts };
102
+ }
103
+ try {
104
+ await pushFn(working);
105
+ return { pushed: originalItems.length - dropped.length, dropped, attempts };
106
+ }
107
+ catch (err) {
108
+ if (!isSchemaValidationError(err))
109
+ throw err;
110
+ lastError = err;
111
+ }
112
+ }
113
+ }
114
+ // Try to repair a single item given its AJV errors. Returns null when the
115
+ // item can't be salvaged.
116
+ //
117
+ // Mutates `placeholderPaths` to record any fields we filled in ourselves,
118
+ // so the caller can keep iterating on them across rounds.
119
+ function cleanItemFields(item, validationErrors, placeholderPaths) {
120
+ // structuredClone so we never mutate the caller's data.
121
+ const cloned = structuredClone(item);
122
+ for (const err of validationErrors) {
123
+ const instancePath = err.instancePath || '';
124
+ const path = parseJsonPointer(instancePath);
125
+ // Root-level errors describe the item as a whole.
126
+ if (path.length === 0) {
127
+ // Missing required field: insert a placeholder and remember we
128
+ // did so. The next round will see a `type` error on this path
129
+ // and we'll upgrade null to a type-appropriate value.
130
+ if (err.keyword === 'required' && typeof err.params?.missingProperty === 'string') {
131
+ const prop = err.params.missingProperty;
132
+ cloned[prop] = null;
133
+ placeholderPaths.add(`/${prop}`);
134
+ continue;
135
+ }
136
+ // Strip an unknown property reported at the root.
137
+ if (err.keyword === 'additionalProperties' && typeof err.params?.additionalProperty === 'string') {
138
+ delete cloned[err.params.additionalProperty];
139
+ continue;
140
+ }
141
+ // type/format/etc. at the root means the item itself is the wrong shape.
142
+ return null;
143
+ }
144
+ // Errors on a path we placeholder'd: try to satisfy the constraint
145
+ // rather than delete the field (deleting would re-trigger required).
146
+ if (placeholderPaths.has(instancePath)) {
147
+ const fix = placeholderFor(err);
148
+ if (fix.ok) {
149
+ setAtPath(cloned, path, fix.value);
150
+ continue;
151
+ }
152
+ // Constraint we don't know how to satisfy on a placeholder field
153
+ // (e.g. pattern, custom format). Give up on this item.
154
+ return null;
155
+ }
156
+ // additionalProperties errors point at the *parent* object; the
157
+ // offending key is in params, not in instancePath.
158
+ if (err.keyword === 'additionalProperties' && typeof err.params?.additionalProperty === 'string') {
159
+ deleteAtPath(cloned, [...path, err.params.additionalProperty]);
160
+ continue;
161
+ }
162
+ // User-supplied field with a violation we don't try to coerce.
163
+ // Strip it; if the schema declares it required, the next push will
164
+ // re-add a placeholder.
165
+ deleteAtPath(cloned, path);
166
+ }
167
+ return cloned;
168
+ }
169
+ // Pick a value that will satisfy `err.keyword` on a placeholder field.
170
+ // Returns ok:false when we don't have a sensible default (e.g. `pattern`,
171
+ // custom formats); the caller drops the item in that case.
172
+ function placeholderFor(err) {
173
+ const params = err.params ?? {};
174
+ switch (err.keyword) {
175
+ case 'type': {
176
+ // params.type is the expected type as a string, or array of strings.
177
+ const t = Array.isArray(params.type) ? params.type[0] : params.type;
178
+ switch (t) {
179
+ case 'string':
180
+ return { ok: true, value: '' };
181
+ case 'integer':
182
+ case 'number':
183
+ return { ok: true, value: 0 };
184
+ case 'boolean':
185
+ return { ok: true, value: false };
186
+ case 'array':
187
+ return { ok: true, value: [] };
188
+ case 'object':
189
+ return { ok: true, value: {} };
190
+ case 'null':
191
+ return { ok: true, value: null };
192
+ default:
193
+ break;
194
+ }
195
+ return { ok: false };
196
+ }
197
+ case 'minLength': {
198
+ const limit = Number(params.limit) || 1;
199
+ return { ok: true, value: '_'.repeat(limit) };
200
+ }
201
+ case 'maxLength':
202
+ return { ok: true, value: '' };
203
+ case 'minimum':
204
+ case 'exclusiveMinimum': {
205
+ const limit = Number(params.limit);
206
+ if (!Number.isFinite(limit))
207
+ return { ok: false };
208
+ return { ok: true, value: err.keyword === 'exclusiveMinimum' ? limit + 1 : limit };
209
+ }
210
+ case 'maximum':
211
+ case 'exclusiveMaximum': {
212
+ const limit = Number(params.limit);
213
+ if (!Number.isFinite(limit))
214
+ return { ok: false };
215
+ return { ok: true, value: err.keyword === 'exclusiveMaximum' ? limit - 1 : limit };
216
+ }
217
+ case 'enum': {
218
+ const allowed = params.allowedValues;
219
+ if (Array.isArray(allowed) && allowed.length > 0)
220
+ return { ok: true, value: allowed[0] };
221
+ return { ok: false };
222
+ }
223
+ case 'format': {
224
+ switch (params.format) {
225
+ case 'email':
226
+ return { ok: true, value: 'placeholder@example.com' };
227
+ case 'uri':
228
+ case 'uri-reference':
229
+ case 'url':
230
+ return { ok: true, value: 'about:blank' };
231
+ case 'date':
232
+ return { ok: true, value: '1970-01-01' };
233
+ case 'date-time':
234
+ return { ok: true, value: '1970-01-01T00:00:00Z' };
235
+ case 'uuid':
236
+ return { ok: true, value: '00000000-0000-0000-0000-000000000000' };
237
+ default:
238
+ break;
239
+ }
240
+ return { ok: false };
241
+ }
242
+ default:
243
+ break;
244
+ }
245
+ return { ok: false };
246
+ }
247
+ // Parse a JSON Pointer (RFC 6901) into decoded segments.
248
+ // "" -> []; "/foo/bar" -> ["foo","bar"]; "/tags/0" -> ["tags","0"].
249
+ function parseJsonPointer(pointer) {
250
+ if (!pointer)
251
+ return [];
252
+ return pointer
253
+ .split('/')
254
+ .slice(1)
255
+ .map((seg) => seg.replace(/~1/g, '/').replace(/~0/g, '~'));
256
+ }
257
+ // Delete the value at `path` inside `obj`. Arrays splice (so later
258
+ // `/tags/N` errors in the same round line up with their original indices).
259
+ function deleteAtPath(obj, path) {
260
+ if (path.length === 0)
261
+ return false;
262
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
263
+ let cursor = obj;
264
+ for (let i = 0; i < path.length - 1; i++) {
265
+ const key = path[i];
266
+ if (cursor == null || typeof cursor !== 'object')
267
+ return false;
268
+ cursor = Array.isArray(cursor) ? cursor[Number(key)] : cursor[key];
269
+ }
270
+ if (cursor == null || typeof cursor !== 'object')
271
+ return false;
272
+ const last = path[path.length - 1];
273
+ if (Array.isArray(cursor)) {
274
+ const idx = Number(last);
275
+ if (!Number.isInteger(idx) || idx < 0 || idx >= cursor.length)
276
+ return false;
277
+ cursor.splice(idx, 1);
278
+ return true;
279
+ }
280
+ if (Object.prototype.hasOwnProperty.call(cursor, last)) {
281
+ delete cursor[last];
282
+ return true;
283
+ }
284
+ return false;
285
+ }
286
+ // Set the value at `path` inside `obj`. Creates nothing — the path must
287
+ // already exist (placeholder fields are created at the root, not nested).
288
+ function setAtPath(obj, path, value) {
289
+ if (path.length === 0)
290
+ return false;
291
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
292
+ let cursor = obj;
293
+ for (let i = 0; i < path.length - 1; i++) {
294
+ const key = path[i];
295
+ if (cursor == null || typeof cursor !== 'object')
296
+ return false;
297
+ cursor = Array.isArray(cursor) ? cursor[Number(key)] : cursor[key];
298
+ }
299
+ if (cursor == null || typeof cursor !== 'object')
300
+ return false;
301
+ const last = path[path.length - 1];
302
+ if (Array.isArray(cursor)) {
303
+ const idx = Number(last);
304
+ if (!Number.isInteger(idx) || idx < 0)
305
+ return false;
306
+ cursor[idx] = value;
307
+ return true;
308
+ }
309
+ cursor[last] = value;
310
+ return true;
311
+ }
312
+ //# sourceMappingURL=safePushData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePushData.js","sourceRoot":"","sources":["../../src/safePushData.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@apify/actor-utils",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "Wrapper around Actor.pushData that survives dataset schema-validation failures by stripping offending fields and retrying. Callers pass the actual push function as pushFn.",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "https://github.com/apify-projects/apify-actor-utils.git"
8
+ "url": "https://github.com/apify/apify-actor-utils.git"
9
9
  },
10
10
  "engines": {
11
11
  "node": ">=22.6.0"