@helloao/cli 0.0.5 → 0.0.7

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/files.d.ts DELETED
@@ -1,113 +0,0 @@
1
- import { InputFile, OutputFile } from "@helloao/tools/generation/common-types";
2
- import { Readable } from "stream";
3
- /**
4
- * Defines an interface that contains information about a serialized file.
5
- */
6
- export interface Uploader {
7
- /**
8
- * Gets the ideal batch size for the uploader.
9
- * Null if the uploader does not need batching.
10
- */
11
- idealBatchSize: number | null;
12
- /**
13
- * Uploads the given file.
14
- * @param file The file to upload.
15
- * @param overwrite Whether the file should be overwritten if it already exists.
16
- * @returns True if the file was uploaded. False if the file was skipped due to already existing.
17
- */
18
- upload(file: SerializedFile, overwrite: boolean): Promise<boolean>;
19
- /**
20
- * Disposes resources that the uploader uses.
21
- */
22
- dispose?(): Promise<void>;
23
- }
24
- /**
25
- * Defines an interface for a file that has been serialized.
26
- */
27
- export interface SerializedFile {
28
- path: string;
29
- content: string | Readable;
30
- /**
31
- * Gets the base64-encoded SHA256 hash of the content of the file.
32
- */
33
- sha256?(): string;
34
- }
35
- /**
36
- * The options for serializing API files.
37
- */
38
- export interface SerializeApiOptions {
39
- /**
40
- * Whether the output should be pretty-printed.
41
- */
42
- pretty?: boolean;
43
- }
44
- /**
45
- * Serializes the given output files into serialized files using the given options.
46
- *
47
- * Each iteration of the given files will be processed as a batch, and any mergable files will automatically be merged together and serialized in the final batch.
48
- *
49
- * @param files The files that should be serialized.
50
- * @param options The options for serialization.
51
- */
52
- export declare function serializeOutputFiles(files: AsyncIterable<OutputFile[]>, options: SerializeApiOptions): AsyncGenerator<SerializedFile[]>;
53
- /**
54
- * Serializes the given output file content into a serialized file.
55
- * @param path The path that the file should be saved to.
56
- * @param content The content of the file.
57
- * @param options The options for serialization.
58
- */
59
- export declare function serializeFile(path: string, content: OutputFile['content'], options: SerializeApiOptions): Promise<SerializedFile | null>;
60
- /**
61
- * Loads the files for the given translations.
62
- * @param dir The directory that the translations exist in.
63
- */
64
- export declare function loadTranslationsFiles(dirs: string[]): Promise<InputFile[]>;
65
- /**
66
- * Loads the files for the given translation.
67
- * @param translation The directory that the translation exists in.
68
- * @returns
69
- */
70
- export declare function loadTranslationFiles(translation: string): Promise<InputFile[]>;
71
- export interface CollectionTranslationMetadata {
72
- name: {
73
- local: string;
74
- abbrev: string;
75
- english: string;
76
- };
77
- language: string;
78
- year: number;
79
- direction: 'ltr' | 'rtl';
80
- copyright: {
81
- licenses: any[];
82
- attribution: string;
83
- attribution_url: string;
84
- };
85
- id: string | null;
86
- source: {
87
- id: string;
88
- };
89
- }
90
- /**
91
- * Defines an uploader that is able to upload files to a directory.
92
- */
93
- export declare class FilesUploader implements Uploader {
94
- private _dir;
95
- constructor(dir: string);
96
- get idealBatchSize(): number | null;
97
- upload(file: SerializedFile, overwrite: boolean): Promise<boolean>;
98
- }
99
- /**
100
- * Defines an uploader that is able to upload files into a zip file.
101
- */
102
- export declare class ZipUploader implements Uploader {
103
- private _path;
104
- private _initPromise;
105
- private _fileHandle;
106
- private _zip;
107
- constructor(filePath: string);
108
- private _init;
109
- get idealBatchSize(): number | null;
110
- upload(file: SerializedFile, _overwrite: boolean): Promise<boolean>;
111
- dispose(): Promise<void>;
112
- }
113
- //# sourceMappingURL=files.d.ts.map
package/files.js DELETED
@@ -1,341 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ZipUploader = exports.FilesUploader = void 0;
27
- exports.serializeOutputFiles = serializeOutputFiles;
28
- exports.serializeFile = serializeFile;
29
- exports.loadTranslationsFiles = loadTranslationsFiles;
30
- exports.loadTranslationFiles = loadTranslationFiles;
31
- const promises_1 = require("fs/promises");
32
- const path_1 = require("path");
33
- const path = __importStar(require("path"));
34
- const fs_extra_1 = require("fs-extra");
35
- const zip_js_1 = require("@zip.js/zip.js");
36
- const stream_1 = require("stream");
37
- const hash_js_1 = require("hash.js");
38
- const usx_parser_1 = require("@helloao/tools/parser/usx-parser");
39
- const lodash_1 = require("lodash");
40
- const base64_js_1 = require("base64-js");
41
- /**
42
- * Serializes the given output files into serialized files using the given options.
43
- *
44
- * Each iteration of the given files will be processed as a batch, and any mergable files will automatically be merged together and serialized in the final batch.
45
- *
46
- * @param files The files that should be serialized.
47
- * @param options The options for serialization.
48
- */
49
- async function* serializeOutputFiles(files, options) {
50
- const mergableFiles = new Map();
51
- for await (let batch of files) {
52
- let serializedFiles = [];
53
- for (let file of batch) {
54
- if (file.mergable) {
55
- let arr = mergableFiles.get(file.path);
56
- if (!arr) {
57
- arr = [];
58
- mergableFiles.set(file.path, arr);
59
- }
60
- arr.push(file);
61
- continue;
62
- }
63
- const serialized = await serializeFile(file.path, file.content, options);
64
- if (serialized) {
65
- serializedFiles.push(serialized);
66
- }
67
- }
68
- yield serializedFiles;
69
- }
70
- let serializedFiles = [];
71
- for (let [path, files] of mergableFiles) {
72
- let content = {};
73
- for (let file of files) {
74
- if (!content) {
75
- content = file.content;
76
- }
77
- else {
78
- content = (0, lodash_1.mergeWith)(content, file.content, (objValue, srcValue) => {
79
- if (Array.isArray(objValue)) {
80
- return objValue.concat(srcValue);
81
- }
82
- return undefined;
83
- });
84
- }
85
- }
86
- if (content) {
87
- const serialized = await serializeFile(path, content, options);
88
- if (serialized) {
89
- serializedFiles.push(serialized);
90
- }
91
- }
92
- }
93
- yield serializedFiles;
94
- }
95
- /**
96
- * Serializes the given output file content into a serialized file.
97
- * @param path The path that the file should be saved to.
98
- * @param content The content of the file.
99
- * @param options The options for serialization.
100
- */
101
- async function serializeFile(path, content, options) {
102
- let fileContent;
103
- if (typeof content === 'function') {
104
- fileContent = await content();
105
- }
106
- else {
107
- fileContent = content;
108
- }
109
- const ext = (0, path_1.extname)(path);
110
- if (ext === '.json') {
111
- let json;
112
- if (fileContent instanceof ReadableStream) {
113
- json = '';
114
- for await (const chunk of stream_1.Readable.fromWeb(fileContent, {
115
- encoding: 'utf-8'
116
- })) {
117
- json += chunk;
118
- }
119
- }
120
- else {
121
- json = JSON.stringify(content, undefined, options.pretty ? 2 : undefined);
122
- }
123
- return {
124
- path,
125
- content: json,
126
- sha256: () => (0, base64_js_1.fromByteArray)(new Uint8Array((0, hash_js_1.sha256)().update(json).digest()))
127
- };
128
- }
129
- else if (ext === '.mp3') {
130
- if (fileContent instanceof ReadableStream) {
131
- return {
132
- path,
133
- content: stream_1.Readable.fromWeb(fileContent),
134
- };
135
- }
136
- else {
137
- console.warn('Expected content to be a readable stream for', path);
138
- console.warn('Skipping file');
139
- return null;
140
- }
141
- }
142
- console.warn('Unknown file type', path);
143
- console.warn('Skipping file');
144
- return null;
145
- }
146
- /**
147
- * Loads the files for the given translations.
148
- * @param dir The directory that the translations exist in.
149
- */
150
- async function loadTranslationsFiles(dirs) {
151
- const promises = [];
152
- for (let dir of dirs) {
153
- const fullPath = path.resolve(dir);
154
- promises.push(loadTranslationFiles(fullPath));
155
- }
156
- const allFiles = await Promise.all(promises);
157
- const files = allFiles.flat();
158
- return files;
159
- }
160
- /**
161
- * Loads the files for the given translation.
162
- * @param translation The directory that the translation exists in.
163
- * @returns
164
- */
165
- async function loadTranslationFiles(translation) {
166
- const metadata = await loadTranslationMetadata(translation);
167
- if (!metadata) {
168
- console.error('Could not load metadata for translation!', translation);
169
- return [];
170
- }
171
- let files = await (0, promises_1.readdir)(translation);
172
- let usfmFiles = files.filter(f => (0, path_1.extname)(f) === '.usfm' || (0, path_1.extname)(f) === '.usx' || (0, path_1.extname)(f) === '.json');
173
- if (usfmFiles.length <= 0) {
174
- translation = path.resolve(translation, 'usfm');
175
- if ((0, fs_extra_1.existsSync)(translation)) {
176
- files = await (0, promises_1.readdir)(translation);
177
- usfmFiles = files.filter(f => (0, path_1.extname)(f) === '.usfm');
178
- }
179
- }
180
- if (usfmFiles.length <= 0) {
181
- console.error('Could not find USFM files for translation!', translation);
182
- return [];
183
- }
184
- let promises = [];
185
- for (let file of usfmFiles) {
186
- if (path.parse(file).name === 'metadata') {
187
- continue;
188
- }
189
- const filePath = path.resolve(translation, file);
190
- promises.push(loadFile(filePath, {
191
- translation: metadata
192
- }));
193
- }
194
- return await Promise.all(promises);
195
- }
196
- /**
197
- * Loads the metadata for the given translation.
198
- * @param translation The translation that the metadata should be loaded for.
199
- * @returns
200
- */
201
- async function loadTranslationMetadata(translation) {
202
- const metadataTs = path.resolve(translation, 'metadata.ts');
203
- if ((0, fs_extra_1.existsSync)(metadataTs)) {
204
- return (await Promise.resolve(`${metadataTs}`).then(s => __importStar(require(s)))).default;
205
- }
206
- else {
207
- const metadataJson = path.resolve(translation, 'meta.json');
208
- if ((0, fs_extra_1.existsSync)(metadataJson)) {
209
- const data = await (0, promises_1.readFile)(metadataJson, { encoding: 'utf-8' });
210
- const metadata = JSON.parse(data);
211
- return {
212
- id: metadata.id ?? metadata.source.id,
213
- language: metadata.language,
214
- name: metadata.name.local,
215
- englishName: metadata.name.english,
216
- licenseUrl: metadata.copyright.attribution_url,
217
- website: metadata.copyright.attribution_url,
218
- shortName: metadata.name.abbrev,
219
- direction: metadata.direction
220
- };
221
- }
222
- else {
223
- const metadataJson = path.resolve(translation, 'metadata.json');
224
- if ((0, fs_extra_1.existsSync)(metadataJson)) {
225
- const data = await (0, promises_1.readFile)(metadataJson, { encoding: 'utf-8' });
226
- return JSON.parse(data);
227
- }
228
- }
229
- }
230
- console.error('Could not find metadata for translation!', translation);
231
- return null;
232
- }
233
- /**
234
- * Loads the file from the given path using the given metadata.
235
- * @param file The file that should be loaded.
236
- * @param metadata The metadata.
237
- */
238
- async function loadFile(file, metadata) {
239
- const extension = path.extname(file);
240
- const content = await (0, promises_1.readFile)(file, {
241
- encoding: 'utf-8'
242
- });
243
- const hash = (0, hash_js_1.sha256)()
244
- .update(content)
245
- // Hack to ensure that file hashes are different for different versions of the parser.
246
- .update(usx_parser_1.PARSER_VERSION)
247
- .digest('hex');
248
- return {
249
- content,
250
- metadata: metadata,
251
- name: file,
252
- sha256: hash,
253
- fileType: extension.slice(1),
254
- };
255
- }
256
- /**
257
- * Defines an uploader that is able to upload files to a directory.
258
- */
259
- class FilesUploader {
260
- _dir;
261
- constructor(dir) {
262
- this._dir = dir;
263
- }
264
- get idealBatchSize() {
265
- return null;
266
- }
267
- async upload(file, overwrite) {
268
- const filePath = path.resolve(this._dir, makeRelativePath(file.path));
269
- await (0, promises_1.mkdir)(path.dirname(filePath), { recursive: true });
270
- if (overwrite || !(0, fs_extra_1.existsSync)(filePath)) {
271
- await (0, promises_1.writeFile)(filePath, file.content, 'utf-8');
272
- return true;
273
- }
274
- return false;
275
- }
276
- }
277
- exports.FilesUploader = FilesUploader;
278
- /**
279
- * Defines an uploader that is able to upload files into a zip file.
280
- */
281
- class ZipUploader {
282
- _path;
283
- _initPromise;
284
- _fileHandle = null;
285
- _zip = null;
286
- constructor(filePath) {
287
- this._path = filePath;
288
- this._initPromise = this._init();
289
- }
290
- async _init() {
291
- this._fileHandle = await (0, promises_1.open)(path.resolve(this._path), 'w');
292
- const writableStream = this._fileHandle.createWriteStream();
293
- this._zip = new zip_js_1.ZipWriter(stream_1.Writable.toWeb(writableStream));
294
- return this._zip;
295
- }
296
- get idealBatchSize() {
297
- return 50;
298
- }
299
- async upload(file, _overwrite) {
300
- const zip = await this._initPromise;
301
- let reader;
302
- if (file.content instanceof stream_1.Readable) {
303
- reader = stream_1.Readable.toWeb(file.content);
304
- }
305
- else if (typeof file.content === 'string') {
306
- reader = new zip_js_1.TextReader(file.content);
307
- }
308
- else {
309
- throw new Error('Unknown file content type');
310
- }
311
- await zip.add(trimRelativePath(file.path), reader);
312
- return true;
313
- }
314
- async dispose() {
315
- if (this._zip) {
316
- await this._zip.close();
317
- }
318
- if (this._fileHandle) {
319
- await this._fileHandle.close();
320
- }
321
- }
322
- }
323
- exports.ZipUploader = ZipUploader;
324
- function trimRelativePath(path) {
325
- if (path.startsWith('./')) {
326
- return path.substring(2);
327
- }
328
- else if (path.startsWith('../')) {
329
- return path.substring(3);
330
- }
331
- else if (path.startsWith('/')) {
332
- return path.substring(1);
333
- }
334
- return path;
335
- }
336
- function makeRelativePath(path) {
337
- if (path.startsWith('/')) {
338
- return '.' + path;
339
- }
340
- return path;
341
- }
package/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import * as db from './db';
2
- import * as downloads from './downloads';
3
- import * as uploads from './uploads';
4
- import * as actions from './actions';
5
- import * as files from './files';
6
- import * as s3 from './s3';
7
- export { db, downloads, uploads, actions, files, s3, };
8
- //# sourceMappingURL=index.d.ts.map
package/index.js DELETED
@@ -1,38 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.s3 = exports.files = exports.actions = exports.uploads = exports.downloads = exports.db = void 0;
27
- const db = __importStar(require("./db"));
28
- exports.db = db;
29
- const downloads = __importStar(require("./downloads"));
30
- exports.downloads = downloads;
31
- const uploads = __importStar(require("./uploads"));
32
- exports.uploads = uploads;
33
- const actions = __importStar(require("./actions"));
34
- exports.actions = actions;
35
- const files = __importStar(require("./files"));
36
- exports.files = files;
37
- const s3 = __importStar(require("./s3"));
38
- exports.s3 = s3;
package/s3.d.ts DELETED
@@ -1,14 +0,0 @@
1
- import { SerializedFile, Uploader } from "./files";
2
- export declare class S3Uploader implements Uploader {
3
- private _client;
4
- private _bucketName;
5
- private _keyPrefix;
6
- get idealBatchSize(): number;
7
- constructor(bucketName: string, keyPrefix: string, profile: string | null);
8
- upload(file: SerializedFile, overwrite: boolean): Promise<boolean>;
9
- }
10
- export declare function parseS3Url(url: string): {
11
- bucketName: string;
12
- objectKey: string;
13
- } | undefined;
14
- //# sourceMappingURL=s3.d.ts.map
package/s3.js DELETED
@@ -1,76 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.S3Uploader = void 0;
4
- exports.parseS3Url = parseS3Url;
5
- const client_s3_1 = require("@aws-sdk/client-s3");
6
- const credential_providers_1 = require("@aws-sdk/credential-providers"); // ES6 import
7
- class S3Uploader {
8
- _client;
9
- _bucketName;
10
- _keyPrefix;
11
- get idealBatchSize() {
12
- return 50;
13
- }
14
- constructor(bucketName, keyPrefix, profile) {
15
- this._bucketName = bucketName;
16
- this._keyPrefix = keyPrefix;
17
- this._client = new client_s3_1.S3Client({
18
- credentials: (0, credential_providers_1.fromNodeProviderChain)({
19
- profile: profile ?? undefined,
20
- })
21
- });
22
- }
23
- async upload(file, overwrite) {
24
- const path = file.path.startsWith('/') ? file.path.substring(1) : file.path;
25
- const key = this._keyPrefix ? `${this._keyPrefix}/${path}` : path;
26
- const hash = file.sha256?.();
27
- const head = new client_s3_1.HeadObjectCommand({
28
- Bucket: this._bucketName,
29
- Key: key,
30
- });
31
- if (hash || !overwrite) {
32
- try {
33
- const existingFile = await this._client.send(head);
34
- if (hash && hash.localeCompare(existingFile?.ChecksumSHA256 ?? "", undefined, { sensitivity: 'base' }) === 0) {
35
- // File is already uploaded and matches the checksum.
36
- console.log(`[s3] Matches checksum: ${key}`);
37
- return false;
38
- }
39
- if (!overwrite) {
40
- return false;
41
- }
42
- }
43
- catch (err) {
44
- if (err instanceof client_s3_1.NotFound) {
45
- // not found, so we can try to write the file.
46
- }
47
- else {
48
- throw err;
49
- }
50
- }
51
- }
52
- const command = new client_s3_1.PutObjectCommand({
53
- Bucket: this._bucketName,
54
- Key: key,
55
- Body: file.content,
56
- ContentType: 'application/json',
57
- ChecksumSHA256: hash,
58
- });
59
- await this._client.send(command);
60
- return true;
61
- }
62
- }
63
- exports.S3Uploader = S3Uploader;
64
- function parseS3Url(url) {
65
- const regex = /^s3:\/\/([a-z0-9.\-]+)(\/[^${}]*)?$/;
66
- const matched = url.match(regex);
67
- if (matched) {
68
- const arr = [...matched];
69
- return {
70
- bucketName: arr[1],
71
- objectKey: arr[2] ?? "",
72
- };
73
- }
74
- return undefined;
75
- }
76
- ;
package/uploads.d.ts DELETED
@@ -1,73 +0,0 @@
1
- import { SerializedFile, Uploader } from "./files";
2
- import { DatasetOutput } from "@helloao/tools/generation/dataset";
3
- import { PrismaClient } from "@prisma/client";
4
- export interface UploadApiFromDatabaseOptions extends UploadApiOptions {
5
- /**
6
- * The number of files to upload in each batch.
7
- */
8
- batchSize: string | number;
9
- }
10
- export interface UploadApiOptions {
11
- /**
12
- * Whether to overwrite existing files.
13
- */
14
- overwrite?: boolean;
15
- /**
16
- * Whether to only overwrite common files.
17
- * "Common files" are files that are similar between translations, like the books.json endpoint, or individual chapter endpoints.
18
- */
19
- overwriteCommonFiles?: boolean;
20
- /**
21
- * The file pattern regex that should be used to filter the files that are uploaded.
22
- */
23
- filePattern?: string;
24
- /**
25
- * The translations to generate API files for.
26
- */
27
- translations?: string[];
28
- /**
29
- * The AWS profile to use for uploading to S3.
30
- */
31
- profile?: string;
32
- /**
33
- * Whether to generate API files that use the common name instead of book IDs.
34
- */
35
- useCommonName?: boolean;
36
- /**
37
- * Whether to generate audio files for the API.
38
- */
39
- generateAudioFiles?: boolean;
40
- /**
41
- * Whether to generate pretty-printed JSON files.
42
- */
43
- pretty?: boolean;
44
- }
45
- /**
46
- * Loads and generates the API files from the database and uploads them to the specified destination.
47
- * @param db The database that the datasets should be loaded from.
48
- * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.
49
- * @param options The options to use for the upload.
50
- */
51
- export declare function uploadApiFilesFromDatabase(db: PrismaClient, dest: string, options: UploadApiFromDatabaseOptions): Promise<void>;
52
- /**
53
- * Generates the API files from the given datasets and uploads them to the specified destination.
54
- * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.
55
- * @param options The options to use for the upload.
56
- * @param datasets The datasets to generate the API files from.
57
- */
58
- export declare function serializeAndUploadDatasets(dest: string, datasets: AsyncIterable<DatasetOutput>, options?: UploadApiOptions): Promise<void>;
59
- /**
60
- * Uploads the given serialized files to the specified destination.
61
- * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.
62
- * @param options The options to use for the upload.
63
- * @param datasets The datasets to generate the API files from.
64
- */
65
- export declare function uploadFiles(dest: string, options: UploadApiOptions, serializedFiles: AsyncIterable<SerializedFile[]>): Promise<void>;
66
- /**
67
- * Uploads the given serialized files using the given uploader.
68
- * @param uploader The uploader to use.
69
- * @param options The options to use for the upload.
70
- * @param datasets The datasets to generate the API files from.
71
- */
72
- export declare function uploadFilesUsingUploader(uploader: Uploader, options: UploadApiOptions, serializedFiles: AsyncIterable<SerializedFile[]>): Promise<void>;
73
- //# sourceMappingURL=uploads.d.ts.map