apify-test-tools 0.9.1-beta.1 → 0.9.1-beta.11

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 (145) hide show
  1. package/.github/CODEOWNERS +1 -1
  2. package/.github/actionlint.yaml +12 -0
  3. package/.github/actions/checkout-restore-dependencies/action.yaml +94 -0
  4. package/.github/review-prompt.md +154 -0
  5. package/.github/scripts/check-major-tag-refs.mjs +72 -0
  6. package/.github/scripts/check-package-version-bump.mjs +74 -0
  7. package/.github/scripts/run-with-apify-tokens.mjs +104 -0
  8. package/.github/workflows/_check_code.yaml +16 -0
  9. package/.github/workflows/_move_major_tag.yaml +108 -0
  10. package/.github/workflows/_update_release_metadata.yaml +12 -0
  11. package/.github/workflows/manual_move_major_tag.yaml +26 -0
  12. package/.github/workflows/manual_release_stable.yaml +12 -0
  13. package/.github/workflows/on_master.yaml +11 -0
  14. package/.github/workflows/on_pull_request.yaml +49 -1
  15. package/.github/workflows/public_claude.yaml +101 -0
  16. package/.github/workflows/public_platform-tests-claude-investigate-and-fix.yaml +208 -0
  17. package/.github/workflows/public_platform-tests.yaml +63 -0
  18. package/.github/workflows/public_pr-build-test.yaml +175 -0
  19. package/.github/workflows/public_push-build-latest.yaml +44 -0
  20. package/.github/workflows/public_review.yaml +107 -0
  21. package/.github/workflows-package-version +1 -0
  22. package/.prettierignore +9 -0
  23. package/.vscode/settings.json +2 -1
  24. package/CHANGELOG.md +15 -0
  25. package/CONTRIBUTING.md +53 -2
  26. package/README.md +229 -36
  27. package/bin/build-from-local.ts +23 -28
  28. package/bin/build.ts +82 -70
  29. package/bin/main.ts +2 -1
  30. package/bin/types.ts +0 -11
  31. package/bin/utils/config/load-config.ts +133 -0
  32. package/bin/utils/config/parser.ts +89 -0
  33. package/bin/utils/config/structures/base.ts +65 -0
  34. package/bin/utils/config/structures/grouped.ts +40 -0
  35. package/bin/utils/config/structures/legacy.ts +22 -0
  36. package/bin/utils/json-file.ts +55 -0
  37. package/bin/utils.ts +5 -150
  38. package/dist/bin/build-from-local.d.ts +2 -2
  39. package/dist/bin/build-from-local.d.ts.map +1 -1
  40. package/dist/bin/build-from-local.js +20 -19
  41. package/dist/bin/build-from-local.js.map +1 -1
  42. package/dist/bin/build.d.ts +7 -11
  43. package/dist/bin/build.d.ts.map +1 -1
  44. package/dist/bin/build.js +51 -50
  45. package/dist/bin/build.js.map +1 -1
  46. package/dist/bin/main.d.ts.map +1 -1
  47. package/dist/bin/main.js +2 -1
  48. package/dist/bin/main.js.map +1 -1
  49. package/dist/bin/types.d.ts +0 -9
  50. package/dist/bin/types.d.ts.map +1 -1
  51. package/dist/bin/utils/config/load-config.d.ts +13 -0
  52. package/dist/bin/utils/config/load-config.d.ts.map +1 -0
  53. package/dist/bin/utils/config/load-config.js +99 -0
  54. package/dist/bin/utils/config/load-config.js.map +1 -0
  55. package/dist/bin/utils/config/parser.d.ts +19 -0
  56. package/dist/bin/utils/config/parser.d.ts.map +1 -0
  57. package/dist/bin/utils/config/parser.js +73 -0
  58. package/dist/bin/utils/config/parser.js.map +1 -0
  59. package/dist/bin/utils/config/structures/base.d.ts +36 -0
  60. package/dist/bin/utils/config/structures/base.d.ts.map +1 -0
  61. package/dist/bin/utils/config/structures/base.js +41 -0
  62. package/dist/bin/utils/config/structures/base.js.map +1 -0
  63. package/dist/bin/utils/config/structures/grouped.d.ts +6 -0
  64. package/dist/bin/utils/config/structures/grouped.d.ts.map +1 -0
  65. package/dist/bin/utils/config/structures/grouped.js +29 -0
  66. package/dist/bin/utils/config/structures/grouped.js.map +1 -0
  67. package/dist/bin/utils/config/structures/legacy.d.ts +6 -0
  68. package/dist/bin/utils/config/structures/legacy.d.ts.map +1 -0
  69. package/dist/bin/utils/config/structures/legacy.js +14 -0
  70. package/dist/bin/utils/config/structures/legacy.js.map +1 -0
  71. package/dist/bin/utils/json-file.d.ts +20 -0
  72. package/dist/bin/utils/json-file.d.ts.map +1 -0
  73. package/dist/bin/utils/json-file.js +42 -0
  74. package/dist/bin/utils/json-file.js.map +1 -0
  75. package/dist/bin/utils.d.ts +5 -8
  76. package/dist/bin/utils.d.ts.map +1 -1
  77. package/dist/bin/utils.js +4 -107
  78. package/dist/bin/utils.js.map +1 -1
  79. package/dist/lib/consts.d.ts +1 -0
  80. package/dist/lib/consts.d.ts.map +1 -1
  81. package/dist/lib/consts.js +3 -0
  82. package/dist/lib/consts.js.map +1 -1
  83. package/dist/lib/lib.d.ts +10 -0
  84. package/dist/lib/lib.d.ts.map +1 -1
  85. package/dist/lib/lib.js +24 -18
  86. package/dist/lib/lib.js.map +1 -1
  87. package/dist/lib/types.d.ts +11 -3
  88. package/dist/lib/types.d.ts.map +1 -1
  89. package/dist/test/unit/bin/utils/config/load-config.test.d.ts +2 -0
  90. package/dist/test/unit/bin/utils/config/load-config.test.d.ts.map +1 -0
  91. package/dist/test/unit/bin/utils/config/load-config.test.js +139 -0
  92. package/dist/test/unit/bin/utils/config/load-config.test.js.map +1 -0
  93. package/dist/test/unit/bin/utils/config/parser.test.d.ts +2 -0
  94. package/dist/test/unit/bin/utils/config/parser.test.d.ts.map +1 -0
  95. package/dist/test/unit/bin/utils/config/parser.test.js +129 -0
  96. package/dist/test/unit/bin/utils/config/parser.test.js.map +1 -0
  97. package/dist/test/unit/bin/utils/config/structures/base.test.d.ts +2 -0
  98. package/dist/test/unit/bin/utils/config/structures/base.test.d.ts.map +1 -0
  99. package/dist/test/unit/bin/utils/config/structures/base.test.js +74 -0
  100. package/dist/test/unit/bin/utils/config/structures/base.test.js.map +1 -0
  101. package/dist/test/unit/bin/utils/config/structures/grouped.test.d.ts +2 -0
  102. package/dist/test/unit/bin/utils/config/structures/grouped.test.d.ts.map +1 -0
  103. package/dist/test/unit/bin/utils/config/structures/grouped.test.js +75 -0
  104. package/dist/test/unit/bin/utils/config/structures/grouped.test.js.map +1 -0
  105. package/dist/test/unit/bin/utils/config/structures/legacy.test.d.ts +2 -0
  106. package/dist/test/unit/bin/utils/config/structures/legacy.test.d.ts.map +1 -0
  107. package/dist/test/unit/bin/utils/config/structures/legacy.test.js +63 -0
  108. package/dist/test/unit/bin/utils/config/structures/legacy.test.js.map +1 -0
  109. package/dist/test/unit/bin/utils/files.test.d.ts +2 -0
  110. package/dist/test/unit/bin/utils/files.test.d.ts.map +1 -0
  111. package/dist/test/unit/bin/utils/files.test.js +117 -0
  112. package/dist/test/unit/bin/utils/files.test.js.map +1 -0
  113. package/dist/test/unit/lib.test.d.ts +2 -0
  114. package/dist/test/unit/lib.test.d.ts.map +1 -0
  115. package/dist/test/unit/lib.test.js +37 -0
  116. package/dist/test/unit/lib.test.js.map +1 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -1
  118. package/lib/consts.ts +4 -0
  119. package/lib/lib.ts +32 -20
  120. package/lib/types.ts +11 -3
  121. package/package.json +5 -2
  122. package/test/fixtures/bin/utils/files/array.json +1 -0
  123. package/test/fixtures/bin/utils/files/comments.jsonc +4 -0
  124. package/test/fixtures/bin/utils/files/directory.json/.gitkeep +0 -0
  125. package/test/fixtures/bin/utils/files/empty-object.json +1 -0
  126. package/test/fixtures/bin/utils/files/empty.json +0 -0
  127. package/test/fixtures/bin/utils/files/malformed.json +1 -0
  128. package/test/fixtures/bin/utils/files/nested.json +6 -0
  129. package/test/fixtures/bin/utils/files/no-json-extension.actorrc +1 -0
  130. package/test/fixtures/bin/utils/files/null.json +1 -0
  131. package/test/fixtures/bin/utils/files/number.json +1 -0
  132. package/test/fixtures/bin/utils/files/unreadable.json +1 -0
  133. package/test/tsconfig.json +4 -2
  134. package/test/unit/bin/utils/config/load-config.test.ts +180 -0
  135. package/test/unit/bin/utils/config/parser.test.ts +158 -0
  136. package/test/unit/bin/utils/config/structures/base.test.ts +83 -0
  137. package/test/unit/bin/utils/config/structures/grouped.test.ts +90 -0
  138. package/test/unit/bin/utils/config/structures/legacy.test.ts +78 -0
  139. package/test/unit/bin/utils/files.test.ts +158 -0
  140. package/test/unit/lib.test.ts +53 -0
  141. package/dist/test/unit/bin/utils.test.d.ts +0 -2
  142. package/dist/test/unit/bin/utils.test.d.ts.map +0 -1
  143. package/dist/test/unit/bin/utils.test.js +0 -321
  144. package/dist/test/unit/bin/utils.test.js.map +0 -1
  145. package/test/unit/bin/utils.test.ts +0 -381
