@magda/connector-sdk 1.1.0-arm64.0 → 1.1.0-rc.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.
@@ -0,0 +1,1091 @@
1
+ /// <reference types="node" />
2
+ import http = require('http');
3
+ import { default as URI_2 } from 'urijs';
4
+
5
+ export declare interface AspectBuilder {
6
+ aspectDefinition: AspectDefinition;
7
+ builderFunctionString: string;
8
+ setupFunctionString?: string;
9
+ }
10
+
11
+ declare class AspectCreationFailure {
12
+ readonly id: string;
13
+ readonly error: Error;
14
+ constructor(id: string, error: Error);
15
+ }
16
+
17
+ /**
18
+ * A type of aspect in the registry, unique for a tenant.
19
+ */
20
+ export declare class AspectDefinition {
21
+ /**
22
+ * The identifier for the aspect type.
23
+ */
24
+ 'id': string;
25
+ /**
26
+ * The name of the aspect.
27
+ */
28
+ 'name': string;
29
+ /**
30
+ * The JSON Schema of this aspect.
31
+ */
32
+ 'jsonSchema': any;
33
+ }
34
+
35
+ declare class AspectDefinitionsApi {
36
+ protected basePath: string;
37
+ protected defaultHeaders: any;
38
+ protected _useQuerystring: boolean;
39
+ protected authentications: any;
40
+ constructor(basePath?: string);
41
+ set useQuerystring(value: boolean);
42
+ setApiKey(key: AspectDefinitionsApiApiKeys, value: string): void;
43
+ /**
44
+ * Create a new aspect
45
+ *
46
+ * @param xMagdaTenantId 0
47
+ * @param aspect The definition of the new aspect.
48
+ * @param xMagdaSession Magda internal session id
49
+ */
50
+ create(xMagdaTenantId: number, aspect: AspectDefinition, xMagdaSession: string): Promise<{
51
+ response: http.IncomingMessage;
52
+ body: AspectDefinition;
53
+ }>;
54
+ /**
55
+ * Get a list of all aspects
56
+ *
57
+ * @param xMagdaTenantId 0
58
+ */
59
+ getAll(xMagdaTenantId: number): Promise<{
60
+ response: http.IncomingMessage;
61
+ body: Array<AspectDefinition>;
62
+ }>;
63
+ /**
64
+ * Get an aspect by ID
65
+ *
66
+ * @param xMagdaTenantId 0
67
+ * @param id ID of the aspect to be fetched.
68
+ */
69
+ getById(xMagdaTenantId: number, id: string): Promise<{
70
+ response: http.IncomingMessage;
71
+ body: AspectDefinition;
72
+ }>;
73
+ /**
74
+ * Modify an aspect by applying a JSON Patch
75
+ * The patch should follow IETF RFC 6902 (https://tools.ietf.org/html/rfc6902).
76
+ * @param xMagdaTenantId 0
77
+ * @param id ID of the aspect to be saved.
78
+ * @param aspectPatch The RFC 6902 patch to apply to the aspect.
79
+ * @param xMagdaSession Magda internal session id
80
+ */
81
+ patchById(xMagdaTenantId: number, id: string, aspectPatch: Array<Operation>, xMagdaSession: string): Promise<{
82
+ response: http.IncomingMessage;
83
+ body: AspectDefinition;
84
+ }>;
85
+ /**
86
+ * Modify an aspect by ID
87
+ * Modifies the aspect with a given ID. If an aspect with the ID does not yet exist, it is created.
88
+ * @param xMagdaTenantId 0
89
+ * @param id ID of the aspect to be saved.
90
+ * @param aspect The aspect to save.
91
+ * @param xMagdaSession Magda internal session id
92
+ */
93
+ putById(xMagdaTenantId: number, id: string, aspect: AspectDefinition, xMagdaSession: string): Promise<{
94
+ response: http.IncomingMessage;
95
+ body: AspectDefinition;
96
+ }>;
97
+ }
98
+
99
+ declare enum AspectDefinitionsApiApiKeys {
100
+ }
101
+
102
+ declare class AsyncPage<T> {
103
+ readonly requestNextPage: CreateAsyncPage<T>;
104
+ readonly data: T;
105
+ readonly hasData: boolean;
106
+ static create<T>(next: (data: T) => Promise<T>): AsyncPage<T>;
107
+ static single<T>(value: T): AsyncPage<T>;
108
+ static singlePromise<T>(valuePromise: Promise<T>): AsyncPage<T>;
109
+ static none<T>(): AsyncPage<T>;
110
+ constructor(data: T, hasData: boolean, requestNextPage: CreateAsyncPage<T>);
111
+ map<TResult>(selector: (data: T) => TResult): AsyncPage<TResult>;
112
+ forEach(callback: (data: T) => void): Promise<void>;
113
+ take(n: number): AsyncPage<T>;
114
+ }
115
+
116
+ export declare class AuthorizedRegistryClient extends RegistryClient {
117
+ protected jwt: string;
118
+ constructor(options: AuthorizedRegistryOptions);
119
+ putAspectDefinition(aspectDefinition: AspectDefinition, tenantId?: number): Promise<AspectDefinition | Error>;
120
+ postHook(hook: WebHook): Promise<WebHook | Error>;
121
+ putHook(hook: WebHook): Promise<WebHook | Error>;
122
+ getHook(hookId: string): Promise<Maybe<WebHook> | Error>;
123
+ getHooks(): Promise<WebHook[] | Error>;
124
+ resumeHook(webhookId: string, succeeded?: boolean, lastEventIdReceived?: string, active?: boolean): Promise<WebHookAcknowledgementResponse | Error>;
125
+ putRecord(record: Record_2, tenantId?: number): Promise<Record_2 | Error>;
126
+ putRecordAspect(recordId: string, aspectId: string, aspect: any, tenantId?: number): Promise<Record_2 | Error>;
127
+ patchRecordAspect(recordId: string, aspectId: string, aspectPatch: Operation[], tenantId?: number): Promise<Record_2 | Error>;
128
+ deleteBySource(sourceTagToPreserve: string, sourceId: string, tenantId?: number): Promise<MultipleDeleteResult | "Processing" | Error>;
129
+ getRecordHistory(id: string, pageToken?: string, start?: number, limit?: number): Promise<EventsPage | Error>;
130
+ }
131
+
132
+ declare interface AuthorizedRegistryJwtOptions extends RegistryOptions {
133
+ jwt: string;
134
+ userId?: never;
135
+ jwtSecret?: never;
136
+ }
137
+
138
+ export declare type AuthorizedRegistryOptions = AuthorizedRegistryUserIdAndJwtSecretOptions | AuthorizedRegistryJwtOptions;
139
+
140
+ declare interface AuthorizedRegistryUserIdAndJwtSecretOptions extends RegistryOptions {
141
+ userId: string;
142
+ jwtSecret: string;
143
+ jwt?: never;
144
+ }
145
+
146
+ export declare abstract class BuilderFunctionParameters {
147
+ /**
148
+ * The result of invoking the {@link AspectBuilder#setupFunctionString}, or undefined if there is no
149
+ * {@link AspectBuilder#setupFunctionString} defined for this builder.
150
+ *
151
+ * @type {*}
152
+ * @memberOf BuilderFunctionParameters
153
+ */
154
+ setup: any;
155
+ /**
156
+ * The transformer that is building aspects.
157
+ *
158
+ * @type {JsonTransformer}
159
+ * @memberof BuilderFunctionParameters
160
+ */
161
+ transformer: JsonTransformer;
162
+ /**
163
+ * Reports a non-fatal problem creating an aspect.
164
+ *
165
+ * @type {ReportProblem}
166
+ * @memberOf BuilderFunctionParameters
167
+ */
168
+ reportProblem: ReportProblem;
169
+ /**
170
+ * Provides access to utility libraries that may be helpful in building aspects.
171
+ *
172
+ * @type {BuilderFunctionLibraries}
173
+ * @memberOf BuilderFunctionParameters
174
+ */
175
+ libraries: object;
176
+ [propName: string]: any;
177
+ }
178
+
179
+ export declare interface BuilderSetupFunctionParameters {
180
+ /**
181
+ * The transformer that is building aspects.
182
+ *
183
+ * @type {JsonTransformer}
184
+ * @memberof BuilderFunctionParameters
185
+ */
186
+ transformer: JsonTransformer;
187
+ /**
188
+ * Provides access to utility libraries that may be helpful in setting up the builder.
189
+ *
190
+ * @type {BuilderFunctionLibraries}
191
+ * @memberOf BuilderFunctionParameters
192
+ */
193
+ libraries: object;
194
+ }
195
+
196
+ export declare function buildersToCompiledAspects(builders: AspectBuilder[], setupParameters: BuilderSetupFunctionParameters, buildParameters: BuilderFunctionParameters): CompiledAspects;
197
+
198
+ export declare function cleanOrgTitle(title: string): string;
199
+
200
+ declare interface CompiledAspect {
201
+ id: string;
202
+ builderFunction: Function;
203
+ setupResult: any;
204
+ }
205
+
206
+ export declare interface CompiledAspects {
207
+ parameterNames: string[];
208
+ parameters: BuilderFunctionParameters;
209
+ aspects: CompiledAspect[];
210
+ }
211
+
212
+ export declare class ConnectionResult {
213
+ aspectDefinitionsConnected: number;
214
+ organizationsConnected: number;
215
+ datasetsConnected: number;
216
+ distributionsConnected: number;
217
+ recordsTrimmed: number;
218
+ trimStillProcessing: boolean;
219
+ aspectDefinitionFailures: AspectCreationFailure[];
220
+ organizationFailures: RecordCreationFailure[];
221
+ datasetFailures: RecordCreationFailure[];
222
+ distributionFailures: RecordCreationFailure[];
223
+ summarize(): string;
224
+ static combine(...results: ConnectionResult[]): ConnectionResult;
225
+ }
226
+
227
+ export declare class ConnectorRecordId {
228
+ readonly id: string;
229
+ readonly type: RecordType;
230
+ readonly sourceId: string;
231
+ constructor(id: string, type: RecordType, sourceId: string);
232
+ toString(): string;
233
+ private get typeId();
234
+ }
235
+
236
+ export declare interface ConnectorSource {
237
+ /**
238
+ * The ID of the source. This is used to prefix IDs of datasets, distributions, and organizations
239
+ * found in this source.
240
+ */
241
+ readonly id: string;
242
+ /**
243
+ * The user-friendly name of the source.
244
+ */
245
+ readonly name: string;
246
+ /**
247
+ * This field is not compulsory and JsonConnector will try to locate its value from commandline parameters
248
+ * before use ConnectorSource.extras as backup --- more for test cases
249
+ */
250
+ readonly extras?: JsonConnectorConfigExtraMetaData;
251
+ /**
252
+ * This field is not compulsory and JsonConnector will try to locate its value from commandline parameters
253
+ * before use ConnectorSource.presetRecordAspects as backup --- more for test cases
254
+ */
255
+ readonly presetRecordAspects?: JsonConnectorConfigPresetAspect[];
256
+ /**
257
+ * Get all of the datasets as pages of objects.
258
+ *
259
+ * @returns {AsyncPage<any[]>} A page of datasets.
260
+ */
261
+ getJsonDatasets(): AsyncPage<any[]>;
262
+ /**
263
+ * Get a particular dataset given its ID.
264
+ *
265
+ * @param {string} id The ID of the dataset.
266
+ * @returns {Promise<any>} The dataset object with the given ID.
267
+ */
268
+ getJsonDataset(id: string): Promise<any>;
269
+ /**
270
+ * Search datasets for those that have a particular case-insensitive string
271
+ * in their title.
272
+ *
273
+ * @param {string} title The string to search for the in the title.
274
+ * @param {number} maxResults The maximum number of results to return.
275
+ * @returns {AsyncPage<any[]>} A page of matching datasets.
276
+ */
277
+ searchDatasetsByTitle(title: string, maxResults: number): AsyncPage<any[]>;
278
+ /**
279
+ * Gets the distributions of a given dataset.
280
+ *
281
+ * @param {object} dataset The dataset.
282
+ * @returns {AsyncPage<any[]>} A page of distributions of the dataset.
283
+ */
284
+ getJsonDistributions(dataset: any): AsyncPage<any[]>;
285
+ /**
286
+ * True if the source provides organizations as first-class objects that can be enumerated and retrieved
287
+ * by ID. False if organizations are just fields on datasets or distributions, or if they're not
288
+ * available at all.
289
+ */
290
+ readonly hasFirstClassOrganizations: boolean;
291
+ /**
292
+ * Enumerates first-class organizations. If {@link hasFirstClassOrganizations} is false, this
293
+ * method returns undefined.
294
+ *
295
+ * @returns {AsyncPage<any[]>} A page of organizations, or undefined if first-class organizations are not available.
296
+ */
297
+ getJsonFirstClassOrganizations(): AsyncPage<any[]>;
298
+ /**
299
+ * Gets a first-class organization by ID. If {@link hasFirstClassOrganizations} is false, this
300
+ * method returns undefined.
301
+ *
302
+ * @param {string} id The ID of the organization to retrieve.
303
+ * @returns {Promise<any>} A promise for the organization, or undefined if first-class organizations are not available.
304
+ */
305
+ getJsonFirstClassOrganization(id: string): Promise<any>;
306
+ /**
307
+ * Search first-class organizations for those that have a particular case-insensitive string
308
+ * in their title.
309
+ *
310
+ * @param {string} title The string to search for the in the title.
311
+ * @param {number} maxResults The maximum number of results to return.
312
+ * @returns {AsyncPage<any[]>} A page of matching organizations, or undefined if first-class organizations are not available.
313
+ */
314
+ searchFirstClassOrganizationsByTitle(title: string, maxResults: number): AsyncPage<any[]>;
315
+ /**
316
+ * Gets the ID of the publisher of this dataset. This method will return undefined if {@link hasFirstClassOrganizations}
317
+ * is false because non-first-class organizations do not have IDs.
318
+ *
319
+ * @param {any} dataset The dataset from which to get the publisher ID.
320
+ * @returns {string} The ID of the dataset's publisher.
321
+ */
322
+ getJsonDatasetPublisherId(dataset: any): string;
323
+ /**
324
+ * Gets the publisher organization of this dataset.
325
+ *
326
+ * @param {any} dataset The dataset from which to get the publisher.
327
+ * @returns {Promise<object>} A promise for the organization that published this dataset.
328
+ */
329
+ getJsonDatasetPublisher(dataset: any): Promise<any>;
330
+ }
331
+
332
+ declare class CountResponse {
333
+ 'count': number;
334
+ }
335
+
336
+ declare interface CreateAsyncPage<T> {
337
+ (): Promise<AsyncPage<T>>;
338
+ }
339
+
340
+ declare class DeleteResult {
341
+ 'deleted': boolean;
342
+ }
343
+
344
+ declare interface Eq<T> {
345
+ equals(t: T): boolean;
346
+ }
347
+
348
+ /**
349
+ * A page of events.
350
+ */
351
+ declare class EventsPage {
352
+ /**
353
+ * Whether there are more events available.
354
+ */
355
+ 'hasMore': boolean;
356
+ /**
357
+ * A token to be used to get the next page of events.
358
+ */
359
+ 'nextPageToken': string;
360
+ /**
361
+ * The events in this page.
362
+ */
363
+ 'events': Array<RegistryEvent>;
364
+ }
365
+
366
+ /**
367
+ * The type of a registry modification event.
368
+ */
369
+ declare type EventType = 'CreateRecord' | 'CreateAspectDefinition' | 'CreateRecordAspect' | 'PatchRecord' | 'PatchAspectDefinition' | 'PatchRecordAspect' | 'DeleteRecord' | 'DeleteAspectDefinition' | 'DeleteRecordAspect';
370
+
371
+ declare interface Functor<T> {
372
+ fmap<U>(f: (t: T) => U): Functor<U>;
373
+ lift<U>(f: (t: T) => U): Functor<U>;
374
+ map<U>(f: (t: T) => U): Functor<U>;
375
+ }
376
+
377
+ declare class JsObject {
378
+ 'fields': {
379
+ [key: string]: JsValue;
380
+ };
381
+ }
382
+
383
+ /**
384
+ * A base class for connectors for most any JSON-based catalog source.
385
+ */
386
+ export declare class JsonConnector {
387
+ readonly source: ConnectorSource;
388
+ readonly transformer: JsonTransformer;
389
+ readonly registry: AuthorizedRegistryClient;
390
+ readonly maxConcurrency: number;
391
+ readonly sourceTag?: string;
392
+ readonly configData?: JsonConnectorConfig;
393
+ constructor({ source, transformer, registry, maxConcurrency, sourceTag }: JsonConnectorOptions);
394
+ readConfigData(): JsonConnectorConfig;
395
+ createAspectDefinitions(): Promise<ConnectionResult>;
396
+ createOrganization(organizationJson: object): Promise<Record_2 | Error>;
397
+ createDataset(datasetJson: object): Promise<Record_2 | Error>;
398
+ createDistribution(distributionJson: object, datasetJson: object): Promise<Record_2 | Error>;
399
+ createOrganizations(): Promise<ConnectionResult>;
400
+ createDatasetsAndDistributions(): Promise<ConnectionResult>;
401
+ trimRecords(): Promise<ConnectionResult>;
402
+ /**
403
+ * Runs the connector, creating aspect definitions, organizations, datasets, and distributions in the
404
+ * registry as necessary.
405
+ *
406
+ * @returns {Promise<ConnectionResult>}
407
+ * @memberof JsonConnector
408
+ */
409
+ run(): Promise<ConnectionResult>;
410
+ runInteractive(options: JsonConnectorRunInteractiveOptions): void;
411
+ private shutdownOnIdle;
412
+ putRecord(record: Record_2, recordType: RecordType): Promise<Record_2 | Error>;
413
+ /**
414
+ * Copy `extras` from connector config data to
415
+ * records `source` aspect
416
+ */
417
+ private attachConnectorDataToSource;
418
+ private attachConnectorPresetAspects;
419
+ }
420
+
421
+ export declare interface JsonConnectorConfig {
422
+ id: string;
423
+ name: string;
424
+ sourceUrl?: string;
425
+ pageSize?: number;
426
+ schedule?: string;
427
+ ignoreHarvestSources?: string[];
428
+ allowedOrganisationNames?: string[];
429
+ ignoreOrganisationNames?: string[];
430
+ extras?: JsonConnectorConfigExtraMetaData;
431
+ presetRecordAspects?: JsonConnectorConfigPresetAspect[];
432
+ }
433
+
434
+ /**
435
+ * Connector extra metadata
436
+ * Will be copied to records' source aspect automatically
437
+ */
438
+ declare type JsonConnectorConfigExtraMetaData = {
439
+ [k: string]: any;
440
+ };
441
+
442
+ /**
443
+ * Any aspects that will be `preset` on any records created by the connector
444
+ *
445
+ * opType: operation type; Describe how to add the aspect to the record
446
+ * - MERGE_LEFT: merge `presetAspect` with records aspects.
447
+ * i.e. `presetAspect` will be overwritten by records aspects data if any
448
+ * - MEREG_RIGHT: merge records aspects with `presetAspect`.
449
+ * i.e. records aspects data (if any) will be overwritten by `presetAspect`
450
+ * - REPLACE: `presetAspect` will replace any existing records aspect
451
+ * - FILL: `presetAspect` will be added if no existing aspect
452
+ * Default value (If not specified) will be `MERGE_LEFT`
453
+ *
454
+ * recordType:
455
+ * Describes which type of records this aspect will be added to;
456
+ * If this field is omitted, the aspect will be added to every records.
457
+ *
458
+ * data: Object; aspect data
459
+ */
460
+ declare type JsonConnectorConfigPresetAspect = {
461
+ id: string;
462
+ recordType?: RecordType;
463
+ opType?: "MERGE_LEFT" | "REPLACE" | "FILL" | "MERGE_RIGHT";
464
+ data: {
465
+ [k: string]: any;
466
+ };
467
+ };
468
+
469
+ export declare interface JsonConnectorOptions {
470
+ source: ConnectorSource;
471
+ transformer: JsonTransformer;
472
+ registry: AuthorizedRegistryClient;
473
+ maxConcurrency?: number;
474
+ sourceTag?: string;
475
+ }
476
+
477
+ export declare interface JsonConnectorRunInteractiveOptions {
478
+ timeoutSeconds: number;
479
+ listenPort: number;
480
+ transformerOptions: any;
481
+ }
482
+
483
+ /**
484
+ * A base class for transformers for most any JSON-based catalog source.
485
+ * A transformer takes source data and transforms it to registry records and aspects.
486
+ */
487
+ export declare abstract class JsonTransformer {
488
+ readonly sourceId: string;
489
+ private datasetAspectBuilders;
490
+ private distributionAspectBuilders;
491
+ private organizationAspectBuilders;
492
+ private organizationAspects;
493
+ private datasetAspects;
494
+ private distributionAspects;
495
+ private tenantId;
496
+ constructor({ sourceId, libraries, datasetAspectBuilders, distributionAspectBuilders, organizationAspectBuilders }: JsonTransformerOptions);
497
+ /**
498
+ * Create a {@link Record} from JSON data representing an organization.
499
+ *
500
+ * @param {string} id The ID of the record.
501
+ * @param {string} name The name of the record.
502
+ * @param {object} jsonOrganization The JSON data representing the organization.
503
+ * @returns {Record} The record.
504
+ *
505
+ * @memberof JsonConnector
506
+ */
507
+ organizationJsonToRecord(jsonOrganization: object): Record_2;
508
+ datasetJsonToRecord(jsonDataset: object): Record_2;
509
+ distributionJsonToRecord(jsonDistribution: object, jsonDataset: object): Record_2;
510
+ getRequiredAspectDefinitions(): AspectDefinition[];
511
+ abstract getIdFromJsonOrganization(jsonOrganization: any, sourceId: string): ConnectorRecordId;
512
+ abstract getIdFromJsonDataset(jsonDataset: any, sourceId: string): ConnectorRecordId;
513
+ abstract getIdFromJsonDistribution(jsonDistribution: any, jsonDataset: any, sourceId: string): ConnectorRecordId;
514
+ abstract getNameFromJsonOrganization(jsonOrganization: any): string;
515
+ abstract getNameFromJsonDataset(jsonDataset: any): string;
516
+ abstract getNameFromJsonDistribution(jsonDistribution: any, jsonDataset: any): string;
517
+ reviseOrganizationRecord(record: Record_2): Record_2;
518
+ jsonToRecord(id: ConnectorRecordId, name: string, json: any, aspects: CompiledAspects): Record_2;
519
+ }
520
+
521
+ export declare interface JsonTransformerOptions {
522
+ sourceId: string;
523
+ libraries?: object;
524
+ datasetAspectBuilders?: AspectBuilder[];
525
+ distributionAspectBuilders?: AspectBuilder[];
526
+ organizationAspectBuilders?: AspectBuilder[];
527
+ maxConcurrency?: number;
528
+ tenantId: number;
529
+ }
530
+
531
+ declare class JsValue {
532
+ }
533
+
534
+ declare class Maybe<T> implements Monad<T>, Functor<T>, Eq<Maybe<T>> {
535
+ private type;
536
+ private value;
537
+ constructor(type: MaybeType, value?: T);
538
+ static sequence<T>(t: {
539
+ [k: string]: Maybe<T>;
540
+ }): Maybe<{
541
+ [k: string]: T;
542
+ }>;
543
+ static all: (t: {
544
+ [k: string]: Maybe<any>;
545
+ }) => Maybe<{
546
+ [k: string]: any;
547
+ }>;
548
+ static maybe<T>(t: T): Maybe<T>;
549
+ static just<T>(t: T): Maybe<T>;
550
+ static nothing<T>(): Maybe<T>;
551
+ unit<U>(u: U): Maybe<U>;
552
+ bind<U>(f: (t: T) => Maybe<U>): Maybe<U>;
553
+ of: <U>(u: U) => Maybe<U>;
554
+ chain: <U>(f: (t: T) => Maybe<U>) => Maybe<U>;
555
+ fmap<U>(f: (t: T) => U): Maybe<U>;
556
+ lift: <U>(f: (t: T) => U) => Maybe<U>;
557
+ map: <U>(f: (t: T) => U) => Maybe<U>;
558
+ caseOf<U>(patterns: MaybePatterns<T, U>): U;
559
+ defaulting(defaultValue: T): Maybe<T>;
560
+ equals(other: Maybe<T>): any;
561
+ valueOr<U extends T>(defaultValue: U): T | U;
562
+ valueOrCompute<U extends T>(defaultValueFunction: () => U): T | U;
563
+ valueOrThrow(error?: Error): T;
564
+ do(patterns?: OptionalMaybePatterns<T, void>): Maybe<T>;
565
+ }
566
+
567
+ declare interface MaybePatterns<T, U> {
568
+ just: (t: T) => U;
569
+ nothing: () => U;
570
+ }
571
+
572
+ declare enum MaybeType {
573
+ Nothing = 0,
574
+ Just = 1,
575
+ }
576
+
577
+ declare interface Monad<T> {
578
+ unit<U>(t: U): Monad<U>;
579
+ bind<U>(f: (t: T) => Monad<U>): Monad<U>;
580
+ of<U>(t: U): Monad<U>;
581
+ chain<U>(f: (t: T) => Monad<U>): Monad<U>;
582
+ }
583
+
584
+ declare class MultipleDeleteResult {
585
+ 'count': number;
586
+ }
587
+
588
+ declare class Operation {
589
+ }
590
+
591
+ declare interface OptionalMaybePatterns<T, U> {
592
+ just?: (t: T) => U;
593
+ nothing?: () => U;
594
+ }
595
+
596
+ /**
597
+ * A record in the registry, usually including data for one or more aspects, unique for a tenant.
598
+ */
599
+ declare class Record_2 {
600
+ /**
601
+ * The identifier of the record
602
+ */
603
+ 'id': string;
604
+ /**
605
+ * The name of the record
606
+ */
607
+ 'name': string;
608
+ /**
609
+ * The aspects included in this record
610
+ */
611
+ 'aspects': any;
612
+ /**
613
+ * The read authorization policy id of a record
614
+ */
615
+ 'authnReadPolicyId': string;
616
+ /**
617
+ * A tag representing the action by the source of this record (e.g. an id for a individual crawl of a data portal).
618
+ */
619
+ 'sourceTag': string;
620
+ /**
621
+ * The identifier of a tenant
622
+ */
623
+ 'tenantId': number;
624
+ }
625
+ export { Record_2 as Record }
626
+
627
+ declare class RecordAspectsApi {
628
+ protected basePath: string;
629
+ protected defaultHeaders: any;
630
+ protected _useQuerystring: boolean;
631
+ protected authentications: any;
632
+ constructor(basePath?: string);
633
+ set useQuerystring(value: boolean);
634
+ setApiKey(key: RecordAspectsApiApiKeys, value: string): void;
635
+ /**
636
+ * Delete a record aspect by ID
637
+ * Deletes a record aspect.
638
+ * @param recordId ID of the record for which to delete an aspect.
639
+ * @param aspectId ID of the aspect to delete.
640
+ * @param xMagdaSession Magda internal session id
641
+ * @param xMagdaTenantId 0
642
+ */
643
+ deleteById(recordId: string, aspectId: string, xMagdaSession: string, xMagdaTenantId: number): Promise<{
644
+ response: http.IncomingMessage;
645
+ body: DeleteResult;
646
+ }>;
647
+ /**
648
+ * Get a record aspect by ID
649
+ *
650
+ * @param xMagdaTenantId 0
651
+ * @param recordId ID of the record for which to fetch an aspect.
652
+ * @param aspectId ID of the aspect to fetch.
653
+ * @param xMagdaSession Magda internal session id
654
+ */
655
+ getById(xMagdaTenantId: number, recordId: string, aspectId: string, xMagdaSession?: string): Promise<{
656
+ response: http.IncomingMessage;
657
+ body: any;
658
+ }>;
659
+ /**
660
+ * Modify a record aspect by applying a JSON Patch
661
+ * The patch should follow IETF RFC 6902 (https://tools.ietf.org/html/rfc6902).
662
+ * @param recordId ID of the record for which to fetch an aspect.
663
+ * @param aspectId ID of the aspect to fetch.
664
+ * @param aspectPatch The RFC 6902 patch to apply to the aspect.
665
+ * @param xMagdaSession Magda internal session id
666
+ * @param xMagdaTenantId 0
667
+ */
668
+ patchById(recordId: string, aspectId: string, aspectPatch: Array<Operation>, xMagdaSession: string, xMagdaTenantId: number): Promise<{
669
+ response: http.IncomingMessage;
670
+ body: any;
671
+ }>;
672
+ /**
673
+ * Modify a record aspect by ID
674
+ * Modifies a record aspect. If the aspect does not yet exist on this record, it is created.
675
+ * @param recordId ID of the record for which to update an aspect.
676
+ * @param aspectId ID of the aspect to update.
677
+ * @param aspect The record aspect to save.
678
+ * @param xMagdaSession Magda internal session id
679
+ * @param xMagdaTenantId 0
680
+ */
681
+ putById(recordId: string, aspectId: string, aspect: any, xMagdaSession: string, xMagdaTenantId: number): Promise<{
682
+ response: http.IncomingMessage;
683
+ body: any;
684
+ }>;
685
+ }
686
+
687
+ declare enum RecordAspectsApiApiKeys {
688
+ }
689
+
690
+ declare class RecordCreationFailure {
691
+ readonly id: ConnectorRecordId;
692
+ readonly parentId: ConnectorRecordId;
693
+ readonly error: Error;
694
+ constructor(id: ConnectorRecordId, parentId: ConnectorRecordId, error: Error);
695
+ }
696
+
697
+ declare class RecordHistoryApi {
698
+ protected basePath: string;
699
+ protected defaultHeaders: any;
700
+ protected _useQuerystring: boolean;
701
+ protected authentications: any;
702
+ constructor(basePath?: string);
703
+ set useQuerystring(value: boolean);
704
+ setApiKey(key: RecordHistoryApiApiKeys, value: string): void;
705
+ /**
706
+ * Get a list of all events affecting this record
707
+ *
708
+ * @param xMagdaTenantId 0
709
+ * @param recordId ID of the record for which to fetch history.
710
+ * @param xMagdaSession Magda internal session id
711
+ * @param pageToken A token that identifies the start of a page of events. This token should not be interpreted as having any meaning, but it can be obtained from a previous page of results.
712
+ * @param start The index of the first event to retrieve. When possible, specify pageToken instead as it will result in better performance. If this parameter and pageToken are both specified, this parameter is interpreted as the index after the pageToken of the first record to retrieve.
713
+ * @param limit The maximum number of events to receive. The response will include a token that can be passed as the pageToken parameter to a future request to continue receiving results where this query leaves off.
714
+ * @param aspect The aspects for which to included in event history, specified as multiple occurrences of this query parameter.
715
+ * @param dereference true to automatically dereference links to other records; false to leave them as links. Dereferencing a link means including the record itself where the link would be. Dereferencing only happens one level deep, regardless of the value of this parameter.
716
+ */
717
+ history(xMagdaTenantId: number, recordId: string, xMagdaSession: string, pageToken?: string, start?: number, limit?: number, aspect?: Array<string>, dereference?: boolean): Promise<{
718
+ response: http.IncomingMessage;
719
+ body: EventsPage;
720
+ }>;
721
+ /**
722
+ * Get the version of a record that existed after a given event was applied
723
+ *
724
+ * @param xMagdaTenantId 0
725
+ * @param recordId ID of the record to fetch.
726
+ * @param eventId The ID of the last event to be applied to the record. The event with this ID need not actually apply to the record, in which case that last event prior to this even that does apply will be used.
727
+ */
728
+ version(xMagdaTenantId: number, recordId: string, eventId: string): Promise<{
729
+ response: http.IncomingMessage;
730
+ body: Record_2;
731
+ }>;
732
+ }
733
+
734
+ declare enum RecordHistoryApiApiKeys {
735
+ }
736
+
737
+ declare class RecordsApi {
738
+ protected basePath: string;
739
+ protected defaultHeaders: any;
740
+ protected _useQuerystring: boolean;
741
+ protected authentications: any;
742
+ constructor(basePath?: string);
743
+ set useQuerystring(value: boolean);
744
+ setApiKey(key: RecordsApiApiKeys, value: string): void;
745
+ /**
746
+ * Create a new record
747
+ *
748
+ * @param xMagdaTenantId 0
749
+ * @param record The definition of the new record.
750
+ * @param xMagdaSession Magda internal session id
751
+ */
752
+ create(xMagdaTenantId: number, record: Record_2, xMagdaSession: string): Promise<{
753
+ response: http.IncomingMessage;
754
+ body: Record_2;
755
+ }>;
756
+ /**
757
+ * Delete a record
758
+ *
759
+ * @param xMagdaTenantId 0
760
+ * @param recordId ID of the record to delete.
761
+ * @param xMagdaSession Magda internal session id
762
+ */
763
+ deleteById(xMagdaTenantId: number, recordId: string, xMagdaSession: string): Promise<{
764
+ response: http.IncomingMessage;
765
+ body: DeleteResult;
766
+ }>;
767
+ /**
768
+ * Get a list of all records
769
+ *
770
+ * @param xMagdaTenantId 0
771
+ * @param aspect The aspects for which to retrieve data, specified as multiple occurrences of this query parameter. Only records that have all of these aspects will be included in the response.
772
+ * @param optionalAspect The optional aspects for which to retrieve data, specified as multiple occurrences of this query parameter. These aspects will be included in a record if available, but a record will be included even if it is missing these aspects.
773
+ * @param pageToken A token that identifies the start of a page of results. This token should not be interpreted as having any meaning, but it can be obtained from a previous page of results.
774
+ * @param start The index of the first record to retrieve. When possible, specify pageToken instead as it will result in better performance. If this parameter and pageToken are both specified, this parameter is interpreted as the index after the pageToken of the first record to retrieve.
775
+ * @param limit The maximum number of records to receive. The response will include a token that can be passed as the pageToken parameter to a future request to continue receiving results where this query leaves off.
776
+ * @param dereference true to automatically dereference links to other records; false to leave them as links. Dereferencing a link means including the record itself where the link would be. Dereferencing only happens one level deep, regardless of the value of this parameter.
777
+ * @param aspectQuery Filter the records returned by a value within the aspect JSON. Expressed as &#39;aspectId.path.to.field:value&#39;, url encoded. NOTE: This is an early stage API and may change greatly in the future
778
+ * @param aspectOrQuery Filter the records returned by a value within the aspect JSON. Expressed as &#39;aspectId.path.to.field:value&#39;, url encoded. Queries passing via this parameter will be grouped with OR logic. NOTE: This is an early stage API and may change greatly in the future
779
+ * @param orderBy Specify the field to sort the result. Aspect field can be supported in a format like aspectId.path.to.field
780
+ * @param orderByDir Specify the order by direction. Either &#x60;asc&#x60; or &#x60;desc&#x60;
781
+ * @param orderNullFirst Specify whether nulls appear before (&#x60;true&#x60;) or after (&#x60;false&#x60;) non-null values in the sort ordering.
782
+ * @param xMagdaSession Magda internal session id
783
+ */
784
+ getAll(xMagdaTenantId: number, aspect?: Array<string>, optionalAspect?: Array<string>, pageToken?: string, start?: number, limit?: number, dereference?: boolean, aspectQuery?: Array<string>, aspectOrQuery?: Array<string>, orderBy?: string, orderByDir?: string, orderNullFirst?: boolean, xMagdaSession?: string): Promise<{
785
+ response: http.IncomingMessage;
786
+ body: Array<Record_2>;
787
+ }>;
788
+ /**
789
+ * Get a list of all records as summaries
790
+ *
791
+ * @param xMagdaTenantId 0
792
+ * @param pageToken A token that identifies the start of a page of results. This token should not be interpreted as having any meaning, but it can be obtained from a previous page of results.
793
+ * @param start The index of the first record to retrieve. When possible, specify pageToken instead as it will result in better performance. If this parameter and pageToken are both specified, this parameter is interpreted as the index after the pageToken of the first record to retrieve.
794
+ * @param limit The maximum number of records to receive. The response will include a token that can be passed as the pageToken parameter to a future request to continue receiving results where this query leaves off.
795
+ * @param xMagdaSession Magda internal session id
796
+ */
797
+ getAllSummary(xMagdaTenantId: number, pageToken?: string, start?: number, limit?: number, xMagdaSession?: string): Promise<{
798
+ response: http.IncomingMessage;
799
+ body: Array<RecordSummary>;
800
+ }>;
801
+ /**
802
+ * Get a record by ID
803
+ * Gets a complete record, including data for all aspects.
804
+ * @param id ID of the record to be fetched.
805
+ * @param xMagdaTenantId 0
806
+ * @param aspect The aspects for which to retrieve data, specified as multiple occurrences of this query parameter. Only records that have all of these aspects will be included in the response.
807
+ * @param optionalAspect The optional aspects for which to retrieve data, specified as multiple occurrences of this query parameter. These aspects will be included in a record if available, but a record will be included even if it is missing these aspects.
808
+ * @param dereference true to automatically dereference links to other records; false to leave them as links. Dereferencing a link means including the record itself where the link would be. Dereferencing only happens one level deep, regardless of the value of this parameter.
809
+ * @param xMagdaSession Magda internal session id
810
+ */
811
+ getById(id: string, xMagdaTenantId: number, aspect?: Array<string>, optionalAspect?: Array<string>, dereference?: boolean, xMagdaSession?: string): Promise<{
812
+ response: http.IncomingMessage;
813
+ body: Record_2;
814
+ }>;
815
+ /**
816
+ * Get a summary record by ID
817
+ * Gets a summary record, including all the aspect ids for which this record has data.
818
+ * @param id ID of the record to be fetched.
819
+ * @param xMagdaTenantId 0
820
+ * @param xMagdaSession Magda internal session id
821
+ */
822
+ getByIdSummary(id: string, xMagdaTenantId: number, xMagdaSession?: string): Promise<{
823
+ response: http.IncomingMessage;
824
+ body: RecordSummary;
825
+ }>;
826
+ /**
827
+ * Get the count of records matching the parameters. If no parameters are specified, the count will be approximate for performance reasons.
828
+ *
829
+ * @param xMagdaTenantId 0
830
+ * @param aspect The aspects for which to retrieve data, specified as multiple occurrences of this query parameter. Only records that have all of these aspects will be included in the response.
831
+ * @param aspectQuery Filter the records returned by a value within the aspect JSON. Expressed as &#39;aspectId.path.to.field:value&#39;, url encoded. NOTE: This is an early stage API and may change greatly in the future
832
+ * @param aspectOrQuery Filter the records returned by a value within the aspect JSON. Expressed as &#39;aspectId.path.to.field:value&#39;, url encoded. Queries passing via this parameter will be grouped with OR logic.
833
+ * @param xMagdaSession Magda internal session id
834
+ */
835
+ getCount(xMagdaTenantId: number, aspect?: Array<string>, aspectQuery?: Array<string>, aspectOrQuery?: Array<string>, xMagdaSession?: string): Promise<{
836
+ response: http.IncomingMessage;
837
+ body: CountResponse;
838
+ }>;
839
+ /**
840
+ * Get a list tokens for paging through the records
841
+ *
842
+ * @param xMagdaTenantId 0
843
+ * @param aspect The aspects for which to retrieve data, specified as multiple occurrences of this query parameter. Only records that have all of these aspects will be included in the response.
844
+ * @param limit The size of each page to get tokens for.
845
+ * @param xMagdaSession Magda internal session id
846
+ */
847
+ getPageTokens(xMagdaTenantId: number, aspect?: Array<string>, limit?: number, xMagdaSession?: string): Promise<{
848
+ response: http.IncomingMessage;
849
+ body: Array<string>;
850
+ }>;
851
+ /**
852
+ * Modify a record by applying a JSON Patch
853
+ * The patch should follow IETF RFC 6902 (https://tools.ietf.org/html/rfc6902).
854
+ * @param xMagdaTenantId 0
855
+ * @param id ID of the aspect to be saved.
856
+ * @param recordPatch The RFC 6902 patch to apply to the aspect.
857
+ * @param xMagdaSession Magda internal session id
858
+ */
859
+ patchById(xMagdaTenantId: number, id: string, recordPatch: Array<Operation>, xMagdaSession: string): Promise<{
860
+ response: http.IncomingMessage;
861
+ body: AspectDefinition;
862
+ }>;
863
+ /**
864
+ * Modify a record by ID
865
+ * Modifies a record. Aspects included in the request are created or updated, but missing aspects are not removed.
866
+ * @param xMagdaTenantId 0
867
+ * @param id ID of the record to be fetched.
868
+ * @param record The record to save.
869
+ * @param xMagdaSession Magda internal session id
870
+ */
871
+ putById(xMagdaTenantId: number, id: string, record: Record_2, xMagdaSession: string): Promise<{
872
+ response: http.IncomingMessage;
873
+ body: Record_2;
874
+ }>;
875
+ /**
876
+ * Trim by source tag
877
+ * Trims records with the provided source that DON&#39;T have the supplied source tag
878
+ * @param xMagdaTenantId 0
879
+ * @param sourceTagToPreserve Source tag of the records to PRESERVE.
880
+ * @param sourceId Source id of the records to delete.
881
+ * @param xMagdaSession Magda internal session id
882
+ */
883
+ trimBySourceTag(xMagdaTenantId: number, sourceTagToPreserve: string, sourceId: string, xMagdaSession: string): Promise<{
884
+ response: http.IncomingMessage;
885
+ body: MultipleDeleteResult;
886
+ }>;
887
+ }
888
+
889
+ declare enum RecordsApiApiKeys {
890
+ }
891
+
892
+ declare interface RecordsPage<I extends Record_2> {
893
+ totalCount: number;
894
+ hasMore: boolean;
895
+ nextPageToken?: string;
896
+ records: I[];
897
+ }
898
+
899
+ /**
900
+ * A summary of a record in the registry. Summaries specify which aspects are available, but do not include data for any aspects.
901
+ */
902
+ declare class RecordSummary {
903
+ /**
904
+ * The identifier of the record
905
+ */
906
+ 'id': string;
907
+ /**
908
+ * The name of the record
909
+ */
910
+ 'name': string;
911
+ /**
912
+ * The list of aspect IDs for which this record has data
913
+ */
914
+ 'aspects': Array<string>;
915
+ /**
916
+ * The identifier of the tenant
917
+ */
918
+ 'tenantId': number;
919
+ }
920
+
921
+ declare type RecordType = "Organization" | "Dataset" | "Distribution" | "Group";
922
+
923
+ declare class RegistryClient {
924
+ protected baseUri: URI_2;
925
+ protected aspectDefinitionsApi: AspectDefinitionsApi;
926
+ protected recordsApi: RecordsApi;
927
+ protected webHooksApi: WebHooksApi;
928
+ protected recordAspectsApi: RecordAspectsApi;
929
+ protected recordHistoryApi: RecordHistoryApi;
930
+ protected maxRetries: number;
931
+ protected secondsBetweenRetries: number;
932
+ protected tenantId: number;
933
+ protected jwt: string | undefined;
934
+ constructor({ baseUrl, maxRetries, secondsBetweenRetries, tenantId }: RegistryOptions);
935
+ getRecordUrl(id: string): string;
936
+ getAspectDefinitions(): Promise<AspectDefinition[] | Error>;
937
+ getRecord(id: string, aspect?: Array<string>, optionalAspect?: Array<string>, dereference?: boolean): Promise<Record_2 | Error>;
938
+ getRecords<I extends Record_2>(aspect?: Array<string>, optionalAspect?: Array<string>, pageToken?: string, dereference?: boolean, limit?: number, aspectQueries?: string[], aspectOrQuery?: string[], orderBy?: string, orderByDir?: string, orderNullFirst?: boolean): Promise<RecordsPage<I> | Error>;
939
+ getRecordsPageTokens(aspect?: Array<string>, limit?: number): Promise<string[] | Error>;
940
+ }
941
+
942
+ declare class RegistryEvent {
943
+ 'id': any;
944
+ 'eventTime': Date;
945
+ 'eventType': EventType;
946
+ 'userId': string;
947
+ 'data': JsObject;
948
+ 'tenantId': number;
949
+ }
950
+
951
+ declare interface RegistryOptions {
952
+ baseUrl: string;
953
+ maxRetries?: number;
954
+ secondsBetweenRetries?: number;
955
+ tenantId: number;
956
+ }
957
+
958
+ declare interface ReportProblem {
959
+ (title: string, message?: string, additionalInfo?: any): void;
960
+ }
961
+
962
+ export declare const TenantConsts: any;
963
+
964
+ declare class WebHook {
965
+ 'id': string;
966
+ 'name': string;
967
+ 'active': boolean;
968
+ 'lastEvent': any;
969
+ 'url': string;
970
+ 'eventTypes': Array<EventType>;
971
+ 'isWaitingForResponse': any;
972
+ 'config': WebHookConfig;
973
+ 'enabled': boolean;
974
+ 'lastRetryTime': Date;
975
+ 'retryCount': number;
976
+ 'isRunning': any;
977
+ 'isProcessing': any;
978
+ }
979
+
980
+ /**
981
+ * Asynchronously acknowledges receipt of a web hook notification.
982
+ */
983
+ declare class WebHookAcknowledgement {
984
+ /**
985
+ * True if the web hook was received successfully and the listener is ready for further notifications. False if the web hook was not received and the same notification should be repeated.
986
+ */
987
+ 'succeeded': boolean;
988
+ /**
989
+ * The ID of the last event received by the listener. This should be the value of the `lastEventId` property of the web hook payload that is being acknowledged. This value is ignored if `succeeded` is false.
990
+ */
991
+ 'lastEventIdReceived': any;
992
+ /**
993
+ * Should the webhook be active or inactive?
994
+ */
995
+ 'active': any;
996
+ }
997
+
998
+ /**
999
+ * The response to an asynchronous web hook acknowledgement.
1000
+ */
1001
+ declare class WebHookAcknowledgementResponse {
1002
+ /**
1003
+ * The ID of the last event successfully received by the listener. Further notifications will start after this event.
1004
+ */
1005
+ 'lastEventIdReceived': number;
1006
+ }
1007
+
1008
+ declare class WebHookConfig {
1009
+ 'aspects': Array<string>;
1010
+ 'optionalAspects': Array<string>;
1011
+ 'includeEvents': any;
1012
+ 'includeRecords': any;
1013
+ 'includeAspectDefinitions': any;
1014
+ 'dereference': any;
1015
+ }
1016
+
1017
+ declare class WebHooksApi {
1018
+ protected basePath: string;
1019
+ protected defaultHeaders: any;
1020
+ protected _useQuerystring: boolean;
1021
+ protected authentications: any;
1022
+ constructor(basePath?: string);
1023
+ set useQuerystring(value: boolean);
1024
+ setApiKey(key: WebHooksApiApiKeys, value: string): void;
1025
+ /**
1026
+ * Acknowledge a previously-deferred web hook
1027
+ * Acknowledges a previously-deferred web hook with a given ID. Acknowledging a previously-POSTed web hook will cause the next, if any, to be sent.
1028
+ * @param id ID of the web hook to be acknowledged.
1029
+ * @param acknowledgement The details of the acknowledgement.
1030
+ * @param xMagdaSession Magda internal session id
1031
+ */
1032
+ ack(id: string, acknowledgement: WebHookAcknowledgement, xMagdaSession: string): Promise<{
1033
+ response: http.IncomingMessage;
1034
+ body: WebHookAcknowledgementResponse;
1035
+ }>;
1036
+ /**
1037
+ * Create a new web hook
1038
+ *
1039
+ * @param hook The definition of the new web hook.
1040
+ * @param xMagdaSession Magda internal session id
1041
+ */
1042
+ create(hook: WebHook, xMagdaSession: string): Promise<{
1043
+ response: http.IncomingMessage;
1044
+ body: WebHook;
1045
+ }>;
1046
+ /**
1047
+ * Delete a web hook
1048
+ *
1049
+ * @param hookId ID of the web hook to delete.
1050
+ * @param xMagdaSession Magda internal session id
1051
+ */
1052
+ deleteById(hookId: string, xMagdaSession: string): Promise<{
1053
+ response: http.IncomingMessage;
1054
+ body: DeleteResult;
1055
+ }>;
1056
+ /**
1057
+ * Get a list of all web hooks
1058
+ *
1059
+ * @param xMagdaSession Magda internal session id
1060
+ */
1061
+ getAll(xMagdaSession: string): Promise<{
1062
+ response: http.IncomingMessage;
1063
+ body: Array<WebHook>;
1064
+ }>;
1065
+ /**
1066
+ * Get a web hook by ID
1067
+ *
1068
+ * @param id ID of the web hook to be fetched.
1069
+ * @param xMagdaSession Magda internal session id
1070
+ */
1071
+ getById(id: string, xMagdaSession: string): Promise<{
1072
+ response: http.IncomingMessage;
1073
+ body: WebHook;
1074
+ }>;
1075
+ /**
1076
+ * Modify a web hook by ID
1077
+ * Modifies the web hook with a given ID. If a web hook with the ID does not yet exist, it is created.
1078
+ * @param id ID of the aspect to be saved.
1079
+ * @param hook The web hook to save.
1080
+ * @param xMagdaSession Magda internal session id
1081
+ */
1082
+ putById(id: string, hook: WebHook, xMagdaSession: string): Promise<{
1083
+ response: http.IncomingMessage;
1084
+ body: WebHook;
1085
+ }>;
1086
+ }
1087
+
1088
+ declare enum WebHooksApiApiKeys {
1089
+ }
1090
+
1091
+ export { }