apify-cli 0.19.3-beta.4 → 1.0.0-beta.0

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 (231) hide show
  1. package/README.md +87 -63
  2. package/bin/dev.cmd +3 -0
  3. package/bin/dev.js +16 -0
  4. package/bin/run.js +16 -0
  5. package/dist/.tsbuildinfo +1 -0
  6. package/dist/commands/actor/get-input.d.ts +6 -0
  7. package/dist/commands/actor/get-input.d.ts.map +1 -0
  8. package/dist/commands/actor/get-input.js +14 -0
  9. package/dist/commands/actor/get-input.js.map +1 -0
  10. package/dist/commands/actor/get-value.d.ts +9 -0
  11. package/dist/commands/actor/get-value.d.ts.map +1 -0
  12. package/dist/commands/actor/get-value.js +27 -0
  13. package/dist/commands/actor/get-value.js.map +1 -0
  14. package/dist/commands/actor/index.d.ts +6 -0
  15. package/dist/commands/actor/index.d.ts.map +1 -0
  16. package/dist/commands/actor/index.js +13 -0
  17. package/dist/commands/actor/index.js.map +1 -0
  18. package/dist/commands/actor/push-data.d.ts +11 -0
  19. package/dist/commands/actor/push-data.d.ts.map +1 -0
  20. package/dist/commands/actor/push-data.js +56 -0
  21. package/dist/commands/actor/push-data.js.map +1 -0
  22. package/dist/commands/actor/set-value.d.ts +15 -0
  23. package/dist/commands/actor/set-value.d.ts.map +1 -0
  24. package/dist/commands/actor/set-value.js +76 -0
  25. package/dist/commands/actor/set-value.js.map +1 -0
  26. package/dist/commands/call.d.ts +15 -0
  27. package/dist/commands/call.d.ts.map +1 -0
  28. package/dist/commands/call.js +142 -0
  29. package/dist/commands/call.js.map +1 -0
  30. package/dist/commands/check-version.d.ts +11 -0
  31. package/dist/commands/check-version.d.ts.map +1 -0
  32. package/dist/commands/check-version.js +39 -0
  33. package/dist/commands/check-version.js.map +1 -0
  34. package/dist/commands/create.d.ts +14 -0
  35. package/dist/commands/create.d.ts.map +1 -0
  36. package/dist/commands/create.js +181 -0
  37. package/dist/commands/create.js.map +1 -0
  38. package/dist/commands/edit-input-schema.d.ts +11 -0
  39. package/dist/commands/edit-input-schema.d.ts.map +1 -0
  40. package/{src → dist}/commands/edit-input-schema.js +81 -85
  41. package/dist/commands/edit-input-schema.js.map +1 -0
  42. package/dist/commands/info.d.ts +6 -0
  43. package/dist/commands/info.d.ts.map +1 -0
  44. package/dist/commands/info.js +26 -0
  45. package/dist/commands/info.js.map +1 -0
  46. package/dist/commands/init-wrap-scrapy.d.ts +10 -0
  47. package/dist/commands/init-wrap-scrapy.d.ts.map +1 -0
  48. package/dist/commands/init-wrap-scrapy.js +41 -0
  49. package/dist/commands/init-wrap-scrapy.js.map +1 -0
  50. package/dist/commands/init.d.ts +12 -0
  51. package/dist/commands/init.d.ts.map +1 -0
  52. package/dist/commands/init.js +88 -0
  53. package/dist/commands/init.js.map +1 -0
  54. package/dist/commands/login-new.d.ts +10 -0
  55. package/dist/commands/login-new.d.ts.map +1 -0
  56. package/{src → dist}/commands/login-new.js +79 -82
  57. package/dist/commands/login-new.js.map +1 -0
  58. package/dist/commands/login.d.ts +9 -0
  59. package/dist/commands/login.d.ts.map +1 -0
  60. package/dist/commands/login.js +43 -0
  61. package/dist/commands/login.js.map +1 -0
  62. package/dist/commands/logout.d.ts +6 -0
  63. package/dist/commands/logout.d.ts.map +1 -0
  64. package/dist/commands/logout.js +20 -0
  65. package/dist/commands/logout.js.map +1 -0
  66. package/dist/commands/pull.d.ts +12 -0
  67. package/dist/commands/pull.d.ts.map +1 -0
  68. package/dist/commands/pull.js +148 -0
  69. package/dist/commands/pull.js.map +1 -0
  70. package/dist/commands/push.d.ts +16 -0
  71. package/dist/commands/push.d.ts.map +1 -0
  72. package/dist/commands/push.js +242 -0
  73. package/dist/commands/push.js.map +1 -0
  74. package/dist/commands/run.d.ts +12 -0
  75. package/dist/commands/run.d.ts.map +1 -0
  76. package/{src → dist}/commands/run.js +96 -109
  77. package/dist/commands/run.js.map +1 -0
  78. package/dist/commands/secrets/add.d.ts +10 -0
  79. package/dist/commands/secrets/add.d.ts.map +1 -0
  80. package/dist/commands/secrets/add.js +31 -0
  81. package/dist/commands/secrets/add.js.map +1 -0
  82. package/dist/commands/secrets/index.d.ts +6 -0
  83. package/dist/commands/secrets/index.d.ts.map +1 -0
  84. package/dist/commands/secrets/index.js +24 -0
  85. package/dist/commands/secrets/index.js.map +1 -0
  86. package/dist/commands/secrets/rm.d.ts +9 -0
  87. package/dist/commands/secrets/rm.d.ts.map +1 -0
  88. package/dist/commands/secrets/rm.js +27 -0
  89. package/dist/commands/secrets/rm.js.map +1 -0
  90. package/dist/commands/vis.d.ts +9 -0
  91. package/dist/commands/vis.d.ts.map +1 -0
  92. package/dist/commands/vis.js +52 -0
  93. package/dist/commands/vis.js.map +1 -0
  94. package/dist/hooks/init.d.ts +7 -0
  95. package/dist/hooks/init.d.ts.map +1 -0
  96. package/dist/hooks/init.js +17 -0
  97. package/dist/hooks/init.js.map +1 -0
  98. package/dist/index.d.ts +2 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +3 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/lib/actor.d.ts +27 -0
  103. package/dist/lib/actor.d.ts.map +1 -0
  104. package/{src → dist}/lib/actor.js +21 -44
  105. package/dist/lib/actor.js.map +1 -0
  106. package/dist/lib/apify-oclif-help.d.ts +15 -0
  107. package/dist/lib/apify-oclif-help.d.ts.map +1 -0
  108. package/dist/lib/apify-oclif-help.js +19 -0
  109. package/dist/lib/apify-oclif-help.js.map +1 -0
  110. package/dist/lib/apify_command.d.ts +22 -0
  111. package/dist/lib/apify_command.d.ts.map +1 -0
  112. package/dist/lib/apify_command.js +103 -0
  113. package/dist/lib/apify_command.js.map +1 -0
  114. package/dist/lib/community.d.ts +2 -0
  115. package/dist/lib/community.d.ts.map +1 -0
  116. package/dist/lib/community.js +4 -0
  117. package/dist/lib/community.js.map +1 -0
  118. package/dist/lib/consts.d.ts +45 -0
  119. package/dist/lib/consts.d.ts.map +1 -0
  120. package/dist/lib/consts.js +54 -0
  121. package/dist/lib/consts.js.map +1 -0
  122. package/dist/lib/create-utils.d.ts +8 -0
  123. package/dist/lib/create-utils.d.ts.map +1 -0
  124. package/{src → dist}/lib/create-utils.js +74 -113
  125. package/dist/lib/create-utils.js.map +1 -0
  126. package/dist/lib/exec.d.ts +4 -0
  127. package/dist/lib/exec.d.ts.map +1 -0
  128. package/{src → dist}/lib/exec.js +15 -16
  129. package/dist/lib/exec.js.map +1 -0
  130. package/dist/lib/files.d.ts +14 -0
  131. package/dist/lib/files.d.ts.map +1 -0
  132. package/dist/lib/files.js +58 -0
  133. package/dist/lib/files.js.map +1 -0
  134. package/dist/lib/input_schema.d.ts +26 -0
  135. package/dist/lib/input_schema.d.ts.map +1 -0
  136. package/{src → dist}/lib/input_schema.js +34 -55
  137. package/dist/lib/input_schema.js.map +1 -0
  138. package/dist/lib/local_state.d.ts +11 -0
  139. package/dist/lib/local_state.d.ts.map +1 -0
  140. package/dist/lib/local_state.js +27 -0
  141. package/dist/lib/local_state.js.map +1 -0
  142. package/dist/lib/outputs.d.ts +7 -0
  143. package/dist/lib/outputs.d.ts.map +1 -0
  144. package/{src → dist}/lib/outputs.js +8 -15
  145. package/dist/lib/outputs.js.map +1 -0
  146. package/dist/lib/project_analyzer.d.ts +4 -0
  147. package/dist/lib/project_analyzer.d.ts.map +1 -0
  148. package/{src → dist}/lib/project_analyzer.js +6 -11
  149. package/dist/lib/project_analyzer.js.map +1 -0
  150. package/dist/lib/projects/CrawleeAnalyzer.d.ts +4 -0
  151. package/dist/lib/projects/CrawleeAnalyzer.d.ts.map +1 -0
  152. package/{src → dist}/lib/projects/CrawleeAnalyzer.js +7 -24
  153. package/dist/lib/projects/CrawleeAnalyzer.js.map +1 -0
  154. package/dist/lib/projects/OldApifySDKAnalyzer.d.ts +4 -0
  155. package/dist/lib/projects/OldApifySDKAnalyzer.d.ts.map +1 -0
  156. package/{src → dist}/lib/projects/OldApifySDKAnalyzer.js +9 -32
  157. package/dist/lib/projects/OldApifySDKAnalyzer.js.map +1 -0
  158. package/dist/lib/projects/scrapy/ScrapyProjectAnalyzer.d.ts +17 -0
  159. package/dist/lib/projects/scrapy/ScrapyProjectAnalyzer.d.ts.map +1 -0
  160. package/{src/lib/scrapy-wrapper → dist/lib/projects/scrapy}/ScrapyProjectAnalyzer.js +33 -36
  161. package/dist/lib/projects/scrapy/ScrapyProjectAnalyzer.js.map +1 -0
  162. package/dist/lib/projects/scrapy/Spider.d.ts +14 -0
  163. package/dist/lib/projects/scrapy/Spider.d.ts.map +1 -0
  164. package/dist/lib/projects/scrapy/Spider.js +33 -0
  165. package/dist/lib/projects/scrapy/Spider.js.map +1 -0
  166. package/dist/lib/projects/scrapy/SpiderFileAnalyzer.d.ts +7 -0
  167. package/dist/lib/projects/scrapy/SpiderFileAnalyzer.d.ts.map +1 -0
  168. package/dist/lib/projects/scrapy/SpiderFileAnalyzer.js +25 -0
  169. package/dist/lib/projects/scrapy/SpiderFileAnalyzer.js.map +1 -0
  170. package/dist/lib/projects/scrapy/wrapScrapyProject.d.ts +4 -0
  171. package/dist/lib/projects/scrapy/wrapScrapyProject.d.ts.map +1 -0
  172. package/{src/lib/scrapy-wrapper/index.js → dist/lib/projects/scrapy/wrapScrapyProject.js} +43 -73
  173. package/dist/lib/projects/scrapy/wrapScrapyProject.js.map +1 -0
  174. package/dist/lib/projects/shared.d.ts +2 -0
  175. package/dist/lib/projects/shared.d.ts.map +1 -0
  176. package/dist/lib/projects/shared.js +13 -0
  177. package/dist/lib/projects/shared.js.map +1 -0
  178. package/dist/lib/secrets.d.ts +22 -0
  179. package/dist/lib/secrets.d.ts.map +1 -0
  180. package/{src → dist}/lib/secrets.js +32 -40
  181. package/dist/lib/secrets.js.map +1 -0
  182. package/dist/lib/telemetry.d.ts +21 -0
  183. package/dist/lib/telemetry.d.ts.map +1 -0
  184. package/dist/lib/telemetry.js +87 -0
  185. package/dist/lib/telemetry.js.map +1 -0
  186. package/dist/lib/types.d.ts +11 -0
  187. package/dist/lib/types.d.ts.map +1 -0
  188. package/dist/lib/types.js +2 -0
  189. package/dist/lib/types.js.map +1 -0
  190. package/dist/lib/utils.d.ts +106 -0
  191. package/dist/lib/utils.d.ts.map +1 -0
  192. package/{src → dist}/lib/utils.js +235 -347
  193. package/dist/lib/utils.js.map +1 -0
  194. package/dist/lib/version_check.d.ts +14 -0
  195. package/dist/lib/version_check.d.ts.map +1 -0
  196. package/{src → dist}/lib/version_check.js +25 -54
  197. package/dist/lib/version_check.js.map +1 -0
  198. package/oclif.manifest.json +722 -1
  199. package/package.json +137 -113
  200. package/index.js +0 -1
  201. package/src/bin/run +0 -16
  202. package/src/commands/actor/get-input.js +0 -12
  203. package/src/commands/actor/get-value.js +0 -23
  204. package/src/commands/actor/index.js +0 -13
  205. package/src/commands/actor/push-data.js +0 -44
  206. package/src/commands/actor/set-value.js +0 -63
  207. package/src/commands/call.js +0 -131
  208. package/src/commands/check-version.js +0 -28
  209. package/src/commands/create.js +0 -203
  210. package/src/commands/info.js +0 -24
  211. package/src/commands/init-wrap-scrapy.js +0 -34
  212. package/src/commands/init.js +0 -83
  213. package/src/commands/login.js +0 -40
  214. package/src/commands/logout.js +0 -18
  215. package/src/commands/pull.js +0 -154
  216. package/src/commands/push.js +0 -234
  217. package/src/commands/secrets/add.js +0 -28
  218. package/src/commands/secrets/index.js +0 -24
  219. package/src/commands/secrets/rm.js +0 -23
  220. package/src/commands/vis.js +0 -50
  221. package/src/hooks/init.js +0 -16
  222. package/src/lib/apify-oclif-help.js +0 -23
  223. package/src/lib/apify_command.js +0 -82
  224. package/src/lib/community.js +0 -3
  225. package/src/lib/consts.js +0 -69
  226. package/src/lib/files.js +0 -76
  227. package/src/lib/local_state.js +0 -39
  228. package/src/lib/scrapy-wrapper/Spider.js +0 -10
  229. package/src/lib/scrapy-wrapper/SpiderFileAnalyzer.js +0 -26
  230. package/src/lib/telemetry.js +0 -104
  231. /package/{src/bin → bin}/run.cmd +0 -0