@@ -0,0 +1,73 @@
1
+ import z from 'zod';
2
+ import { CONFIG_FILE_STRATEGY } from './structures/base.js';
3
+ import { GROUPED_PARSER } from './structures/grouped.js';
4
+ import { LEGACY_PARSER } from './structures/legacy.js';
5
+ const CONFIG_FILE_STRATEGIES = {
6
+ [CONFIG_FILE_STRATEGY.LEGACY]: LEGACY_PARSER,
7
+ [CONFIG_FILE_STRATEGY.GROUPED]: GROUPED_PARSER,
8
+ };
9
+ const ModeSelectionSchema = z.object({ mode: z.enum(CONFIG_FILE_STRATEGY).default(CONFIG_FILE_STRATEGY.LEGACY) });
10
+ function selectStrategy(mode) {
11
+ const parsed = ModeSelectionSchema.safeParse(mode);
12
+ if (!parsed.success) {
13
+ throw new Error(z.prettifyError(parsed.error));
14
+ }
15
+ return CONFIG_FILE_STRATEGIES[parsed.data.mode];
16
+ }
17
+ // Strips a trailing slash so config-declared paths ("actors/shopify/" vs "actors/shopify") compare equal.
18
+ const stripTrailingSlash = (pathValue) => pathValue.replace(/\/+$/, '');
19
+ // The repo root may be written as ".", "./", "/" or ""; everything downstream spells it "".
20
+ const normalizeFolder = (folder) => {
21
+ const stripped = stripTrailingSlash(folder);
22
+ return stripped === '.' ? '' : stripped;
23
+ };
24
+ /**
25
+ * Normalizes the paths the user wrote and checks the cross-entry invariants a per-entry schema
26
+ * cannot: that no two actors claim the same folder once normalized, nor the same actor on the
27
+ * platform. Collects every violation before throwing, so one run reports all of them rather than
28
+ * only the first.
29
+ *
30
+ * @returns the actors it vouched for, with their paths normalized.
31
+ * @throws Error listing every problem found.
32
+ */
33
+ function verifyConfiguration(body) {
34
+ const seenFolders = new Set();
35
+ const seenActorFullNames = new Set();
36
+ const errors = [];
37
+ const normalized = body.map((entry) => ({
38
+ ...entry,
39
+ folder: normalizeFolder(entry.folder),
40
+ overrideActorContext: entry.overrideActorContext?.map(stripTrailingSlash),
41
+ }));
42
+ for (const [index, entry] of normalized.entries()) {
43
+ // TODO: drop folder uniqueness (this requires several changes on other places)
44
+ if (seenFolders.has(entry.folder)) {
45
+ errors.push(`Duplicate folder "${body[index].folder}". Each actor must have a unique folder.`);
46
+ }
47
+ else {
48
+ seenFolders.add(entry.folder);
49
+ }
50
+ if (seenActorFullNames.has(entry.actorFullName)) {
51
+ errors.push(`Duplicate actor "${entry.actorFullName}". Each entry must point at a different actor.`);
52
+ }
53
+ else {
54
+ seenActorFullNames.add(entry.actorFullName);
55
+ }
56
+ }
57
+ if (errors.length > 0) {
58
+ throw new Error(errors.join('\n'));
59
+ }
60
+ return normalized;
61
+ }
62
+ // eslint-disable-next-line no-underscore-dangle
63
+ export const _privates = {
64
+ selectStrategy,
65
+ verifyConfiguration,
66
+ };
67
+ export function parseConfigFile(body) {
68
+ const strategy = selectStrategy(body);
69
+ const resolved = strategy.parse(body);
70
+ const validated = verifyConfiguration(resolved);
71
+ return validated;
72
+ }
73
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../bin/utils/config/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { type ZodType } from 'zod';
2
+ export declare const ACTOR_FULL_NAME_REGEX: RegExp;
3
+ export interface ResolvedActorConfig {
4
+ actorFullName: string;
5
+ folder: string;
6
+ tokenEnvVar: string;
7
+ overrideActorContext: string[] | undefined;
8
+ }
9
+ export declare enum CONFIG_FILE_STRATEGY {
10
+ LEGACY = "legacy",
11
+ GROUPED = "grouped"
12
+ }
13
+ export type StrategyParser = {
14
+ mode: CONFIG_FILE_STRATEGY;
15
+ parse: (body: Record<string, unknown>) => ResolvedActorConfig[];
16
+ };
17
+ export declare function defineStrategy<T extends Record<string, unknown>, Mode extends CONFIG_FILE_STRATEGY>(mode: Mode, schema: ZodType<T>, resolve: (body: T) => ResolvedActorConfig[]): {
18
+ mode: Mode;
19
+ /**
20
+ *
21
+ * @param body raw config file to be read
22
+ * @returns ResolvedActorConfig[] if the config file is valid, otherwise throws an error with a description of the issues.
23
+ * @throws Error if the config file is invalid.
24
+ * @example
25
+ * ```ts
26
+ * const strategy = defineStrategy(CONFIG_FILE_STRATEGY.LEGACY, schema, resolve);
27
+ * const resolvedActors = strategy.parse(configFileContents);
28
+ * ```
29
+ *
30
+ * This function is used to parse the config file according to the strategy defined by the user.
31
+ * It uses the schema defined in the strategy to validate the config file and resolve it into a list of ResolvedActorConfig.
32
+ * If the config file is invalid, it throws an error with a description of the issues.
33
+ */
34
+ parse: (body: Record<string, unknown>) => ResolvedActorConfig[];
35
+ };
36
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAQlD,eAAO,MAAM,qBAAqB,QAGjC,CAAC;AAKF,MAAM,WAAW,mBAAmB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC9C;AAED,oBAAY,oBAAoB;IAC5B,MAAM,WAAW;IACjB,OAAO,YAAY;CACtB;AAED,MAAM,MAAM,cAAc,GAAG;IACzB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,mBAAmB,EAAE,CAAC;CACnE,CAAC;AAEF,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAS,oBAAoB,EAE/F,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAClB,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,mBAAmB,EAAE;;IAIvC;;;;;;;;;;;;;;OAcG;kBACW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;EAQ5C"}
@@ -0,0 +1,41 @@
1
+ import { prettifyError } from 'zod';
2
+ import { ACTOR_NAME, USERNAME } from '@apify/consts';
3
+ function stripRegexAnchor(regex) {
4
+ return regex.replace(/^\^/, '').replace(/\$$/, '');
5
+ }
6
+ export const ACTOR_FULL_NAME_REGEX = new RegExp(`^${stripRegexAnchor(USERNAME.REGEX.source)}/${stripRegexAnchor(ACTOR_NAME.REGEX.source)}$`, USERNAME.REGEX.flags + ACTOR_NAME.REGEX.flags);
7
+ export var CONFIG_FILE_STRATEGY;
8
+ (function (CONFIG_FILE_STRATEGY) {
9
+ CONFIG_FILE_STRATEGY["LEGACY"] = "legacy";
10
+ CONFIG_FILE_STRATEGY["GROUPED"] = "grouped";
11
+ })(CONFIG_FILE_STRATEGY || (CONFIG_FILE_STRATEGY = {}));
12
+ export function defineStrategy(
13
+ // mode is transparent so it can be validated with & { mode: Mode }
14
+ mode, schema, resolve) {
15
+ return {
16
+ mode,
17
+ /**
18
+ *
19
+ * @param body raw config file to be read
20
+ * @returns ResolvedActorConfig[] if the config file is valid, otherwise throws an error with a description of the issues.
21
+ * @throws Error if the config file is invalid.
22
+ * @example
23
+ * ```ts
24
+ * const strategy = defineStrategy(CONFIG_FILE_STRATEGY.LEGACY, schema, resolve);
25
+ * const resolvedActors = strategy.parse(configFileContents);
26
+ * ```
27
+ *
28
+ * This function is used to parse the config file according to the strategy defined by the user.
29
+ * It uses the schema defined in the strategy to validate the config file and resolve it into a list of ResolvedActorConfig.
30
+ * If the config file is invalid, it throws an error with a description of the issues.
31
+ */
32
+ parse: (body) => {
33
+ const parsed = schema.safeParse(body);
34
+ if (parsed.success) {
35
+ return resolve(parsed.data);
36
+ }
37
+ throw new Error(prettifyError(parsed.error));
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgB,MAAM,KAAK,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErD,SAAS,gBAAgB,CAAC,KAAa;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,MAAM,CAC3C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAC3F,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAChD,CAAC;AAYF,MAAM,CAAN,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC5B,yCAAiB,CAAA;IACjB,2CAAmB,CAAA;AACvB,CAAC,EAHW,oBAAoB,KAApB,oBAAoB,QAG/B;AAOD,MAAM,UAAU,cAAc;AAC1B,mEAAmE;AACnE,IAAU,EACV,MAAkB,EAClB,OAA2C;IAE3C,OAAO;QACH,IAAI;QACJ;;;;;;;;;;;;;;WAcG;QACH,KAAK,EAAE,CAAC,IAA6B,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,CAAC;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CONFIG_FILE_STRATEGY } from './base.js';
2
+ export declare const GROUPED_PARSER: {
3
+ mode: CONFIG_FILE_STRATEGY.GROUPED;
4
+ parse: (body: Record<string, unknown>) => import("./base.js").ResolvedActorConfig[];
5
+ };
6
+ //# sourceMappingURL=grouped.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.d.ts","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/grouped.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,oBAAoB,EAAkB,MAAM,WAAW,CAAC;AA2BxF,eAAO,MAAM,cAAc;;;CAUzB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import z from 'zod';
2
+ import { ACTOR_FULL_NAME_REGEX, CONFIG_FILE_STRATEGY, defineStrategy } from './base.js';
3
+ const schema = z.object({
4
+ groups: z
5
+ .record(z.string(), z.object({
6
+ actors: z
7
+ .array(z.object({
8
+ folder: z.string(),
9
+ actorFullName: z.string().regex(ACTOR_FULL_NAME_REGEX),
10
+ // these allow overrides from stuff set at the group level
11
+ tokenEnvVar: z.string().optional(),
12
+ overrideActorContext: z.array(z.string()).optional(),
13
+ }))
14
+ .min(1),
15
+ tokenEnvVar: z.string(),
16
+ overrideActorContext: z.array(z.string()).optional(),
17
+ }))
18
+ .refine((data) => Object.keys(data).length > 0, 'Invalid input: At least one configuration group is required.'),
19
+ });
20
+ export const GROUPED_PARSER = defineStrategy(CONFIG_FILE_STRATEGY.GROUPED, schema, (body) => {
21
+ const entries = Object.entries(body.groups);
22
+ return entries.flatMap(([_folder, entry]) => entry.actors.map((actor) => ({
23
+ tokenEnvVar: entry.tokenEnvVar,
24
+ overrideActorContext: entry.overrideActorContext,
25
+ // last so actor can override stuff from the group
26
+ ...actor,
27
+ })));
28
+ });
29
+ //# sourceMappingURL=grouped.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouped.js","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/grouped.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAExF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC;SACJ,MAAM,CACH,CAAC,CAAC,MAAM,EAAE,EACV,CAAC,CAAC,MAAM,CAAC;QACL,MAAM,EAAE,CAAC;aACJ,KAAK,CACF,CAAC,CAAC,MAAM,CAAC;YACL,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;YAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;YACtD,0DAA0D;YAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAClC,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;SACvD,CAAC,CACL;aACA,GAAG,CAAC,CAAC,CAAC;QACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC,CACL;SACA,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,8DAA8D,CAAC;CACtH,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAmB,EAAE,EAAE;IACvG,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CACxC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,kDAAkD;QAClD,GAAG,KAAK;KACX,CAAC,CAAC,CACN,CAAC;AACN,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { CONFIG_FILE_STRATEGY } from './base.js';
2
+ export declare const LEGACY_PARSER: {
3
+ mode: CONFIG_FILE_STRATEGY.LEGACY;
4
+ parse: (body: Record<string, unknown>) => import("./base.js").ResolvedActorConfig[];
5
+ };
6
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/legacy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,oBAAoB,EAAkB,MAAM,WAAW,CAAC;AAiBxF,eAAO,MAAM,aAAa;;;CAEzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import z from 'zod';
2
+ import { ACTOR_FULL_NAME_REGEX, CONFIG_FILE_STRATEGY, defineStrategy } from './base.js';
3
+ const schema = z.object({
4
+ actors: z
5
+ .array(z.object({
6
+ folder: z.string(),
7
+ actorFullName: z.string().regex(ACTOR_FULL_NAME_REGEX),
8
+ tokenEnvVar: z.string(),
9
+ overrideActorContext: z.array(z.string()).optional(),
10
+ }))
11
+ .min(1),
12
+ });
13
+ export const LEGACY_PARSER = defineStrategy(CONFIG_FILE_STRATEGY.LEGACY, schema, (body) => body.actors.map((x) => ({ overrideActorContext: undefined, ...x })));
14
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../../../../bin/utils/config/structures/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAExF,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC;SACJ,KAAK,CACF,CAAC,CAAC,MAAM,CAAC;QACL,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC;QACtD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;KACvD,CAAC,CACL;SACA,GAAG,CAAC,CAAC,CAAC;CACd,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,IAAkB,EAAE,EAAE,CACpG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CACtE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Why a JSON object could not be produced from a path. Callers that already have their own
3
+ * user-facing wording (e.g. the config file reader) switch on this instead of re-deriving the
4
+ * cause from an error message.
5
+ */
6
+ export type JsonObjectReadFailureReason = 'not-a-file' | 'unreadable' | 'invalid-json' | 'not-an-object';
7
+ export type JsonObjectReadResult = {
8
+ success: true;
9
+ contents: Record<string, unknown>;
10
+ } | {
11
+ success: false;
12
+ reason: JsonObjectReadFailureReason;
13
+ failure: Error;
14
+ };
15
+ /**
16
+ * Reads a file and parses it as a JSON object, reporting every way that can go wrong as a value
17
+ * instead of a thrown error — the caller decides which failures are fatal and how to word them.
18
+ */
19
+ export declare function safeReadJsonObjectFile(path: string): JsonObjectReadResult;
20
+ //# sourceMappingURL=json-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-file.d.ts","sourceRoot":"","sources":["../../../bin/utils/json-file.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;AAEzG,MAAM,MAAM,oBAAoB,GAC1B;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACpD;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,CAAC;AAQ9E;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CA+BzE"}
@@ -0,0 +1,42 @@
1
+ import { readFileSync, statSync } from 'node:fs';
2
+ const failed = (reason, message) => ({
3
+ success: false,
4
+ reason,
5
+ failure: new Error(message),
6
+ });
7
+ /**
8
+ * Reads a file and parses it as a JSON object, reporting every way that can go wrong as a value
9
+ * instead of a thrown error — the caller decides which failures are fatal and how to word them.
10
+ */
11
+ export function safeReadJsonObjectFile(path) {
12
+ let file;
13
+ try {
14
+ // `stat`, not `lstat`: a symlink must resolve to its target, matching what `readFile` does below.
15
+ const stats = statSync(path);
16
+ if (!stats.isFile()) {
17
+ return failed('not-a-file', `Expected ${path} to be a file`);
18
+ }
19
+ file = readFileSync(path, 'utf8');
20
+ }
21
+ catch {
22
+ return failed('unreadable', `Expected ${path} to exist or be readable`);
23
+ }
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(file);
27
+ }
28
+ catch (err) {
29
+ return failed('invalid-json', `Failed to parse ${path}: ${err}`);
30
+ }
31
+ if (parsed === null) {
32
+ return failed('not-an-object', `Expected ${path} to be a JSON object, not null`);
33
+ }
34
+ if (Array.isArray(parsed)) {
35
+ return failed('not-an-object', `Expected ${path} to be a JSON object, not an array`);
36
+ }
37
+ if (typeof parsed !== 'object') {
38
+ return failed('not-an-object', `Expected ${path} to be a JSON object`);
39
+ }
40
+ return { success: true, contents: parsed };
41
+ }
42
+ //# sourceMappingURL=json-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-file.js","sourceRoot":"","sources":["../../../bin/utils/json-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAajD,MAAM,MAAM,GAAG,CAAC,MAAmC,EAAE,OAAe,EAAwB,EAAE,CAAC,CAAC;IAC5F,OAAO,EAAE,KAAK;IACd,MAAM;IACN,OAAO,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC;CAC9B,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IAC/C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACD,kGAAkG;QAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,YAAY,EAAE,YAAY,IAAI,eAAe,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,YAAY,EAAE,YAAY,IAAI,0BAA0B,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,cAAc,EAAE,mBAAmB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,gCAAgC,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,oCAAoC,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,sBAAsB,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAiC,EAAE,CAAC;AAC1E,CAAC"}
@@ -1,5 +1,3 @@
1
- import type { ActorVersionSourceFile } from 'apify-client';
2
- import type { ActorConfig } from './types.js';
3
1
  export declare const isOutsideDir: (childPath: string, parentPath: string) => boolean;
4
2
  /**
5
3
  * Lists every file under `subDir` (paths relative to `repoRoot`) that's either tracked by git or
@@ -16,14 +14,13 @@ export declare const listRepoFilePaths: (repoRoot: string, subDir: string) => st
16
14
  * pattern matching.
17
15
  */
18
16
  export declare const getGitignoredPaths: (relativePaths: string[]) => Set<string>;
19
- export declare const toActorVersionSourceFile: (absPath: string, rootDir: string) => Promise<ActorVersionSourceFile>;
17
+ export type SourceFile = {
18
+ name: string;
19
+ content: Buffer;
20
+ };
21
+ export declare const readSourceFile: (absPath: string, rootDir: string) => Promise<SourceFile>;
20
22
  export declare const spawnCommandInGhWorkspace: (command: string, args?: string[]) => string;
21
23
  export declare const getEnvVar: (varName: string, defaultValue?: string) => string;
22
- export declare const CONFIG_FILE_NAME = "apify-test-tools.config.json";
23
- export declare const readConfigFile: (selection: {
24
- actors: string[];
25
- ignore: string[];
26
- }) => Promise<ActorConfig[]>;
27
24
  export declare const setCwd: ({ workspace }: {
28
25
  workspace: string | undefined;
29
26
  }) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../bin/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAM3D,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAI/D,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,EAAE,YAAY,MAAM,KAAG,OACZ,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,EAY1E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,MAAM,EAAE,KAAG,GAAG,CAAC,MAAM,CAetE,CAAC;AAIF,eAAO,MAAM,wBAAwB,GAAU,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,sBAAsB,CAM/G,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,EAAE,OAAM,MAAM,EAAO,WAgB7E,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,EAAE,eAAe,MAAM,KAAG,MAMlE,CAAC;AAEF,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAmB/D,eAAO,MAAM,cAAc,GAAU,WAAW;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OAAO,CAAC,WAAW,EAAE,CAiH7G,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,eAAe;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,SAOtE,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../bin/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,GAAI,WAAW,MAAM,EAAE,YAAY,MAAM,KAAG,OACZ,CAAC;AAE1D;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,EAY1E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,eAAe,MAAM,EAAE,KAAG,GAAG,CAAC,MAAM,CAetE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,cAAc,GAAU,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,OAAO,CAAC,UAAU,CAGxF,CAAC;AAEH,eAAO,MAAM,yBAAyB,GAAI,SAAS,MAAM,EAAE,OAAM,MAAM,EAAO,WAgB7E,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,EAAE,eAAe,MAAM,KAAG,MAMlE,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,eAAe;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,SAOtE,CAAC"}
package/dist/bin/utils.js CHANGED
@@ -1,9 +1,6 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  import fs from 'node:fs/promises';
3
3
  import path from 'node:path';
4
- import { SOURCE_FILE_FORMATS } from '@apify/consts';
5
- import { selectActors } from './actor-filtering.js';
6
- import { isPathWithinScope } from './path-utils.js';
7
4
  // Returns true when `childPath` is not inside `parentPath`.
8
5
  // Used to detect monorepo actors whose dockerContextDir escapes the actor directory.
9
6
  export const isOutsideDir = (childPath, parentPath) => path.relative(parentPath, childPath).startsWith('..');
@@ -45,14 +42,10 @@ export const getGitignoredPaths = (relativePaths) => {
45
42
  }
46
43
  return new Set(result.stdout.toString().split('\n').filter(Boolean));
47
44
  };
