@remotion/cloudrun 4.1.0-alpha2
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.
- package/.turbo/turbo-build.log +13 -0
- package/LICENSE.md +41 -0
- package/dist/admin/bundle-installer.d.ts +1 -0
- package/dist/admin/bundle-installer.js +32 -0
- package/dist/admin/bundle-renderLogic.d.ts +1 -0
- package/dist/admin/bundle-renderLogic.js +39 -0
- package/dist/api/check-if-service-exists.d.ts +18 -0
- package/dist/api/check-if-service-exists.js +50 -0
- package/dist/api/create-bucket.d.ts +13 -0
- package/dist/api/create-bucket.js +18 -0
- package/dist/api/delete-service.d.ts +12 -0
- package/dist/api/delete-service.js +19 -0
- package/dist/api/delete-site.d.ts +13 -0
- package/dist/api/delete-site.js +30 -0
- package/dist/api/deploy-service.d.ts +28 -0
- package/dist/api/deploy-service.js +90 -0
- package/dist/api/deploy-site.d.ts +35 -0
- package/dist/api/deploy-site.js +78 -0
- package/dist/api/download-file.d.ts +13 -0
- package/dist/api/download-file.js +30 -0
- package/dist/api/get-buckets.d.ts +10 -0
- package/dist/api/get-buckets.js +23 -0
- package/dist/api/get-or-create-bucket.d.ts +17 -0
- package/dist/api/get-or-create-bucket.js +42 -0
- package/dist/api/get-regions.d.ts +7 -0
- package/dist/api/get-regions.js +13 -0
- package/dist/api/get-service-info.d.ts +23 -0
- package/dist/api/get-service-info.js +36 -0
- package/dist/api/get-services.d.ts +14 -0
- package/dist/api/get-services.js +49 -0
- package/dist/api/get-sites.d.ts +23 -0
- package/dist/api/get-sites.js +49 -0
- package/dist/api/helpers/IService.d.ts +2 -0
- package/dist/api/helpers/IService.js +2 -0
- package/dist/api/helpers/construct-service-deploy-request.d.ts +32 -0
- package/dist/api/helpers/construct-service-deploy-request.js +36 -0
- package/dist/api/helpers/get-auth-client-for-url.d.ts +1 -0
- package/dist/api/helpers/get-auth-client-for-url.js +15 -0
- package/dist/api/helpers/get-cloud-run-client.d.ts +2 -0
- package/dist/api/helpers/get-cloud-run-client.js +15 -0
- package/dist/api/helpers/get-cloud-storage-client.d.ts +2 -0
- package/dist/api/helpers/get-cloud-storage-client.js +14 -0
- package/dist/api/helpers/get-cloudrun-endpoint.d.ts +14 -0
- package/dist/api/helpers/get-cloudrun-endpoint.js +36 -0
- package/dist/api/helpers/get-resource-manager-client.d.ts +2 -0
- package/dist/api/helpers/get-resource-manager-client.js +15 -0
- package/dist/api/iam-validation/testPermissions.d.ts +20 -0
- package/dist/api/iam-validation/testPermissions.js +48 -0
- package/dist/api/render-media-on-cloudrun.d.ts +70 -0
- package/dist/api/render-media-on-cloudrun.js +115 -0
- package/dist/api/render-still-on-cloudrun.d.ts +47 -0
- package/dist/api/render-still-on-cloudrun.js +68 -0
- package/dist/api/speculate-service-name.d.ts +13 -0
- package/dist/api/speculate-service-name.js +20 -0
- package/dist/api/upload-dir.d.ts +18 -0
- package/dist/api/upload-dir.js +81 -0
- package/dist/cli/args.d.ts +19 -0
- package/dist/cli/args.js +11 -0
- package/dist/cli/commands/permissions.d.ts +2 -0
- package/dist/cli/commands/permissions.js +23 -0
- package/dist/cli/commands/regions.d.ts +2 -0
- package/dist/cli/commands/regions.js +10 -0
- package/dist/cli/commands/render/helpers/renderArgsCheck.d.ts +9 -0
- package/dist/cli/commands/render/helpers/renderArgsCheck.js +75 -0
- package/dist/cli/commands/render/index.d.ts +2 -0
- package/dist/cli/commands/render/index.js +36 -0
- package/dist/cli/commands/render/renderMedia.d.ts +2 -0
- package/dist/cli/commands/render/renderMedia.js +156 -0
- package/dist/cli/commands/render/renderStill.d.ts +2 -0
- package/dist/cli/commands/render/renderStill.js +123 -0
- package/dist/cli/commands/services/deploy.d.ts +2 -0
- package/dist/cli/commands/services/deploy.js +129 -0
- package/dist/cli/commands/services/index.d.ts +5 -0
- package/dist/cli/commands/services/index.js +64 -0
- package/dist/cli/commands/services/ls.d.ts +2 -0
- package/dist/cli/commands/services/ls.js +40 -0
- package/dist/cli/commands/services/rm.d.ts +2 -0
- package/dist/cli/commands/services/rm.js +63 -0
- package/dist/cli/commands/services/rmall.d.ts +2 -0
- package/dist/cli/commands/services/rmall.js +52 -0
- package/dist/cli/commands/sites/create.d.ts +2 -0
- package/dist/cli/commands/sites/create.js +138 -0
- package/dist/cli/commands/sites/index.d.ts +4 -0
- package/dist/cli/commands/sites/index.js +60 -0
- package/dist/cli/commands/sites/ls.d.ts +2 -0
- package/dist/cli/commands/sites/ls.js +40 -0
- package/dist/cli/commands/sites/rm.d.ts +2 -0
- package/dist/cli/commands/sites/rm.js +59 -0
- package/dist/cli/commands/sites/rmall.d.ts +2 -0
- package/dist/cli/commands/sites/rmall.js +38 -0
- package/dist/cli/get-gcp-region.d.ts +2 -0
- package/dist/cli/get-gcp-region.js +19 -0
- package/dist/cli/help.d.ts +1 -0
- package/dist/cli/help.js +34 -0
- package/dist/cli/helpers/confirm.d.ts +4 -0
- package/dist/cli/helpers/confirm.js +12 -0
- package/dist/cli/helpers/date-string.d.ts +1 -0
- package/dist/cli/helpers/date-string.js +9 -0
- package/dist/cli/helpers/progress-bar.d.ts +23 -0
- package/dist/cli/helpers/progress-bar.js +81 -0
- package/dist/cli/helpers/quit.d.ts +1 -0
- package/dist/cli/helpers/quit.js +7 -0
- package/dist/cli/helpers/yes-or-no.d.ts +4 -0
- package/dist/cli/helpers/yes-or-no.js +44 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +52 -0
- package/dist/cli/log.d.ts +21 -0
- package/dist/cli/log.js +5 -0
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.js +17 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +31 -0
- package/dist/internals.d.ts +3 -0
- package/dist/internals.js +7 -0
- package/dist/pricing/gcp-regions.d.ts +5 -0
- package/dist/pricing/gcp-regions.js +77 -0
- package/dist/regions.d.ts +2 -0
- package/dist/regions.js +5 -0
- package/dist/shared/bundle-site.d.ts +2 -0
- package/dist/shared/bundle-site.js +5 -0
- package/dist/shared/constants.d.ts +13 -0
- package/dist/shared/constants.js +18 -0
- package/dist/shared/convert-to-serve-url.d.ts +4 -0
- package/dist/shared/convert-to-serve-url.js +14 -0
- package/dist/shared/docs-url.d.ts +1 -0
- package/dist/shared/docs-url.js +4 -0
- package/dist/shared/generate-service-name.d.ts +5 -0
- package/dist/shared/generate-service-name.js +20 -0
- package/dist/shared/get-etag.d.ts +1 -0
- package/dist/shared/get-etag.js +24 -0
- package/dist/shared/get-storage-operations.d.ts +10 -0
- package/dist/shared/get-storage-operations.js +36 -0
- package/dist/shared/make-storage-key.d.ts +1 -0
- package/dist/shared/make-storage-key.js +11 -0
- package/dist/shared/make-storage-url.d.ts +4 -0
- package/dist/shared/make-storage-url.js +7 -0
- package/dist/shared/random-hash.d.ts +3 -0
- package/dist/shared/random-hash.js +14 -0
- package/dist/shared/read-dir.d.ts +9 -0
- package/dist/shared/read-dir.js +57 -0
- package/dist/shared/sa-permissions.json +60 -0
- package/dist/shared/service-version-string.d.ts +1 -0
- package/dist/shared/service-version-string.js +8 -0
- package/dist/shared/validate-bucketname.d.ts +8 -0
- package/dist/shared/validate-bucketname.js +35 -0
- package/dist/shared/validate-cloudrun-url.d.ts +1 -0
- package/dist/shared/validate-cloudrun-url.js +10 -0
- package/dist/shared/validate-gcp-codec.d.ts +4 -0
- package/dist/shared/validate-gcp-codec.js +29 -0
- package/dist/shared/validate-gcp-region.d.ts +2 -0
- package/dist/shared/validate-gcp-region.js +10 -0
- package/dist/shared/validate-image-remotion-version.d.ts +1 -0
- package/dist/shared/validate-image-remotion-version.js +26 -0
- package/dist/shared/validate-privacy.d.ts +2 -0
- package/dist/shared/validate-privacy.js +12 -0
- package/dist/shared/validate-project-id.d.ts +1 -0
- package/dist/shared/validate-project-id.js +17 -0
- package/dist/shared/validate-region.d.ts +1 -0
- package/dist/shared/validate-region.js +15 -0
- package/dist/shared/validate-retries.d.ts +1 -0
- package/dist/shared/validate-retries.js +21 -0
- package/dist/shared/validate-serveurl.d.ts +1 -0
- package/dist/shared/validate-serveurl.js +30 -0
- package/dist/shared/validate-service-name.d.ts +1 -0
- package/dist/shared/validate-service-name.js +9 -0
- package/dist/shared/validate-site-name.d.ts +1 -0
- package/dist/shared/validate-site-name.js +17 -0
- package/package.json +59 -0
- package/readme.md +306 -0
- package/readmeImages/createSA.png +0 -0
- package/readmeImages/downloadEnv.jpg +0 -0
- package/readmeImages/downloadEnvFolder.png +0 -0
- package/readmeImages/saRole.png +0 -0
- package/readmeImages/selectCloudShell.jpg +0 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderMediaOnCloudrun = void 0;
|
|
4
|
+
const validate_gcp_codec_1 = require("../shared/validate-gcp-codec");
|
|
5
|
+
const validate_privacy_1 = require("../shared/validate-privacy");
|
|
6
|
+
const validate_serveurl_1 = require("../shared/validate-serveurl");
|
|
7
|
+
const get_or_create_bucket_1 = require("./get-or-create-bucket");
|
|
8
|
+
const get_auth_client_for_url_1 = require("./helpers/get-auth-client-for-url");
|
|
9
|
+
const get_cloudrun_endpoint_1 = require("./helpers/get-cloudrun-endpoint");
|
|
10
|
+
/**
|
|
11
|
+
* @description Triggers a render on a GCP Cloud Run service given a composition and a Cloud Run URL.
|
|
12
|
+
* @see [Documentation](https://remotion.dev/docs/lambda/renderMediaOnGcp)
|
|
13
|
+
* @param params.cloudRunUrl The URL of the Cloud Run service that should be used. Use either this or serviceName.
|
|
14
|
+
* @param params.serviceName The name of the Cloud Run service that should be used. Use either this or cloudRunUrl.
|
|
15
|
+
* @param params.region The region that the Cloud Run service is deployed in.
|
|
16
|
+
* @param params.serveUrl The URL of the deployed project
|
|
17
|
+
* @param params.composition The ID of the composition which should be rendered.
|
|
18
|
+
* @param params.inputProps The input props that should be passed to the composition.
|
|
19
|
+
* @param params.codec The media codec which should be used for encoding.
|
|
20
|
+
* @param params.forceBucketName The name of the bucket that the output file should be uploaded to.
|
|
21
|
+
* @param params.privacy Whether the output file should be public or private.
|
|
22
|
+
* @param params.outputFile The name of the output file.
|
|
23
|
+
* @param params.updateRenderProgress A callback that is called with the progress of the render.
|
|
24
|
+
* @param params.jpegQuality JPEG quality if JPEG was selected as the image format.
|
|
25
|
+
* @param params.audioCodec The encoding of the audio of the output video.
|
|
26
|
+
* @param params.audioBitrate The target bitrate for the audio of the generated video.
|
|
27
|
+
* @param params.videoBitrate The target bitrate of the generated video.
|
|
28
|
+
* @param params.proResProfile Sets a ProRes profile. Only applies to videos rendered with prores codec.
|
|
29
|
+
* @param params.crf Constant Rate Factor, controlling the quality.
|
|
30
|
+
* @param params.pixelFormat Custom pixel format to use. Usually used for special use cases like transparent videos.
|
|
31
|
+
* @param params.imageFormat Which image format the frames should be rendered in.
|
|
32
|
+
* @param params.scale Scales the output dimensions by a factor.
|
|
33
|
+
* @param params.everyNthFrame Only used if rendering gigs - renders only every nth frame.
|
|
34
|
+
* @param params.numberOfGifLoops Only used if rendering gigs - how many times the gif should loop. Null means infinite.
|
|
35
|
+
* @param params.frameRange Specify a single frame (a number) or a range of frames (a tuple [number, number]) to be rendered.
|
|
36
|
+
* @param params.envVariables Object containing environment variables to be injected in your project.
|
|
37
|
+
* @param params.chromiumOptions Allows you to set certain Chromium / Google Chrome flags.
|
|
38
|
+
* @param params.muted If set to true, no audio is rendered.
|
|
39
|
+
* @param params.forceWidth Overrides default composition width.
|
|
40
|
+
* @param params.forceHeight Overrides default composition height.
|
|
41
|
+
* @param params.logLevel Level of logging that Cloud Run service should perform. Default "info".
|
|
42
|
+
* @returns {Promise<RenderMediaOnCloudrunOutput>} See documentation for detailed structure
|
|
43
|
+
*/
|
|
44
|
+
const renderMediaOnCloudrun = async ({ cloudRunUrl, serviceName, region, serveUrl, composition, inputProps, codec, forceBucketName, privacy, outName, updateRenderProgress, jpegQuality, audioCodec, audioBitrate, videoBitrate, proResProfile, crf, pixelFormat, imageFormat, scale, everyNthFrame, numberOfGifLoops, frameRange, envVariables, chromiumOptions, muted, forceWidth, forceHeight, logLevel, }) => {
|
|
45
|
+
const actualCodec = (0, validate_gcp_codec_1.validateCloudrunCodec)(codec);
|
|
46
|
+
(0, validate_serveurl_1.validateServeUrl)(serveUrl);
|
|
47
|
+
if (privacy)
|
|
48
|
+
(0, validate_privacy_1.validatePrivacy)(privacy);
|
|
49
|
+
const outputBucket = forceBucketName !== null && forceBucketName !== void 0 ? forceBucketName : (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
|
|
50
|
+
const cloudRunEndpoint = await (0, get_cloudrun_endpoint_1.getCloudrunEndpoint)({
|
|
51
|
+
cloudRunUrl,
|
|
52
|
+
serviceName,
|
|
53
|
+
region,
|
|
54
|
+
});
|
|
55
|
+
const data = {
|
|
56
|
+
composition,
|
|
57
|
+
serveUrl,
|
|
58
|
+
codec: actualCodec,
|
|
59
|
+
inputProps,
|
|
60
|
+
jpegQuality,
|
|
61
|
+
audioCodec,
|
|
62
|
+
audioBitrate,
|
|
63
|
+
videoBitrate,
|
|
64
|
+
crf,
|
|
65
|
+
pixelFormat,
|
|
66
|
+
imageFormat,
|
|
67
|
+
scale,
|
|
68
|
+
proResProfile,
|
|
69
|
+
everyNthFrame,
|
|
70
|
+
numberOfGifLoops,
|
|
71
|
+
frameRange,
|
|
72
|
+
envVariables,
|
|
73
|
+
chromiumOptions,
|
|
74
|
+
muted,
|
|
75
|
+
outputBucket,
|
|
76
|
+
privacy,
|
|
77
|
+
outName,
|
|
78
|
+
forceWidth,
|
|
79
|
+
forceHeight,
|
|
80
|
+
type: 'media',
|
|
81
|
+
logLevel: logLevel !== null && logLevel !== void 0 ? logLevel : 'info',
|
|
82
|
+
};
|
|
83
|
+
const client = await (0, get_auth_client_for_url_1.getAuthClientForUrl)(cloudRunEndpoint);
|
|
84
|
+
const postResponse = await client.request({
|
|
85
|
+
url: cloudRunEndpoint,
|
|
86
|
+
method: 'POST',
|
|
87
|
+
data,
|
|
88
|
+
responseType: 'stream',
|
|
89
|
+
});
|
|
90
|
+
const renderResponse = await new Promise((resolve, reject) => {
|
|
91
|
+
// TODO: Add any sort of type safety
|
|
92
|
+
let response;
|
|
93
|
+
const stream = postResponse.data;
|
|
94
|
+
stream.on('data', (chunk) => {
|
|
95
|
+
const chunkResponse = JSON.parse(chunk.toString());
|
|
96
|
+
if (chunkResponse.response) {
|
|
97
|
+
response = chunkResponse.response;
|
|
98
|
+
}
|
|
99
|
+
else if (chunkResponse.onProgress) {
|
|
100
|
+
updateRenderProgress === null || updateRenderProgress === void 0 ? void 0 : updateRenderProgress(chunkResponse.onProgress);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
stream.on('end', () => {
|
|
104
|
+
if (response.status !== 'success') {
|
|
105
|
+
throw new Error(response.stack);
|
|
106
|
+
}
|
|
107
|
+
resolve(response);
|
|
108
|
+
});
|
|
109
|
+
stream.on('error', (error) => {
|
|
110
|
+
reject(error);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
return renderResponse;
|
|
114
|
+
};
|
|
115
|
+
exports.renderMediaOnCloudrun = renderMediaOnCloudrun;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { ChromiumOptions, LogLevel, StillImageFormat } from '@remotion/renderer';
|
|
2
|
+
import type { RenderStillOnCloudrunOutput } from '../functions/helpers/payloads';
|
|
3
|
+
import type { GcpRegion } from '../pricing/gcp-regions';
|
|
4
|
+
export declare type RenderStillOnCloudrunInput = {
|
|
5
|
+
cloudRunUrl?: string;
|
|
6
|
+
serviceName?: string;
|
|
7
|
+
region: GcpRegion;
|
|
8
|
+
serveUrl: string;
|
|
9
|
+
composition: string;
|
|
10
|
+
inputProps?: Record<string, unknown>;
|
|
11
|
+
privacy?: 'public' | 'private';
|
|
12
|
+
forceBucketName?: string;
|
|
13
|
+
outName?: string;
|
|
14
|
+
imageFormat: StillImageFormat;
|
|
15
|
+
envVariables?: Record<string, string>;
|
|
16
|
+
frame?: number;
|
|
17
|
+
jpegQuality?: number;
|
|
18
|
+
chromiumOptions?: ChromiumOptions;
|
|
19
|
+
scale?: number;
|
|
20
|
+
forceWidth?: number | null;
|
|
21
|
+
forceHeight?: number | null;
|
|
22
|
+
logLevel?: LogLevel;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* @description Triggers a render on a GCP Cloud Run service given a composition and a Cloud Run URL.
|
|
26
|
+
* @see [Documentation](https://remotion.dev/docs/cloudrun/renderstilloncloudrun)
|
|
27
|
+
* @param params.cloudRunUrl The URL of the Cloud Run service that should be used. Use either this or serviceName.
|
|
28
|
+
* @param params.serviceName The name of the Cloud Run service that should be used. Use either this or cloudRunUrl.
|
|
29
|
+
* @param params.region The region that the Cloud Run service is deployed in.
|
|
30
|
+
* @param params.serveUrl The URL of the deployed project
|
|
31
|
+
* @param params.composition The ID of the composition which should be rendered.
|
|
32
|
+
* @param params.inputProps The input props that should be passed to the composition.
|
|
33
|
+
* @param params.forceBucketName The name of the bucket that the output file should be uploaded to.
|
|
34
|
+
* @param params.privacy Whether the output file should be public or private.
|
|
35
|
+
* @param params.outName The name of the output file.
|
|
36
|
+
* @param params.imageFormat Which image format the frame should be rendered in.
|
|
37
|
+
* @param params.envVariables Object containing environment variables to be injected in your project.
|
|
38
|
+
* @param params.frame Which frame of the composition should be rendered. Frames are zero-indexed.
|
|
39
|
+
* @param params.jpegQuality JPEG quality if JPEG was selected as the image format.
|
|
40
|
+
* @param params.chromiumOptions Allows you to set certain Chromium / Google Chrome flags.
|
|
41
|
+
* @param params.scale Scales the output dimensions by a factor.
|
|
42
|
+
* @param params.forceWidth Overrides default composition width.
|
|
43
|
+
* @param params.forceHeight Overrides default composition height.
|
|
44
|
+
* @param params.logLevel Level of logging that Cloud Run service should perform. Default "info".
|
|
45
|
+
* @returns {Promise<RenderStillOnCloudrunOutput>} See documentation for detailed structure
|
|
46
|
+
*/
|
|
47
|
+
export declare const renderStillOnCloudrun: ({ cloudRunUrl, serviceName, region, serveUrl, composition, inputProps, forceBucketName, privacy, outName, imageFormat, envVariables, frame, jpegQuality, chromiumOptions, scale, forceWidth, forceHeight, logLevel, }: RenderStillOnCloudrunInput) => Promise<RenderStillOnCloudrunOutput>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderStillOnCloudrun = void 0;
|
|
4
|
+
const validate_privacy_1 = require("../shared/validate-privacy");
|
|
5
|
+
const validate_serveurl_1 = require("../shared/validate-serveurl");
|
|
6
|
+
const get_or_create_bucket_1 = require("./get-or-create-bucket");
|
|
7
|
+
const get_auth_client_for_url_1 = require("./helpers/get-auth-client-for-url");
|
|
8
|
+
const get_cloudrun_endpoint_1 = require("./helpers/get-cloudrun-endpoint");
|
|
9
|
+
/**
|
|
10
|
+
* @description Triggers a render on a GCP Cloud Run service given a composition and a Cloud Run URL.
|
|
11
|
+
* @see [Documentation](https://remotion.dev/docs/cloudrun/renderstilloncloudrun)
|
|
12
|
+
* @param params.cloudRunUrl The URL of the Cloud Run service that should be used. Use either this or serviceName.
|
|
13
|
+
* @param params.serviceName The name of the Cloud Run service that should be used. Use either this or cloudRunUrl.
|
|
14
|
+
* @param params.region The region that the Cloud Run service is deployed in.
|
|
15
|
+
* @param params.serveUrl The URL of the deployed project
|
|
16
|
+
* @param params.composition The ID of the composition which should be rendered.
|
|
17
|
+
* @param params.inputProps The input props that should be passed to the composition.
|
|
18
|
+
* @param params.forceBucketName The name of the bucket that the output file should be uploaded to.
|
|
19
|
+
* @param params.privacy Whether the output file should be public or private.
|
|
20
|
+
* @param params.outName The name of the output file.
|
|
21
|
+
* @param params.imageFormat Which image format the frame should be rendered in.
|
|
22
|
+
* @param params.envVariables Object containing environment variables to be injected in your project.
|
|
23
|
+
* @param params.frame Which frame of the composition should be rendered. Frames are zero-indexed.
|
|
24
|
+
* @param params.jpegQuality JPEG quality if JPEG was selected as the image format.
|
|
25
|
+
* @param params.chromiumOptions Allows you to set certain Chromium / Google Chrome flags.
|
|
26
|
+
* @param params.scale Scales the output dimensions by a factor.
|
|
27
|
+
* @param params.forceWidth Overrides default composition width.
|
|
28
|
+
* @param params.forceHeight Overrides default composition height.
|
|
29
|
+
* @param params.logLevel Level of logging that Cloud Run service should perform. Default "info".
|
|
30
|
+
* @returns {Promise<RenderStillOnCloudrunOutput>} See documentation for detailed structure
|
|
31
|
+
*/
|
|
32
|
+
const renderStillOnCloudrun = async ({ cloudRunUrl, serviceName, region, serveUrl, composition, inputProps, forceBucketName, privacy, outName, imageFormat, envVariables, frame, jpegQuality, chromiumOptions, scale, forceWidth, forceHeight, logLevel, }) => {
|
|
33
|
+
(0, validate_serveurl_1.validateServeUrl)(serveUrl);
|
|
34
|
+
if (privacy)
|
|
35
|
+
(0, validate_privacy_1.validatePrivacy)(privacy);
|
|
36
|
+
const outputBucket = forceBucketName !== null && forceBucketName !== void 0 ? forceBucketName : (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
|
|
37
|
+
const cloudRunEndpoint = await (0, get_cloudrun_endpoint_1.getCloudrunEndpoint)({
|
|
38
|
+
cloudRunUrl,
|
|
39
|
+
serviceName,
|
|
40
|
+
region,
|
|
41
|
+
});
|
|
42
|
+
const data = {
|
|
43
|
+
composition,
|
|
44
|
+
serveUrl,
|
|
45
|
+
inputProps,
|
|
46
|
+
outputBucket,
|
|
47
|
+
outName,
|
|
48
|
+
privacy,
|
|
49
|
+
imageFormat,
|
|
50
|
+
envVariables,
|
|
51
|
+
jpegQuality,
|
|
52
|
+
chromiumOptions,
|
|
53
|
+
scale,
|
|
54
|
+
forceWidth,
|
|
55
|
+
forceHeight,
|
|
56
|
+
frame: frame !== null && frame !== void 0 ? frame : 0,
|
|
57
|
+
type: 'still',
|
|
58
|
+
logLevel: logLevel !== null && logLevel !== void 0 ? logLevel : 'info',
|
|
59
|
+
};
|
|
60
|
+
const client = await (0, get_auth_client_for_url_1.getAuthClientForUrl)(cloudRunEndpoint);
|
|
61
|
+
const renderResponse = await client.request({
|
|
62
|
+
url: cloudRunUrl,
|
|
63
|
+
method: 'POST',
|
|
64
|
+
data,
|
|
65
|
+
});
|
|
66
|
+
return renderResponse.data;
|
|
67
|
+
};
|
|
68
|
+
exports.renderStillOnCloudrun = renderStillOnCloudrun;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @description Speculate the name of a Cloud Run service that will be created when you call `deployService`, based on the service configuration.
|
|
3
|
+
* @see [Documentation](https://www.remotion.dev/docs/cloudrun/speculateservicename)
|
|
4
|
+
* @param memoryLimit The upper bound on the amount of RAM that the Cloud Run service can consume.
|
|
5
|
+
* @param cpuLimit The maximum number of CPU cores that the Cloud Run service can use to process requests.
|
|
6
|
+
* @param timeoutInSeconds How long the Cloud Run Service may run before it gets killed.
|
|
7
|
+
* @returns {string} The speculated Cloud Run service name
|
|
8
|
+
*/
|
|
9
|
+
export declare const speculateServiceName: ({ memoryLimit, cpuLimit, timeoutSeconds, }: {
|
|
10
|
+
memoryLimit: string;
|
|
11
|
+
cpuLimit: string;
|
|
12
|
+
timeoutSeconds: number;
|
|
13
|
+
}) => string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.speculateServiceName = void 0;
|
|
4
|
+
const generate_service_name_1 = require("../shared/generate-service-name");
|
|
5
|
+
/**
|
|
6
|
+
* @description Speculate the name of a Cloud Run service that will be created when you call `deployService`, based on the service configuration.
|
|
7
|
+
* @see [Documentation](https://www.remotion.dev/docs/cloudrun/speculateservicename)
|
|
8
|
+
* @param memoryLimit The upper bound on the amount of RAM that the Cloud Run service can consume.
|
|
9
|
+
* @param cpuLimit The maximum number of CPU cores that the Cloud Run service can use to process requests.
|
|
10
|
+
* @param timeoutInSeconds How long the Cloud Run Service may run before it gets killed.
|
|
11
|
+
* @returns {string} The speculated Cloud Run service name
|
|
12
|
+
*/
|
|
13
|
+
const speculateServiceName = ({ memoryLimit, cpuLimit, timeoutSeconds, }) => {
|
|
14
|
+
return (0, generate_service_name_1.generateServiceName)({
|
|
15
|
+
memoryLimit,
|
|
16
|
+
cpuLimit,
|
|
17
|
+
timeoutSeconds,
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
exports.speculateServiceName = speculateServiceName;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare type UploadDirProgress = {
|
|
2
|
+
totalFiles: number;
|
|
3
|
+
filesUploaded: number;
|
|
4
|
+
totalSize: number;
|
|
5
|
+
sizeUploaded: number;
|
|
6
|
+
};
|
|
7
|
+
export declare type MockFile = {
|
|
8
|
+
name: string;
|
|
9
|
+
content: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const getDirFiles: (entry: string) => MockFile[];
|
|
12
|
+
export declare const uploadDir: ({ bucket, localDir, onProgress, keyPrefix, toUpload, }: {
|
|
13
|
+
bucket: string;
|
|
14
|
+
localDir: string;
|
|
15
|
+
keyPrefix: string;
|
|
16
|
+
onProgress: (progress: UploadDirProgress) => void;
|
|
17
|
+
toUpload: string[];
|
|
18
|
+
}) => Promise<void>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.uploadDir = exports.getDirFiles = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const make_storage_key_1 = require("../shared/make-storage-key");
|
|
10
|
+
const get_cloud_storage_client_1 = require("./helpers/get-cloud-storage-client");
|
|
11
|
+
const getDirFiles = (entry) => {
|
|
12
|
+
throw new TypeError('should only be executed in test ' + JSON.stringify(entry));
|
|
13
|
+
};
|
|
14
|
+
exports.getDirFiles = getDirFiles;
|
|
15
|
+
const uploadDir = async ({ bucket, localDir, onProgress, keyPrefix, toUpload, }) => {
|
|
16
|
+
const files = await getFiles(localDir, localDir, toUpload);
|
|
17
|
+
const progresses = {};
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
progresses[file.name] = 0;
|
|
20
|
+
}
|
|
21
|
+
async function getFiles(directory, originalDirectory, filesToUpload) {
|
|
22
|
+
const dirents = await fs_1.promises.readdir(directory, { withFileTypes: true });
|
|
23
|
+
const _files = await Promise.all(dirents
|
|
24
|
+
.map((dirent) => {
|
|
25
|
+
const res = path_1.default.resolve(directory, dirent.name);
|
|
26
|
+
return [dirent, res];
|
|
27
|
+
})
|
|
28
|
+
.filter(([dirent, res]) => {
|
|
29
|
+
const relative = path_1.default.relative(originalDirectory, res);
|
|
30
|
+
if (dirent.isDirectory()) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
if (!filesToUpload.includes(relative)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
return true;
|
|
37
|
+
})
|
|
38
|
+
.map(async ([dirent, res]) => {
|
|
39
|
+
const { size } = await fs_1.promises.stat(res);
|
|
40
|
+
return dirent.isDirectory()
|
|
41
|
+
? getFiles(res, originalDirectory, filesToUpload)
|
|
42
|
+
: [
|
|
43
|
+
{
|
|
44
|
+
name: res,
|
|
45
|
+
size,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
}));
|
|
49
|
+
return _files.flat(1);
|
|
50
|
+
}
|
|
51
|
+
const cloudStorageClient = (0, get_cloud_storage_client_1.getCloudStorageClient)();
|
|
52
|
+
const uploads = files.map((file) => {
|
|
53
|
+
const filePath = file.name;
|
|
54
|
+
const destination = (0, make_storage_key_1.makeStorageKey)(keyPrefix, localDir, filePath);
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
(0, fs_1.createReadStream)(filePath)
|
|
57
|
+
.pipe(cloudStorageClient
|
|
58
|
+
.bucket(bucket)
|
|
59
|
+
.file(destination)
|
|
60
|
+
.createWriteStream({ public: true }))
|
|
61
|
+
.on('error', (error) => reject(error))
|
|
62
|
+
.on('progress', (p) => {
|
|
63
|
+
var _a;
|
|
64
|
+
progresses[filePath] = (_a = p.bytesWritten) !== null && _a !== void 0 ? _a : 0;
|
|
65
|
+
})
|
|
66
|
+
.on('finish', () => resolve('done'));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
const promise = Promise.all(uploads);
|
|
70
|
+
const interval = setInterval(() => {
|
|
71
|
+
onProgress({
|
|
72
|
+
totalSize: files.map((f) => f.size).reduce((a, b) => a + b, 0),
|
|
73
|
+
sizeUploaded: Object.values(progresses).reduce((a, b) => a + b, 0),
|
|
74
|
+
totalFiles: files.length,
|
|
75
|
+
filesUploaded: files.filter((f) => progresses[f.name] === f.size).length,
|
|
76
|
+
});
|
|
77
|
+
}, 1000);
|
|
78
|
+
await promise;
|
|
79
|
+
clearInterval(interval);
|
|
80
|
+
};
|
|
81
|
+
exports.uploadDir = uploadDir;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="minimist" />
|
|
2
|
+
import type { GcpRegion } from '../pricing/gcp-regions';
|
|
3
|
+
declare type servicesCommandLineOptions = {
|
|
4
|
+
help: boolean;
|
|
5
|
+
region: GcpRegion;
|
|
6
|
+
['project-id']: string;
|
|
7
|
+
['service-name']: string;
|
|
8
|
+
y: boolean;
|
|
9
|
+
yes: boolean;
|
|
10
|
+
force: boolean;
|
|
11
|
+
f: boolean;
|
|
12
|
+
['max-retries']: number;
|
|
13
|
+
['out-name']: string | undefined;
|
|
14
|
+
['output-bucket']: string;
|
|
15
|
+
['output-folder-path']: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const parsedCloudrunCli: servicesCommandLineOptions & import("minimist").ParsedArgs;
|
|
18
|
+
export declare const forceFlagProvided: boolean;
|
|
19
|
+
export {};
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.forceFlagProvided = exports.parsedCloudrunCli = void 0;
|
|
4
|
+
const cli_1 = require("@remotion/cli");
|
|
5
|
+
exports.parsedCloudrunCli = cli_1.CliInternals.minimist(process.argv.slice(2), {
|
|
6
|
+
boolean: cli_1.CliInternals.BooleanFlags,
|
|
7
|
+
});
|
|
8
|
+
exports.forceFlagProvided = exports.parsedCloudrunCli.f ||
|
|
9
|
+
exports.parsedCloudrunCli.force ||
|
|
10
|
+
exports.parsedCloudrunCli.yes ||
|
|
11
|
+
exports.parsedCloudrunCli.y;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.permissionsCommand = exports.PERMISSIONS_COMMAND = void 0;
|
|
4
|
+
const cli_1 = require("@remotion/cli");
|
|
5
|
+
const testPermissions_1 = require("../../api/iam-validation/testPermissions");
|
|
6
|
+
const log_1 = require("../log");
|
|
7
|
+
exports.PERMISSIONS_COMMAND = 'permissions';
|
|
8
|
+
const permissionsCommand = async () => {
|
|
9
|
+
try {
|
|
10
|
+
log_1.Log.info(cli_1.CliInternals.chalk.blueBright(`Checking permissions for ${process.env.REMOTION_GCP_CLIENT_EMAIL} in project ${process.env.REMOTION_GCP_PROJECT_ID}.`));
|
|
11
|
+
log_1.Log.info();
|
|
12
|
+
await (0, testPermissions_1.testPermissions)({
|
|
13
|
+
onTest: (res) => {
|
|
14
|
+
log_1.Log.info((0, testPermissions_1.logPermissionOutput)(res));
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
log_1.Log.error('Did not have the required permissions on GCP:');
|
|
20
|
+
log_1.Log.error(err);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
exports.permissionsCommand = permissionsCommand;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.regionsCommand = exports.REGIONS_COMMAND = void 0;
|
|
4
|
+
const cli_1 = require("@remotion/cli");
|
|
5
|
+
const regions_1 = require("../../regions");
|
|
6
|
+
exports.REGIONS_COMMAND = 'regions';
|
|
7
|
+
const regionsCommand = () => {
|
|
8
|
+
cli_1.CliInternals.Log.info(regions_1.GCP_REGIONS.join(' '));
|
|
9
|
+
};
|
|
10
|
+
exports.regionsCommand = regionsCommand;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const renderArgsCheck: (subcommand: string, args: string[]) => Promise<{
|
|
2
|
+
serveUrl: string;
|
|
3
|
+
cloudRunUrl: any;
|
|
4
|
+
outName: string | undefined;
|
|
5
|
+
forceBucketName: any;
|
|
6
|
+
privacy: import("../../../../shared/constants").Privacy;
|
|
7
|
+
downloadName: string;
|
|
8
|
+
region: "asia-east1" | "asia-east2" | "asia-northeast1" | "asia-northeast2" | "asia-northeast3" | "asia-south1" | "asia-south2" | "asia-southeast1" | "asia-southeast2" | "australia-southeast1" | "australia-southeast2" | "europe-central2" | "europe-north1" | "europe-southwest1" | "europe-west1" | "europe-west2" | "europe-west3" | "europe-west4" | "europe-west6" | "europe-west8" | "europe-west9" | "me-west1" | "northamerica-northeast1" | "northamerica-northeast2" | "southamerica-east1" | "southamerica-west1" | "us-central1" | "us-east1" | "us-east4" | "us-east5" | "us-south1" | "us-west1" | "us-west2" | "us-west3" | "us-west4";
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderArgsCheck = void 0;
|
|
4
|
+
const get_or_create_bucket_1 = require("../../../../api/get-or-create-bucket");
|
|
5
|
+
const get_service_info_1 = require("../../../../api/get-service-info");
|
|
6
|
+
const get_services_1 = require("../../../../api/get-services");
|
|
7
|
+
const constants_1 = require("../../../../shared/constants");
|
|
8
|
+
const convert_to_serve_url_1 = require("../../../../shared/convert-to-serve-url");
|
|
9
|
+
const validate_privacy_1 = require("../../../../shared/validate-privacy");
|
|
10
|
+
const args_1 = require("../../../args");
|
|
11
|
+
const get_gcp_region_1 = require("../../../get-gcp-region");
|
|
12
|
+
const quit_1 = require("../../../helpers/quit");
|
|
13
|
+
const log_1 = require("../../../log");
|
|
14
|
+
const services_1 = require("../../services");
|
|
15
|
+
const deploy_1 = require("../../services/deploy");
|
|
16
|
+
const renderArgsCheck = async (subcommand, args) => {
|
|
17
|
+
var _a, _b, _c, _d;
|
|
18
|
+
let region = (0, get_gcp_region_1.getGcpRegion)();
|
|
19
|
+
let remotionBucket;
|
|
20
|
+
let serveUrl = args[0];
|
|
21
|
+
if (!serveUrl) {
|
|
22
|
+
log_1.Log.error('No serve URL passed.');
|
|
23
|
+
log_1.Log.info('Pass an additional argument specifying a URL where your Remotion project is hosted.');
|
|
24
|
+
log_1.Log.info();
|
|
25
|
+
log_1.Log.info(`${constants_1.BINARY_NAME} ${subcommand} <serve-url> <composition-id> [output-location]`);
|
|
26
|
+
(0, quit_1.quit)(1);
|
|
27
|
+
}
|
|
28
|
+
if (!serveUrl.startsWith('https://') && !serveUrl.startsWith('http://')) {
|
|
29
|
+
const siteName = serveUrl;
|
|
30
|
+
log_1.Log.verbose('Remotion site-name passed, constructing serve url...');
|
|
31
|
+
region = region !== null && region !== void 0 ? region : (0, get_gcp_region_1.getGcpRegion)();
|
|
32
|
+
remotionBucket = (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
|
|
33
|
+
serveUrl = (0, convert_to_serve_url_1.convertToServeUrl)({
|
|
34
|
+
urlOrId: siteName,
|
|
35
|
+
bucketName: remotionBucket,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const outName = args_1.parsedCloudrunCli['out-name'];
|
|
39
|
+
const downloadName = (_a = args[2]) !== null && _a !== void 0 ? _a : null;
|
|
40
|
+
const privacy = (_b = args_1.parsedCloudrunCli.privacy) !== null && _b !== void 0 ? _b : constants_1.DEFAULT_OUTPUT_PRIVACY;
|
|
41
|
+
(0, validate_privacy_1.validatePrivacy)(privacy);
|
|
42
|
+
const forceBucketName = (_d = (_c = args_1.parsedCloudrunCli['force-bucket-name']) !== null && _c !== void 0 ? _c : remotionBucket) !== null && _d !== void 0 ? _d : (await (0, get_or_create_bucket_1.getOrCreateBucket)({ region })).bucketName;
|
|
43
|
+
let cloudRunUrl = args_1.parsedCloudrunCli['cloud-run-url'];
|
|
44
|
+
let serviceName = args_1.parsedCloudrunCli['service-name'];
|
|
45
|
+
if (cloudRunUrl && serviceName) {
|
|
46
|
+
log_1.Log.error('Both a Cloud Run URL and a Service Name was provided. Specify only one.');
|
|
47
|
+
(0, quit_1.quit)(1);
|
|
48
|
+
}
|
|
49
|
+
if (!cloudRunUrl && !serviceName) {
|
|
50
|
+
const services = await (0, get_services_1.getServices)({ region, compatibleOnly: true });
|
|
51
|
+
if (services.length === 0) {
|
|
52
|
+
// TODO: Log if there is an incompatible service
|
|
53
|
+
log_1.Log.error('No compatible services found. Please create a service first:');
|
|
54
|
+
log_1.Log.info();
|
|
55
|
+
log_1.Log.info(` ${constants_1.BINARY_NAME} ${services_1.SERVICES_COMMAND} ${deploy_1.CLOUD_RUN_DEPLOY_SUBCOMMAND}`);
|
|
56
|
+
(0, quit_1.quit)(1);
|
|
57
|
+
}
|
|
58
|
+
serviceName = services[0].serviceName;
|
|
59
|
+
cloudRunUrl = services[0].uri;
|
|
60
|
+
}
|
|
61
|
+
if (serviceName && !cloudRunUrl) {
|
|
62
|
+
const { uri } = await (0, get_service_info_1.getServiceInfo)({ serviceName, region });
|
|
63
|
+
cloudRunUrl = uri;
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
serveUrl,
|
|
67
|
+
cloudRunUrl,
|
|
68
|
+
outName,
|
|
69
|
+
forceBucketName,
|
|
70
|
+
privacy,
|
|
71
|
+
downloadName,
|
|
72
|
+
region,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
exports.renderArgsCheck = renderArgsCheck;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderCommand = exports.RENDER_COMMAND = void 0;
|
|
4
|
+
const cli_1 = require("@remotion/cli");
|
|
5
|
+
const constants_1 = require("../../../shared/constants");
|
|
6
|
+
const quit_1 = require("../../helpers/quit");
|
|
7
|
+
const log_1 = require("../../log");
|
|
8
|
+
const renderMedia_1 = require("./renderMedia");
|
|
9
|
+
const renderStill_1 = require("./renderStill");
|
|
10
|
+
exports.RENDER_COMMAND = 'render';
|
|
11
|
+
const printCloudRunHelp = () => {
|
|
12
|
+
log_1.Log.info(`${constants_1.BINARY_NAME} ${exports.RENDER_COMMAND} <subcommand>`);
|
|
13
|
+
log_1.Log.info();
|
|
14
|
+
log_1.Log.info('Available subcommands:');
|
|
15
|
+
log_1.Log.info('');
|
|
16
|
+
log_1.Log.info(`${constants_1.BINARY_NAME} ${exports.RENDER_COMMAND} ${renderMedia_1.RENDER_MEDIA_SUBCOMMAND}`);
|
|
17
|
+
log_1.Log.info(cli_1.CliInternals.chalk.gray('Render Media on Cloud Run'));
|
|
18
|
+
log_1.Log.info('');
|
|
19
|
+
log_1.Log.info(`${constants_1.BINARY_NAME} ${exports.RENDER_COMMAND} ${renderStill_1.RENDER_STILL_SUBCOMMAND}`);
|
|
20
|
+
log_1.Log.info(cli_1.CliInternals.chalk.gray('Render Still on Cloud Run'));
|
|
21
|
+
};
|
|
22
|
+
const renderCommand = (args, remotionRoot) => {
|
|
23
|
+
if (args[0] === renderMedia_1.RENDER_MEDIA_SUBCOMMAND) {
|
|
24
|
+
return (0, renderMedia_1.renderMediaSubcommand)(args.slice(1), remotionRoot);
|
|
25
|
+
}
|
|
26
|
+
if (args[0] === renderStill_1.RENDER_STILL_SUBCOMMAND) {
|
|
27
|
+
return (0, renderStill_1.renderStillSubcommand)(args.slice(1), remotionRoot);
|
|
28
|
+
}
|
|
29
|
+
if (args[0]) {
|
|
30
|
+
log_1.Log.error(`Subcommand ${args[0]} not found.`);
|
|
31
|
+
printCloudRunHelp();
|
|
32
|
+
(0, quit_1.quit)(1);
|
|
33
|
+
}
|
|
34
|
+
printCloudRunHelp();
|
|
35
|
+
};
|
|
36
|
+
exports.renderCommand = renderCommand;
|