@@ -1,234 +0,0 @@
1
- const fs = require('fs');
2
-
3
- const actorTemplates = require('@apify/actor-templates');
4
- const { ACT_JOB_STATUSES, ACT_SOURCE_TYPES,
5
- MAX_MULTIFILE_BYTES } = require('@apify/consts');
6
- const { flags: flagsHelper } = require('@oclif/command');
7
- const inquirer = require('inquirer');
8
- const isCI = require('is-ci');
9
- const open = require('open');
10
-
11
- const { ApifyCommand } = require('../lib/apify_command');
12
- const { UPLOADS_STORE_NAME, LOCAL_CONFIG_PATH } = require('../lib/consts');
13
- const { sumFilesSizeInBytes } = require('../lib/files');
14
- const outputs = require('../lib/outputs');
15
- const { transformEnvToEnvVars } = require('../lib/secrets');
16
- const { createActZip, getLoggedClientOrThrow,
17
- outputJobLog, getLocalUserInfo, getActorLocalFilePaths,
18
- createSourceFiles, getLocalConfigOrThrow } = require('../lib/utils');
19
-
20
- const TEMP_ZIP_FILE_NAME = 'temp_file.zip';
21
- const DEFAULT_RUN_OPTIONS = {
22
- build: 'latest',
23
- memoryMbytes: 4096,
24
- timeoutSecs: 3600,
25
- };
26
- const DEFAULT_ACTOR_VERSION_NUMBER = '0.0';
27
-
28
- // It would be better to use `version-0.0` or similar,
29
- // or even have no default tag, but the platform complains when
30
- // actor does not have a build with a `latest` tag, so until
31
- // that changes, we have to add it.
32
- const DEFAULT_BUILD_TAG = 'latest';
33
-
34
- class PushCommand extends ApifyCommand {
35
- async run() {
36
- const { args, flags } = this.parse(PushCommand);
37
- const apifyClient = await getLoggedClientOrThrow();
38
- const localConfig = await getLocalConfigOrThrow();
39
- const userInfo = await getLocalUserInfo();
40
- const isOrganizationLoggedIn = !!userInfo.organizationOwnerUserId;
41
- const redirectUrlPart = isOrganizationLoggedIn ? `/organization/${userInfo.id}` : '';
42
-
43
- let actorId;
44
- let actor;
45
- // User can override actor version and build tag, attributes in localConfig will remain same.
46
- const version = flags.version || flags.versionNumber || localConfig.version || DEFAULT_ACTOR_VERSION_NUMBER;
47
- let buildTag = flags.buildTag || localConfig.buildTag;
48
- // We can't add the default build tag to everything. If a user creates a new
49
- // version, e.g. for testing, but forgets to add a tag, it would use the default
50
- // tag and their production runs might be affected ❌
51
- // TODO: revisit this when we have better build tagging system on platform.
52
- if (!buildTag && version === DEFAULT_ACTOR_VERSION_NUMBER) {
53
- buildTag = DEFAULT_BUILD_TAG;
54
- }
55
- const waitForFinishMillis = Number.isNaN(flags.waitForFinish)
56
- ? undefined
57
- : parseInt(flags.waitForFinish, 10) * 1000;
58
- // User can override actorId of pushing actor.
59
- // It causes that we push actor to this id but attributes in localConfig will remain same.
60
- const forceActorId = args.actorId;
61
- if (forceActorId) {
62
- actor = await apifyClient.actor(forceActorId).get();
63
- if (!actor) throw new Error(`Cannot find Actor with ID '${forceActorId}' in your account.`);
64
- actorId = actor.id;
65
- } else {
66
- const usernameOrId = userInfo.username || userInfo.id;
67
- actor = await apifyClient.actor(`${usernameOrId}/${localConfig.name}`).get();
68
- if (actor) {
69
- actorId = actor.id;
70
- } else {
71
- const { templates } = await actorTemplates.fetchManifest();
72
- const actorTemplate = templates.find((t) => t.name === localConfig.template);
73
- const defaultRunOptions = actorTemplate?.defaultRunOptions || DEFAULT_RUN_OPTIONS;
74
- const newActor = {
75
- name: localConfig.name,
76
- defaultRunOptions,
77
- versions: [{
78
- versionNumber: version,
79
- buildTag,
80
- sourceType: ACT_SOURCE_TYPES.SOURCE_FILES,
81
- sourceFiles: [],
82
- }],
83
- };
84
- actor = await apifyClient.actors().create(newActor);
85
- actorId = actor.id;
86
- outputs.info(`Created actor with name ${localConfig.name} on Apify.`);
87
- }
88
- }
89
-
90
- outputs.info(`Deploying actor '${localConfig.name}' to Apify.`);
91
-
92
- const filePathsToPush = await getActorLocalFilePaths();
93
- const filesSize = await sumFilesSizeInBytes(filePathsToPush);
94
- const actorClient = apifyClient.actor(actorId);
95
-
96
- let sourceType;
97
- let sourceFiles;
98
- let tarballUrl;
99
- if (filesSize < MAX_MULTIFILE_BYTES) {
100
- sourceFiles = await createSourceFiles(filePathsToPush);
101
- sourceType = ACT_SOURCE_TYPES.SOURCE_FILES;
102
- } else {
103
- // Create zip
104
- outputs.run('Zipping actor files');
105
- await createActZip(TEMP_ZIP_FILE_NAME, filePathsToPush);
106
-
107
- // Upload it to Apify.keyValueStores
108
- const store = await apifyClient.keyValueStores().getOrCreate(UPLOADS_STORE_NAME);
109
- const key = `${actor.name}-${version}.zip`;
110
- const buffer = fs.readFileSync(TEMP_ZIP_FILE_NAME);
111
- await apifyClient.keyValueStore(store.id).setRecord({
112
- key,
113
- value: buffer,
114
- contentType: 'application/zip',
115
- });
116
- fs.unlinkSync(TEMP_ZIP_FILE_NAME);
117
- tarballUrl = `${apifyClient.baseUrl}/key-value-stores/${store.id}/records/${key}?disableRedirect=true`;
118
- sourceType = ACT_SOURCE_TYPES.TARBALL;
119
- }
120
-
121
- // Update actor version
122
- const actorCurrentVersion = await actorClient.version(version).get();
123
- const envVars = localConfig.environmentVariables
124
- ? transformEnvToEnvVars(localConfig.environmentVariables)
125
- : undefined;
126
- if (actorCurrentVersion) {
127
- const actorVersionModifier = { tarballUrl, sourceFiles, buildTag, sourceType, envVars };
128
- await actorClient.version(version).update(actorVersionModifier);
129
- outputs.run(`Updated version ${version} for ${actor.name} actor.`);
130
- } else {
131
- const actorNewVersion = {
132
- versionNumber: version,
133
- tarballUrl,
134
- sourceFiles,
135
- buildTag,
136
- sourceType,
137
- envVars,
138
- };
139
- await actorClient.versions().create({
140
- versionNumber: version,
141
- ...actorNewVersion,
142
- });
143
- outputs.run(`Created version ${version} for ${actor.name} actor.`);
144
- }
145
-
146
- // Build actor on Apify and wait for build to finish
147
- outputs.run(`Building actor ${actor.name}`);
148
- let build = await actorClient.build(version, {
149
- useCache: true,
150
- waitForFinish: 2, // NOTE: We need to wait some time to Apify open stream and we can create connection
151
- });
152
-
153
- try {
154
- await outputJobLog(build, waitForFinishMillis);
155
- } catch (err) {
156
- outputs.warning('Can not get log:');
157
- console.error(err);
158
- }
159
-
160
- build = await apifyClient.build(build.id).get();
161
-
162
- outputs.link('Actor build detail', `https://console.apify.com${redirectUrlPart}/actors/${build.actId}#/builds/${build.buildNumber}`);
163
-
164
- // Disable open browser on CI, or if user passed --no-prompt flag
165
- if (!isCI && !flags.noPrompt) {
166
- const shouldOpenBrowser = await inquirer.prompt([
167
- { type: 'confirm', name: 'continue', message: 'Do you want to open the actor detail in your browser?', default: true },
168
- ]);
169
-
170
- if (shouldOpenBrowser.continue) {
171
- open(`https://console.apify.com${redirectUrlPart}/actors/${build.actId}`);
172
- }
173
- }
174
-
175
- if (build.status === ACT_JOB_STATUSES.SUCCEEDED) {
176
- outputs.success('Actor was deployed to Apify cloud and built there.');
177
- } else if (build.status === ACT_JOB_STATUSES.READY) {
178
- outputs.warning('Build is waiting for allocation.');
179
- } else if (build.status === ACT_JOB_STATUSES.RUNNING) {
180
- outputs.warning('Build is still running.');
181
- } else if (build.status === ACT_JOB_STATUSES.ABORTED || build.status === ACT_JOB_STATUSES.ABORTING) {
182
- outputs.warning('Build was aborted!');
183
- } else if (build.status === ACT_JOB_STATUSES.TIMED_OUT || build.status === ACT_JOB_STATUSES.TIMING_OUT) {
184
- outputs.warning('Build timed out!');
185
- } else {
186
- outputs.error('Build failed!');
187
- }
188
- }
189
- }
190
-
191
- PushCommand.description = 'Uploads the actor to the Apify platform and builds it there.\n'
192
- + `The Actor settings are read from the "${LOCAL_CONFIG_PATH}" file in the current directory, but they can be overridden using command-line options.\n`
193
- + `NOTE: If the source files are smaller than ${MAX_MULTIFILE_BYTES / (1024 ** 2)} MB then they are uploaded as \n`
194
- + '"Multiple source files", otherwise they are uploaded as "Zip file".\n\n'
195
- + 'WARNING: If the target Actor already exists in your Apify account, it will be overwritten!';
196
-
197
- PushCommand.flags = {
198
- 'version-number': flagsHelper.string({
199
- description: 'DEPRECATED: Use flag version instead. Actor version number to which the files should be pushed. '
200
- + `By default, it is taken from the "${LOCAL_CONFIG_PATH}" file.`,
201
- required: false,
202
- }),
203
- version: flagsHelper.string({
204
- char: 'v',
205
- description: `Actor version number to which the files should be pushed. By default, it is taken from the "${LOCAL_CONFIG_PATH}" file.`,
206
- required: false,
207
- }),
208
- 'build-tag': flagsHelper.string({
209
- char: 'b',
210
- description: `Build tag to be applied to the successful Actor build. By default, it is taken from the "${LOCAL_CONFIG_PATH}" file`,
211
- required: false,
212
- }),
213
- 'wait-for-finish': flagsHelper.string({
214
- char: 'w',
215
- description: 'Seconds for waiting to build to finish, if no value passed, it waits forever.',
216
- required: false,
217
- }),
218
- 'no-prompt': flagsHelper.boolean({
219
- description: 'Do not prompt for opening the actor details in a browser. This will also not open the browser automatically.',
220
- default: false,
221
- required: false,
222
- }),
223
- };
224
-
225
- PushCommand.args = [
226
- {
227
- name: 'actorId',
228
- required: false,
229
- description: 'Name or ID of the Actor to push (e.g. "apify/hello-world" or "E2jjCZBezvAZnX8Rb"). '
230
- + `If not provided, the command will create or modify the actor with the name specified in "${LOCAL_CONFIG_PATH}" file.`,
231
- },
232
- ];
233
-
234
- module.exports = PushCommand;
@@ -1,28 +0,0 @@
1
- const { ApifyCommand } = require('../../lib/apify_command');
2
- const { addSecret } = require('../../lib/secrets');
3
-
4
- class AddCommand extends ApifyCommand {
5
- async run() {
6
- const { args } = this.parse(AddCommand);
7
- const { name, value } = args;
8
-
9
- addSecret(name, value);
10
- }
11
- }
12
-
13
- AddCommand.description = 'Adds a new secret value.\nThe secrets are stored to a file at ~/.apify';
14
-
15
- AddCommand.args = [
16
- {
17
- name: 'name',
18
- required: true,
19
- description: 'Name of the secret',
20
- },
21
- {
22
- name: 'value',
23
- required: true,
24
- description: 'Value of the secret',
25
- },
26
- ];
27
-
28
- module.exports = AddCommand;
@@ -1,24 +0,0 @@
1
- const { Command } = require('@oclif/command');
2
-
3
- const { LOCAL_CONFIG_PATH } = require('../../lib/consts');
4
- const { showHelpForCommand } = require('../../lib/utils');
5
-
6
- class SecretsIndexCommand extends Command {
7
- async run() {
8
- showHelpForCommand('secrets');
9
- }
10
- }
11
-
12
- SecretsIndexCommand.description = 'Manages secret values for Actor environment variables.\n\n'
13
- + 'Example:\n'
14
- + '$ apify secrets:add mySecret TopSecretValue123\n\n'
15
- + `Now the "mySecret" value can be used in an environment variable defined in "${LOCAL_CONFIG_PATH}" file by adding the "@" prefix:\n\n`
16
- + '{\n'
17
- + ' "actorSpecification": 1,\n'
18
- + ' "name": "my_actor",\n'
19
- + ' "environmentVariables": { "SECRET_ENV_VAR": "@mySecret" },\n'
20
- + ' "version": "0.1\n'
21
- + '}\n\n'
22
- + 'When the actor is pushed to Apify cloud, the "SECRET_ENV_VAR" and its value is stored as a secret environment variable of the actor.';
23
-
24
- module.exports = SecretsIndexCommand;
@@ -1,23 +0,0 @@
1
- const { ApifyCommand } = require('../../lib/apify_command');
2
- const { removeSecret } = require('../../lib/secrets');
3
-
4
- class RmCommand extends ApifyCommand {
5
- async run() {
6
- const { args } = this.parse(RmCommand);
7
- const { name } = args;
8
-
9
- removeSecret(name);
10
- }
11
- }
12
-
13
- RmCommand.description = 'Removes the secret.';
14
-
15
- RmCommand.args = [
16
- {
17
- name: 'name',
18
- required: true,
19
- description: 'Name of the secret',
20
- },
21
- ];
22
-
23
- module.exports = RmCommand;
@@ -1,50 +0,0 @@
1
- const { validateInputSchema } = require('@apify/input_schema');
2
- const Ajv = require('ajv');
3
-
4
- const { ApifyCommand } = require('../lib/apify_command');
5
- const { LOCAL_CONFIG_PATH } = require('../lib/consts');
6
- const { readInputSchema } = require('../lib/input_schema');
7
- const outputs = require('../lib/outputs');
8
-
9
- class ValidateInputSchemaCommand extends ApifyCommand {
10
- async run() {
11
- const { args } = this.parse(ValidateInputSchemaCommand);
12
-
13
- const { inputSchema, inputSchemaPath } = await readInputSchema(args.path);
14
-
15
- if (!inputSchema) {
16
- throw new Error(`Input schema has not been found at ${inputSchemaPath}.`);
17
- }
18
-
19
- if (inputSchemaPath) {
20
- outputs.info(`Validating input schema stored at ${inputSchemaPath}`);
21
- } else {
22
- outputs.info(`Validating input schema embedded in "${LOCAL_CONFIG_PATH}"`);
23
- }
24
-
25
- const validator = new Ajv({ strict: false });
26
- validateInputSchema(validator, inputSchema); // This one throws an error in a case of invalid schema.
27
- outputs.success('Input schema is valid.');
28
- }
29
- }
30
-
31
- ValidateInputSchemaCommand.description = `Validates input schema and prints errors found.
32
- The input schema for the Actor is used from these locations in order of preference.
33
- The first one found is validated as it would be the one used on the Apify platform.
34
- 1. Directly embedded object in "${LOCAL_CONFIG_PATH}" under 'input' key
35
- 2. Path to JSON file referenced in "${LOCAL_CONFIG_PATH}" under 'input' key
36
- 3. JSON file at .actor/INPUT_SCHEMA.json
37
- 4. JSON file at INPUT_SCHEMA.json
38
-
39
- You can also pass any custom path to your input schema to have it validated instead.
40
- `;
41
-
42
- ValidateInputSchemaCommand.args = [
43
- {
44
- name: 'path',
45
- required: false,
46
- description: 'Optional path to your INPUT_SCHEMA.json file. If not provided ./INPUT_SCHEMA.json is used.',
47
- },
48
- ];
49
-
50
- module.exports = ValidateInputSchemaCommand;
package/src/hooks/init.js DELETED
@@ -1,16 +0,0 @@
1
- const { checkLatestVersion, SKIP_UPDATE_CHECK } = require('../lib/version_check');
2
-
3
- /**
4
- * This code'll be call before each commmand run
5
- * @return {Promise<void>}
6
- */
7
- exports.default = async (params) => {
8
- // This is not nessesary when you call the `--check-version` as the same command is called there.
9
- if (['cv', 'check-version'].includes(params.id)) return;
10
-
11
- // If the user has configured the `APIFY_CLI_SKIP_UPDATE_CHECK` env variable then skip the check.
12
- if (SKIP_UPDATE_CHECK) return;
13
-
14
- // Check package latest version
15
- await checkLatestVersion();
16
- };
@@ -1,23 +0,0 @@
1
- const { Help } = require('@oclif/core');
2
-
3
- /**
4
- * Custom help class that overrides how oclif renders help screens.
5
- *
6
- * It is registered through package.json.
7
- *
8
- * Refer to the oclif documentation for more information:
9
- * https://oclif.io/docs/help_classes/#custom-help
10
- *
11
- * Note: The CLI was crashing when printing help with the latest oclif packages. Be careful when upgrading.
12
- */
13
- module.exports = class ApifyOclifHelp extends Help {
14
- showRootHelp() {
15
- super.showRootHelp();
16
-
17
- this.log(this.section(
18
- 'TROUBLESHOOTING',
19
- this.wrap(
20
- 'For general support, reach out to us at https://apify.com/contact\n\n'
21
- + 'If you believe you are encountering a bug, file it at https://github.com/apify/apify-cli/issues/new')));
22
- }
23
- };
@@ -1,82 +0,0 @@
1
- const { finished } = require('stream');
2
- const { promisify } = require('util');
3
-
4
- const { Command } = require('@oclif/command');
5
-
6
- const { LANGUAGE, COMMANDS_WITHIN_ACTOR } = require('./consts');
7
- const { maybeTrackTelemetry } = require('./telemetry');
8
- const { argsToCamelCase } = require('./utils');
9
- const { detectLocalActorLanguage } = require('./utils');
10
- const { detectInstallationType } = require('./version_check');
11
-
12
- /**
13
- * Adding parsing flags to oclif Command class
14
- */
15
- class ApifyCommand extends Command {
16
- async init() {
17
- await super.init();
18
- // Initialize telemetry data, all attributes are tracked in the finally method
19
- this.telemetryData = {};
20
- }
21
-
22
- parse(cmd) {
23
- const { flags, args } = super.parse(cmd);
24
- const parsedFlags = argsToCamelCase(flags);
25
- this.telemetryData.flagsUsed = Object.keys(parsedFlags);
26
- return { flags: parsedFlags, args };
27
- }
28
-
29
- async finally(err) {
30
- const command = this.id;
31
- const eventData = {
32
- command,
33
- $os: this.config.platform,
34
- shell: this.config.shell,
35
- arch: this.config.arch,
36
- apifyCliVersion: this.config.version,
37
- nodeJsVersion: process.version,
38
- ...this.telemetryData,
39
- error: err ? err.message : null,
40
- };
41
- try {
42
- eventData.installationType = await detectInstallationType();
43
- if (!this.telemetryData.actorLanguage && command && COMMANDS_WITHIN_ACTOR.includes(command)) {
44
- const { language, languageVersion } = detectLocalActorLanguage();
45
- eventData.actorLanguage = language;
46
- if (language === LANGUAGE.NODEJS) {
47
- eventData.actorNodejsVersion = languageVersion;
48
- } else if (language === LANGUAGE.PYTHON) {
49
- eventData.actorPythonVersion = languageVersion;
50
- }
51
- }
52
- await maybeTrackTelemetry({
53
- eventName: `cli_command_${command}`,
54
- eventData,
55
- });
56
- } catch (e) {
57
- // Ignore errors
58
- }
59
- return super.finally(err);
60
- }
61
-
62
- /**
63
- * Reads data on standard input as a string.
64
- * @return {Promise<string|undefined>}
65
- */
66
- async readStdin(stdinStream) {
67
- // The isTTY params says if TTY is connected to the process, if so the stdout is
68
- // synchronous and the stdout steam is empty.
69
- // See https://nodejs.org/docs/latest-v12.x/api/process.html#process_a_note_on_process_i_o
70
- if (stdinStream.isTTY) return;
71
-
72
- const bufferChunks = [];
73
- stdinStream.on('data', (chunk) => {
74
- bufferChunks.push(chunk);
75
- });
76
-
77
- await promisify(finished)(stdinStream);
78
- return Buffer.concat(bufferChunks).toString('utf-8');
79
- }
80
- }
81
-
82
- module.exports = { ApifyCommand };
@@ -1,3 +0,0 @@
1
- console.log('We have an active developer community on Discord. '
2
- + 'You can find it on https://discord.gg/crawlee-apify-801163717915574323.',
3
- );
package/src/lib/consts.js DELETED
@@ -1,69 +0,0 @@
1
- const os = require('os');
2
- const path = require('path');
3
-
4
- const { KEY_VALUE_STORE_KEYS, META_ORIGINS } = require('@apify/consts');
5
-
6
- exports.DEFAULT_LOCAL_STORAGE_DIR = 'storage';
7
-
8
- exports.LEGACY_LOCAL_STORAGE_DIR = 'apify_storage';
9
-
10
- exports.ACTOR_SPECIFICATION_VERSION = 1;
11
-
12
- exports.EMPTY_LOCAL_CONFIG = {
13
- actorSpecification: exports.ACTOR_SPECIFICATION_VERSION,
14
- name: null,
15
- version: '0.0',
16
- buildTag: 'latest',
17
- environmentVariables: {},
18
- };
19
-
20
- exports.LANGUAGE = {
21
- NODEJS: 'nodejs',
22
- PYTHON: 'python',
23
- UNKNOWN: 'n/a',
24
- };
25
-
26
- exports.PROJECT_TYPES = {
27
- SCRAPY: 'scrapy',
28
- CRAWLEE: 'crawlee',
29
- PRE_CRAWLEE_APIFY_SDK: 'apify',
30
- UNKNOWN: 'unknown',
31
- };
32
-
33
- exports.COMMANDS_WITHIN_ACTOR = ['init', 'run', 'push', 'pull', 'call'];
34
-
35
- exports.CHECK_VERSION_EVERY_MILLIS = 24 * 60 * 60 * 1000; // Once a day
36
-
37
- exports.GLOBAL_CONFIGS_FOLDER = path.join(os.homedir(), '.apify');
38
-
39
- exports.AUTH_FILE_PATH = path.join(exports.GLOBAL_CONFIGS_FOLDER, 'auth.json');
40
-
41
- exports.SECRETS_FILE_PATH = path.join(exports.GLOBAL_CONFIGS_FOLDER, 'secrets.json');
42
-
43
- exports.STATE_FILE_PATH = path.join(exports.GLOBAL_CONFIGS_FOLDER, 'state.json');
44
-
45
- exports.TELEMETRY_FILE_PATH = path.join(exports.GLOBAL_CONFIGS_FOLDER, 'telemetry.json');
46
-
47
- exports.DEPRECATED_LOCAL_CONFIG_NAME = 'apify.json';
48
-
49
- exports.ACTOR_SPECIFICATION_FOLDER = '.actor';
50
-
51
- exports.LOCAL_CONFIG_NAME = 'actor.json';
52
-
53
- exports.LOCAL_CONFIG_PATH = path.join(exports.ACTOR_SPECIFICATION_FOLDER, exports.LOCAL_CONFIG_NAME);
54
-
55
- exports.INPUT_FILE_REG_EXP = new RegExp(`^${KEY_VALUE_STORE_KEYS.INPUT}\\..*`);
56
-
57
- exports.MAIN_FILE = 'main.js';
58
-
59
- exports.UPLOADS_STORE_NAME = 'apify-cli-deployments';
60
-
61
- exports.SUPPORTED_NODEJS_VERSION = require('../../package.json').engines.node; // eslint-disable-line;
62
-
63
- exports.APIFY_CLIENT_DEFAULT_HEADERS = { 'X-Apify-Request-Origin': META_ORIGINS.CLI };
64
-
65
- exports.MINIMUM_SUPPORTED_PYTHON_VERSION = '3.8.0';
66
-
67
- exports.PYTHON_VENV_PATH = '.venv';
68
-
69
- exports.MIXPANEL_TOKEN = 'ea75e434d4b4d2405d79ed9d14bfc93b';
package/src/lib/files.js DELETED
@@ -1,76 +0,0 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
-
4
- const loadJson = require('load-json-file');
5
- const rimraf = require('rimraf');
6
- const writeJson = require('write-json-file');
7
-
8
- const updateLocalJson = async (jsonFilePath, updateAttrs = {}, nestedObjectAttr = null) => {
9
- const currentObject = await loadJson(jsonFilePath);
10
- let newObject;
11
-
12
- if (nestedObjectAttr) {
13
- newObject = currentObject;
14
- newObject[nestedObjectAttr] = { ...currentObject[nestedObjectAttr], ...updateAttrs };
15
- } else {
16
- newObject = { ...currentObject, ...updateAttrs };
17
- }
18
-
19
- await writeJson(jsonFilePath, newObject);
20
- };
21
-
22
- /**
23
- * If you pass /foo/bar as rootPath and /baz/raz as folderPath then it ensures that following folders exists:
24
- *
25
- * /foo/bar/baz
26
- * /foo/bar/baz/raz
27
- *
28
- * If you pass only one parameter then rootPath is considered to be '.'
29
- */
30
- const ensureFolderExistsSync = (rootPath, folderPath) => {
31
- if (!folderPath) {
32
- folderPath = rootPath;
33
- rootPath = '.';
34
- }
35
-
36
- const parts = folderPath.split(path.sep);
37
- parts.reduce((currentPath, currentDir) => {
38
- currentPath = path.join(currentPath, currentDir);
39
-
40
- if (!fs.existsSync(currentPath)) fs.mkdirSync(currentPath);
41
-
42
- return currentPath;
43
- }, rootPath);
44
- };
45
-
46
- const rimrafPromised = (pathToBeRemoved) => {
47
- return new Promise((resolve, reject) => {
48
- rimraf(pathToBeRemoved, (err) => {
49
- if (err) reject(err);
50
- resolve();
51
- });
52
- });
53
- };
54
-
55
- const deleteFile = async (filePath) => {
56
- const stat = await fs.promises.stat(filePath);
57
- if (stat.isFile()) {
58
- await fs.promises.unlink(filePath);
59
- }
60
- };
61
-
62
- const sumFilesSizeInBytes = async (pathToFiles) => {
63
- const filesStats = await Promise.all(pathToFiles.map((filePath) => fs.promises.stat(filePath)));
64
- const filesSizeBytes = filesStats
65
- .map((stats) => stats.size)
66
- .reduce((sum, fileSize) => sum + fileSize, 0);
67
- return filesSizeBytes;
68
- };
69
-
70
- module.exports = {
71
- updateLocalJson,
72
- ensureFolderExistsSync,
73
- rimrafPromised,
74
- deleteFile,
75
- sumFilesSizeInBytes,
76
- };
@@ -1,39 +0,0 @@
1
- const loadJson = require('load-json-file');
2
- const writeJson = require('write-json-file');
3
-
4
- const {
5
- STATE_FILE_PATH,
6
- } = require('./consts');
7
-
8
- /**
9
- * Returns state object from auth file or empty object.
10
- * This method is synchronous/blocking to avoid different race conditions.
11
- *
12
- * @return {Object}
13
- */
14
- const getLocalState = () => {
15
- try {
16
- return loadJson.sync(STATE_FILE_PATH) || {};
17
- } catch (e) {
18
- return {};
19
- }
20
- };
21
-
22
- /**
23
- * Extends local state by given values.
24
- * This method is synchronous/blocking to avoid different race conditions.
25
- *
26
- * @param {Object} data
27
- */
28
- const extendLocalState = (data) => {
29
- const state = getLocalState();
30
- writeJson.sync(STATE_FILE_PATH, {
31
- ...state,
32
- ...data,
33
- });
34
- };
35
-
36
- module.exports = {
37
- getLocalState,
38
- extendLocalState,
39
- };