1import { Actor, log } from 'apify';
2
3await Actor.init();
4
5interface Input {
6 datasetId: string;
7 datasetFieldName: string;
8 format: "stringList" | "requestListSources",
9 targetType: "ACTOR" | "TASK",
10 targetId: string;
11 targetFieldName: string;
12 inputOverride: object;
13 optionsOverride: object;
14}
15
16const input = await Actor.getInput<Input>();
17if (!input) throw new Error("Input is missing!");
18
19const {
20 datasetId,
21 datasetFieldName,
22 format,
23 targetType,
24 targetId,
25 targetFieldName,
26 inputOverride = {},
27 optionsOverride = {},
28 } = input;
29
30const { apifyClient } = Actor;
31
32
33const targetClient = targetType === 'TASK' ? apifyClient.task(targetId) : apifyClient.actor(targetId);
34
35if (!await targetClient.get()) {
36 await Actor.fail(`The ${targetType} "${targetId}" was not found.`);
37}
38
39
40const formatFunction = format === 'requestListSources' ? (url) => ({url}) : (value) => value;
41
42
43
44const datasetAsArray = [];
45
46await Actor.setStatusMessage('Loading data from dataset...');
47
48
49let offset = 0, total = 0, items = [];
50do {
51 const response = await apifyClient.dataset(datasetId).listItems({
52 fields: [ datasetFieldName ],
53 offset,
54 limit: 200,
55 });
56 items = response.items;
57 total = response.total;
58 offset += items.length;
59
60 items.forEach(sourceItem => {
61
62 const targetItem = formatFunction(sourceItem[datasetFieldName]);
63
64 datasetAsArray.push(targetItem);
65 });
66
67 await Actor.setStatusMessage(`Loaded ${datasetAsArray.length}/${total} dataset items.`);
68} while(items.length > 0);
69
70
71inputOverride[targetFieldName] = datasetAsArray;
72
73await Actor.setStatusMessage(`Dataset loaded, starting target ${targetType} ${targetId}`);
74
75
76await targetClient.start(inputOverride, { ...optionsOverride, waitForFinish: 0});
77
78await Actor.exit();