apify-cli 0.21.1 → 0.21.2-beta.1

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,23 @@
1
+ import { ApifyCommand } from '../../lib/apify_command.js';
2
+ /**
3
+ * This command can be used to charge for a specific event in the pay-per-event Actor run.
4
+ * - If run locally or with the --test-pay-per-event flag, it will only log the charge request, without actually charging.
5
+ * - If run in the Actor run on Apify platform without the testing flag, it will charge the specified amount of events.
6
+ *
7
+ * Future TODOs:
8
+ * - Add logic to work with the max charge USD to prevent exceeding the charging limit.
9
+ * - Add logic to store events in the log dataset for later inspection to aid local development.
10
+ */
11
+ export declare class ChargeCommand extends ApifyCommand<typeof ChargeCommand> {
12
+ static description: string;
13
+ static args: {
14
+ eventName: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
15
+ };
16
+ static flags: {
17
+ count: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'idempotency-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'test-pay-per-event': import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=charge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charge.d.ts","sourceRoot":"","sources":["../../../src/commands/actor/charge.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,YAAY,CAAC,OAAO,aAAa,CAAC;IACpE,OAAgB,WAAW,SAAiE;IAE5F,OAAgB,IAAI;;MAKlB;IAEF,OAAgB,KAAK;;;;MAenB;IAEI,GAAG;CAgDT"}
@@ -0,0 +1,82 @@
1
+ import { APIFY_ENV_VARS } from '@apify/consts';
2
+ import { Args, Flags } from '@oclif/core';
3
+ import { getApifyTokenFromEnvOrAuthFile } from '../../lib/actor.js';
4
+ import { ApifyCommand } from '../../lib/apify_command.js';
5
+ import { info } from '../../lib/outputs.js';
6
+ import { getLoggedClient } from '../../lib/utils.js';
7
+ /**
8
+ * This command can be used to charge for a specific event in the pay-per-event Actor run.
9
+ * - If run locally or with the --test-pay-per-event flag, it will only log the charge request, without actually charging.
10
+ * - If run in the Actor run on Apify platform without the testing flag, it will charge the specified amount of events.
11
+ *
12
+ * Future TODOs:
13
+ * - Add logic to work with the max charge USD to prevent exceeding the charging limit.
14
+ * - Add logic to store events in the log dataset for later inspection to aid local development.
15
+ */
16
+ export class ChargeCommand extends ApifyCommand {
17
+ static description = 'Charge for a specific event in the pay-per-event Actor run.';
18
+ static args = {
19
+ eventName: Args.string({
20
+ description: 'Name of the event to charge for',
21
+ required: true,
22
+ }),
23
+ };
24
+ static flags = {
25
+ 'count': Flags.integer({
26
+ description: 'Number of events to charge',
27
+ required: false,
28
+ default: 1,
29
+ }),
30
+ 'idempotency-key': Flags.string({
31
+ description: 'Idempotency key for the charge request',
32
+ required: false,
33
+ }),
34
+ 'test-pay-per-event': Flags.boolean({
35
+ description: 'Test pay-per-event charging without actually charging',
36
+ required: false,
37
+ default: false,
38
+ }),
39
+ };
40
+ async run() {
41
+ const { eventName } = this.args;
42
+ const { count, testPayPerEvent, idempotencyKey } = this.flags;
43
+ const isAtHome = Boolean(process.env.APIFY_IS_AT_HOME);
44
+ if (!isAtHome) {
45
+ info({
46
+ message: `No platform detected: would charge ${count} events of type "${eventName}" with idempotency key "${idempotencyKey ?? 'not-provided'}".`,
47
+ stdout: true,
48
+ });
49
+ return;
50
+ }
51
+ if (testPayPerEvent) {
52
+ info({
53
+ message: `PPE test mode: would charge ${count} events of type "${eventName}" with idempotency key "${idempotencyKey ?? 'not-provided'}".`,
54
+ stdout: true,
55
+ });
56
+ return;
57
+ }
58
+ const apifyToken = await getApifyTokenFromEnvOrAuthFile();
59
+ const apifyClient = await getLoggedClient(apifyToken);
60
+ if (!apifyClient) {
61
+ throw new Error('Apify token is not set. Please set it using the environment variable APIFY_TOKEN.');
62
+ }
63
+ const runId = process.env[APIFY_ENV_VARS.ACTOR_RUN_ID];
64
+ if (!runId) {
65
+ throw new Error('Charge command must be executed in a running Actor. Run ID not found.');
66
+ }
67
+ const run = await apifyClient.run(runId).get();
68
+ if (run?.pricingInfo?.pricingModel !== 'PAY_PER_EVENT') {
69
+ throw new Error('Charge command can only be used with pay-per-event pricing model.');
70
+ }
71
+ info({
72
+ message: `Charging ${count} events of type "${eventName}" with idempotency key "${idempotencyKey ?? 'not-provided'}" (runId: ${runId}).`,
73
+ stdout: true,
74
+ });
75
+ await apifyClient.run(runId).charge({
76
+ eventName,
77
+ count,
78
+ idempotencyKey,
79
+ });
80
+ }
81
+ }
82
+ //# sourceMappingURL=charge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charge.js","sourceRoot":"","sources":["../../../src/commands/actor/charge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAkC;IACpE,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,IAAI,GAAG;QACtB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,IAAI;SACd,CAAC;KACF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACvB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;YACtB,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC;SACV,CAAC;QACF,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC;YAC/B,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,KAAK;SACf,CAAC;QACF,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC;YACnC,WAAW,EAAE,uDAAuD;YACpE,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;SACd,CAAC;KACF,CAAC;IAEF,KAAK,CAAC,GAAG;QACR,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAChC,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAE9D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC;gBACJ,OAAO,EAAE,sCAAsC,KAAK,oBAAoB,SAAS,2BAA2B,cAAc,IAAI,cAAc,IAAI;gBAChJ,MAAM,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACrB,IAAI,CAAC;gBACJ,OAAO,EAAE,+BAA+B,KAAK,oBAAoB,SAAS,2BAA2B,cAAc,IAAI,cAAc,IAAI;gBACzI,MAAM,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,OAAO;QACR,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,8BAA8B,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAEvD,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,GAAG,EAAE,WAAW,EAAE,YAAY,KAAK,eAAe,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC;YACJ,OAAO,EAAE,YAAY,KAAK,oBAAoB,SAAS,2BAA2B,cAAc,IAAI,cAAc,aAAa,KAAK,IAAI;YACxI,MAAM,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YACnC,SAAS;YACT,KAAK;YACL,cAAc;SACd,CAAC,CAAC;IACJ,CAAC"}
@@ -6,6 +6,11 @@ export declare const APIFY_STORAGE_TYPES: {
6
6
  readonly DATASET: "DATASET";
7
7
  readonly REQUEST_QUEUE: "REQUEST_QUEUE";
8
8
  };
9
+ /**
10
+ * Returns Apify token from environment variable or local auth file.
11
+ * @returns Apify token
12
+ */
13
+ export declare const getApifyTokenFromEnvOrAuthFile: () => Promise<string>;
9
14
  /**
10
15
  * Returns instance of ApifyClient or ApifyStorageLocal based on environment variables.
11
16
  * @param options - ApifyClient options
@@ -1 +1 @@
1
- {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAe,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,aACxB,oBAAoB,GAAG,kBAAkB,2BAEhD,OAAO,CAAC,aAAa,CA2BvB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,cAAe,CAAC,OAAO,mBAAmB,EAAE,MAAM,OAAO,mBAAmB,CAAC,WAI5G,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAe,MAAM,kBAU7D,CAAC;AAEF,eAAO,MAAM,2BAA2B,qBAEvC,CAAC"}
1
+ {"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiB,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAe,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,8BAA8B,uBAc1C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,aACxB,oBAAoB,GAAG,kBAAkB,2BAEhD,OAAO,CAAC,aAAa,CAevB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,cAAe,CAAC,OAAO,mBAAmB,EAAE,MAAM,OAAO,mBAAmB,CAAC,WAI5G,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAe,MAAM,kBAU7D,CAAC;AAEF,eAAO,MAAM,2BAA2B,qBAEvC,CAAC"}
package/dist/lib/actor.js CHANGED
@@ -11,6 +11,21 @@ export const APIFY_STORAGE_TYPES = {
11
11
  DATASET: 'DATASET',
12
12
  REQUEST_QUEUE: 'REQUEST_QUEUE',
13
13
  };
14
+ /**
15
+ * Returns Apify token from environment variable or local auth file.
16
+ * @returns Apify token
17
+ */
18
+ export const getApifyTokenFromEnvOrAuthFile = async () => {
19
+ const apifyToken = process.env[APIFY_ENV_VARS.TOKEN];
20
+ if (apifyToken) {
21
+ return apifyToken;
22
+ }
23
+ const localUserInfo = await getLocalUserInfo();
24
+ if (!localUserInfo || !localUserInfo.token) {
25
+ throw new Error('Apify token is not set. Please set it using the environment variable APIFY_TOKEN or apify login command.');
26
+ }
27
+ return localUserInfo.token;
28
+ };
14
29
  /**
15
30
  * Returns instance of ApifyClient or ApifyStorageLocal based on environment variables.
16
31
  * @param options - ApifyClient options
@@ -24,15 +39,7 @@ export const getApifyStorageClient = async (options = {}, forceCloud = Reflect.h
24
39
  ...options,
25
40
  });
26
41
  }
27
- // NOTE: Token in env var overrides token in local auth file.
28
- let apifyToken = process.env[APIFY_ENV_VARS.TOKEN];
29
- if (!apifyToken) {
30
- const localUserInfo = await getLocalUserInfo();
31
- if (!localUserInfo || !localUserInfo.token) {
32
- throw new Error('Apify token is not set. Please set it using the environment variable APIFY_TOKEN or apify login command.');
33
- }
34
- apifyToken = localUserInfo.token;
35
- }
42
+ const apifyToken = await getApifyTokenFromEnvOrAuthFile();
36
43
  return new ApifyClient({
37
44
  ...getApifyClientOptions(apifyToken),
38
45
  ...options,
@@ -1 +1 @@
1
- {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"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"}