48
- const isBinary = (buffer) => buffer.includes(0);
49
- export const toActorVersionSourceFile = async (absPath, rootDir) => {
50
- const buffer = await fs.readFile(absPath);
51
- const name = path.relative(rootDir, absPath).split(path.sep).join('/');
52
- return isBinary(buffer)
53
- ? { name, format: SOURCE_FILE_FORMATS.BASE64, content: buffer.toString('base64') }
54
- : { name, format: SOURCE_FILE_FORMATS.TEXT, content: buffer.toString('utf8') };
55
- };
45
+ export const readSourceFile = async (absPath, rootDir) => ({
46
+ name: path.relative(rootDir, absPath).split(path.sep).join('/'),
47
+ content: await fs.readFile(absPath),
48
+ });
56
49
  export const spawnCommandInGhWorkspace = (command, args = []) => {
57
50
  console.error(command, args.join(' '));
58
51
  const commandResult = spawnSync(command, args, { shell: true, maxBuffer: 100 * 1024 * 1024 });
@@ -74,102 +67,6 @@ export const getEnvVar = (varName, defaultValue) => {
74
67
  }
75
68
  return value;
76
69
  };
77
- export const CONFIG_FILE_NAME = 'apify-test-tools.config.json';
78
- // Strips a trailing slash so config-declared paths ("actors/shopify/" vs "actors/shopify") compare equal.
79
- const stripTrailingSlash = (pathValue) => pathValue.replace(/\/+$/, '');
80
- const findOverlappingContextPaths = (contextPaths) => {
81
- for (let i = 0; i < contextPaths.length; i++) {
82
- for (let j = i + 1; j < contextPaths.length; j++) {
83
- if (isPathWithinScope(contextPaths[i], contextPaths[j]) ||
84
- isPathWithinScope(contextPaths[j], contextPaths[i])) {
85
- return [contextPaths[i], contextPaths[j]];
86
- }
87
- }
88
- }
89
- return undefined;
90
- };
91
- export const readConfigFile = async (selection) => {
92
- let raw;
93
- try {
94
- raw = await fs.readFile(CONFIG_FILE_NAME, 'utf-8');
95
- }
96
- catch {
97
- throw new Error(`Config file "${CONFIG_FILE_NAME}" not found in the current directory. ` +
98
- `Please create one with the required actor entries.`);
99
- }
100
- let config;
101
- try {
102
- config = JSON.parse(raw);
103
- }
104
- catch {
105
- throw new Error(`Config file "${CONFIG_FILE_NAME}" contains invalid JSON.`);
106
- }
107
- if (!Array.isArray(config.actors)) {
108
- throw new Error(`Config file "${CONFIG_FILE_NAME}" must have an "actors" array at the top level.`);
109
- }
110
- const seenFolders = new Set();
111
- const actorConfigs = [];
112
- for (const [index, entry] of config.actors.entries()) {
113
- if (typeof entry.folder !== 'string') {
114
- throw new Error(`Invalid "folder" for actor entry at index ${index} in "${CONFIG_FILE_NAME}". ` +
115
- `Must be a string (use "." for a single-actor repo).`);
116
- }
117
- const folder = entry.folder === '.' ? '' : stripTrailingSlash(entry.folder);
118
- if (seenFolders.has(folder)) {
119
- throw new Error(`Duplicate folder "${entry.folder}" in "${CONFIG_FILE_NAME}". Each actor must have a unique folder.`);
120
- }
121
- seenFolders.add(folder);
122
- const nameParts = entry.actorFullName?.split('/');
123
- if (!nameParts || nameParts.length !== 2 || !nameParts[0] || !nameParts[1]) {
124
- throw new Error(`Invalid "actorFullName" for folder "${entry.folder}" in "${CONFIG_FILE_NAME}". ` +
125
- `Must be in "owner/name" format (e.g. "apify/web-scraper").`);
126
- }
127
- if (entry.overrideActorContext !== undefined) {
128
- if (!Array.isArray(entry.overrideActorContext) ||
129
- !entry.overrideActorContext.every((p) => typeof p === 'string')) {
130
- throw new Error(`Invalid "overrideActorContext" for folder "${entry.folder}" in "${CONFIG_FILE_NAME}". ` +
131
- `Must be an array of strings.`);
132
- }
133
- }
134
- const actorJsonPath = folder ? `${folder}/.actor/actor.json` : '.actor/actor.json';
135
- let actorJson;
136
- try {
137
- actorJson = JSON.parse(await fs.readFile(actorJsonPath, 'utf-8'));
138
- }
139
- catch {
140
- throw new Error(`Cannot read "${actorJsonPath}". Every actor entry in "${CONFIG_FILE_NAME}" ` +
141
- `must have a corresponding .actor/actor.json file.`);
142
- }
143
- const actorDotDir = folder ? `${folder}/.actor` : '.actor';
144
- const rawDockerContextDir = actorJson.dockerContextDir ?? '..';
145
- const resolved = path.resolve(process.cwd(), actorDotDir, rawDockerContextDir);
146
- const dockerContextDir = path.relative(process.cwd(), resolved);
147
- if (dockerContextDir.startsWith('..')) {
148
- throw new Error(`"dockerContextDir" for folder "${entry.folder}" resolves outside the repository root. ` +
149
- `Resolved path: "${dockerContextDir}".`);
150
- }
151
- const normalizedDockerContextDir = dockerContextDir === '.' ? '' : dockerContextDir;
152
- const contextPaths = (entry.overrideActorContext ?? [normalizedDockerContextDir]).map(stripTrailingSlash);
153
- // The actor's own folder is always part of its context. When an explicit "overrideActorContext"
154
- // doesn't already cover it, add it automatically instead of failing the workflow.
155
- if (!contextPaths.some((contextPath) => isPathWithinScope(folder, contextPath))) {
156
- contextPaths.push(folder);
157
- }
158
- const overlap = findOverlappingContextPaths(contextPaths);
159
- if (overlap) {
160
- throw new Error(`Invalid context paths for folder "${entry.folder}" in "${CONFIG_FILE_NAME}": ` +
161
- `"${overlap[0]}" and "${overlap[1]}" overlap. Context paths must not be prefixes of one another.`);
162
- }
163
- actorConfigs.push({
164
- actorFullName: entry.actorFullName,
165
- folder,
166
- tokenEnvVar: entry.tokenEnvVar,
167
- dockerContextDir: normalizedDockerContextDir,
168
- contextPaths,
169
- });
170
- }
171
- return selectActors(selection, actorConfigs);
172
- };
173
70
  export const setCwd = ({ workspace }) => {
174
71
  if (workspace) {
175
72
  process.chdir(workspace);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../bin/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../bin/utils.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare const TO_FINISH_WITH_OPTIONS: ToFinishWithOptionsWithDefaults;
4
4
  * Both the test runs and the vitest test specs should finish in this time - 1 hour
5
5
  */
6
6
  export declare const DEFAULT_TEST_RUN_DURATION_MS: number;
7
+ export declare const DEFAULT_TEST_ACTOR_TIMEOUT_SECS: number;
7
8
  /**
8
9
  * Delay before checking the dataset and statistics after a run finishes to resolve eventual consistency.
9
10
  * - This value should ensure that the dataset and statistics are fully updated before any assertions are made.
@@ -1 +1 @@
1
- {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../lib/consts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,sBAAsB,EAAE,+BAUpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAiB,CAAC;AAE3D;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAY,CAAC"}
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../../lib/consts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,YAAY,CAAC;AAElE,eAAO,MAAM,sBAAsB,EAAE,+BAUpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAiB,CAAC;AAI3D,eAAO,MAAM,+BAA+B,QAA2C,CAAC;AAExF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAY,CAAC"}
@@ -13,6 +13,9 @@ export const TO_FINISH_WITH_OPTIONS = {
13
13
  * Both the test runs and the vitest test specs should finish in this time - 1 hour
14
14
  */
15
15
  export const DEFAULT_TEST_RUN_DURATION_MS = 60 * 60 * 1000; // 1 hour
16
+ // Prevent orphaned runs - timeout the Actor 1 minute before the test does so everything is logged correctly.
17
+ // - Otherwise the run link URL can get lost.
18
+ export const DEFAULT_TEST_ACTOR_TIMEOUT_SECS = DEFAULT_TEST_RUN_DURATION_MS / 1000 - 60;
16
19
  /**
17
20
  * Delay before checking the dataset and statistics after a run finishes to resolve eventual consistency.
18
21
  * - This value should ensure that the dataset and statistics are fully updated before any assertions are made.
@@ -1 +1 @@
1
- {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../lib/consts.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAoC;IACnE,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE;QACN,GAAG,EAAE,GAAG,EAAE,UAAU;QACpB,GAAG,EAAE,OAAO,EAAE,SAAS;KAC1B;IACD,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;IAC3B,oBAAoB,EAAE,IAAI;IAC1B,aAAa,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAErE;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa"}
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../lib/consts.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAoC;IACnE,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE;QACN,GAAG,EAAE,GAAG,EAAE,UAAU;QACpB,GAAG,EAAE,OAAO,EAAE,SAAS;KAC1B;IACD,cAAc,EAAE,CAAC;IACjB,eAAe,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;IAC3B,oBAAoB,EAAE,IAAI;IAC1B,aAAa,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAErE,6GAA6G;AAC7G,kDAAkD;AAClD,MAAM,CAAC,MAAM,+BAA+B,GAAG,4BAA4B,GAAG,IAAI,GAAG,EAAE,CAAC;AAExF;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa"}
package/dist/lib/lib.d.ts CHANGED
@@ -3,6 +3,12 @@ import { ExpectStatic } from 'vitest';
3
3
  import { RunTestResult } from './run-test-result.js';
4
4
  import type { ActorTestOptions, RunOptions } from './types.js';
5
5
  export { ExpectStatic };
6
+ /**
7
+ * Platform tests need `TESTER_APIFY_TOKEN` to talk to the platform, so without it we skip them altogether.
8
+ *
9
+ * `RUN_ALL_PLATFORM_TESTS` enables them too because locally we can test against a hardcoded `runId`,
10
+ * which doesn't need the tester token.
11
+ */
6
12
  export declare const describe: (name: string, fn?: SuiteFactory<object>, options?: ActorTestOptions) => void;
7
13
  /**
8
14
  * @param actorId - The actor's raw platform ID or its full name (`owner/name`, e.g. `"apify/web-scraper"`).
@@ -45,4 +51,8 @@ interface StandbyTask {
45
51
  taskId: string;
46
52
  }
47
53
  declare const createStartRunFn: <T>(actorId: string, testContext: TestContext) => (runOptions: RunOptions<T>) => Promise<RunTestResult>;
54
+ /** Used for unit testing */
55
+ export declare const _private: {
56
+ readonly createStartRunFn: <T>(actorId: string, testContext: TestContext) => (runOptions: RunOptions<T>) => Promise<RunTestResult>;
57
+ };
48
58
  //# sourceMappingURL=lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,EAA8B,YAAY,EAAsB,MAAM,QAAQ,CAAC;AAItF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAc,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB3E,OAAO,EAAE,YAAY,EAAE,CAAC;AAYxB,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,KAAK,YAAY,CAAC,MAAM,CAAC,EAAE,UAAS,gBAAuC,SAEjH,CAAC;AAQF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACvB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,EACjE,cAAc,gBAAgB,SAgBjC,CAAC;AAEF;;;;;GAKG;AACH;;GAEG;AAEH,eAAO,MAAM,gBAAgB,GAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAC7C,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,WAAW,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,EAChF,cAAc,gBAAgB,SA+BjC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,EAC3B,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,SAYpE,CAAC;AAEF,eAAO,MAAM,EAAE,GArFW,CAAC,WACd,MAAM,YACL,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBACnD,gBAAgB,SAiFP,CAAC;AAE5B;;;GAGG;AACH,QAAA,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,EAAE,aAAa,WAAW,EAAE,cAAc,WAAW,EAAE,UAAU,MAAM,MAmBvF,2BAIX,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;;;;EAmBxF,CAAC;AAEF,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AA6DD,QAAA,MAAM,gBAAgB,GAAI,CAAC,EAAE,SAAS,MAAM,EAAE,aAAa,WAAW,MAKpD,YAAY,UAAU,CAAC,CAAC,CAAC,2BAiC1C,CAAC"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,EAA8B,YAAY,EAAsB,MAAM,QAAQ,CAAC;AAItF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAc,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB3E,OAAO,EAAE,YAAY,EAAE,CAAC;AAaxB;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,KAAK,YAAY,CAAC,MAAM,CAAC,EAAE,UAAS,gBAAuC,SAEjH,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EACvB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,EACjE,cAAc,gBAAgB,SAgBjC,CAAC;AAEF;;;;;GAKG;AACH;;GAEG;AAEH,eAAO,MAAM,gBAAgB,GAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAC7C,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,WAAW,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,EAChF,cAAc,gBAAgB,SA+BjC,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,EAC3B,UAAU,MAAM,EAChB,IAAI,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,SAYpE,CAAC;AAEF,eAAO,MAAM,EAAE,GArFW,CAAC,WACd,MAAM,YACL,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBACnD,gBAAgB,SAiFP,CAAC;AAE5B;;;GAGG;AACH,QAAA,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,EAAE,aAAa,WAAW,EAAE,cAAc,WAAW,EAAE,UAAU,MAAM,MAmBvF,2BAIX,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;;;;EAmBxF,CAAC;AAEF,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AA6DD,QAAA,MAAM,gBAAgB,GAAI,CAAC,EAAE,SAAS,MAAM,EAAE,aAAa,WAAW,MAKpD,YAAY,UAAU,CAAC,CAAC,CAAC,2BAwC1C,CAAC;AAMF,4BAA4B;AAE5B,eAAO,MAAM,QAAQ;gCArDK,CAAC,WAAW,MAAM,eAAe,WAAW,MAKpD,YAAY,UAAU,CAAC,CAAC,CAAC;CAgDU,CAAC"}