@contember/client 0.0.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.
- package/dist/development/content/formatContentApiRelativeUrl.js +5 -0
- package/dist/development/content/formatContentApiRelativeUrl.js.map +1 -0
- package/dist/development/content/params/whereToFilter.js +17 -0
- package/dist/development/content/params/whereToFilter.js.map +1 -0
- package/dist/development/content/upload/FileUploadError.js +10 -0
- package/dist/development/content/upload/FileUploadError.js.map +1 -0
- package/dist/development/content/upload/GenerateUploadUrlMutationBuilder.js +35 -0
- package/dist/development/content/upload/GenerateUploadUrlMutationBuilder.js.map +1 -0
- package/dist/development/content/upload/S3FileUploader.js +108 -0
- package/dist/development/content/upload/S3FileUploader.js.map +1 -0
- package/dist/development/crudQueryBuilder/CrudQueryBuilder.js +104 -0
- package/dist/development/crudQueryBuilder/CrudQueryBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/CrudQueryBuilderError.js +6 -0
- package/dist/development/crudQueryBuilder/CrudQueryBuilderError.js.map +1 -0
- package/dist/development/crudQueryBuilder/ErrorsRelationBuilder.js +15 -0
- package/dist/development/crudQueryBuilder/ErrorsRelationBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/ReadBuilder.js +70 -0
- package/dist/development/crudQueryBuilder/ReadBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/ValidationRelationBuilder.js +18 -0
- package/dist/development/crudQueryBuilder/ValidationRelationBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/WriteBuilder.js +54 -0
- package/dist/development/crudQueryBuilder/WriteBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/WriteDataBuilder.js +110 -0
- package/dist/development/crudQueryBuilder/WriteDataBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/WriteManyRelationBuilder.js +77 -0
- package/dist/development/crudQueryBuilder/WriteManyRelationBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/WriteOneRelationBuilder.js +51 -0
- package/dist/development/crudQueryBuilder/WriteOneRelationBuilder.js.map +1 -0
- package/dist/development/crudQueryBuilder/types.js +40 -0
- package/dist/development/crudQueryBuilder/types.js.map +1 -0
- package/dist/development/graphQlBuilder/GraphQlBuilderError.js +6 -0
- package/dist/development/graphQlBuilder/GraphQlBuilderError.js.map +1 -0
- package/dist/development/graphQlBuilder/GraphQlLiteral.js +12 -0
- package/dist/development/graphQlBuilder/GraphQlLiteral.js.map +1 -0
- package/dist/development/graphQlBuilder/ObjectBuilder.js +80 -0
- package/dist/development/graphQlBuilder/ObjectBuilder.js.map +1 -0
- package/dist/development/graphQlBuilder/QueryBuilder.js +22 -0
- package/dist/development/graphQlBuilder/QueryBuilder.js.map +1 -0
- package/dist/development/graphQlBuilder/QueryCompiler.js +101 -0
- package/dist/development/graphQlBuilder/QueryCompiler.js.map +1 -0
- package/dist/development/graphQlBuilder/RootObjectBuilder.js +31 -0
- package/dist/development/graphQlBuilder/RootObjectBuilder.js.map +1 -0
- package/dist/development/graphQlClient/GraphQlClient.js +33 -0
- package/dist/development/graphQlClient/GraphQlClient.js.map +1 -0
- package/dist/development/index.js +58 -0
- package/dist/development/index.js.map +1 -0
- package/dist/development/system/formatSystemApiRelativeUrl.js +5 -0
- package/dist/development/system/formatSystemApiRelativeUrl.js.map +1 -0
- package/dist/development/tenant/loginMutation.js +34 -0
- package/dist/development/tenant/loginMutation.js.map +1 -0
- package/dist/development/tenant/tenantApiRelativeUrl.js +5 -0
- package/dist/development/tenant/tenantApiRelativeUrl.js.map +1 -0
- package/dist/development/tenant/tenantErrorMessages.js +18 -0
- package/dist/development/tenant/tenantErrorMessages.js.map +1 -0
- package/dist/development/utils/isEmptyObject.js +12 -0
- package/dist/development/utils/isEmptyObject.js.map +1 -0
- package/dist/development/utils/readFileAsArrayBuffer.js +15 -0
- package/dist/development/utils/readFileAsArrayBuffer.js.map +1 -0
- package/dist/production/content/formatContentApiRelativeUrl.js +5 -0
- package/dist/production/content/formatContentApiRelativeUrl.js.map +1 -0
- package/dist/production/content/params/whereToFilter.js +17 -0
- package/dist/production/content/params/whereToFilter.js.map +1 -0
- package/dist/production/content/upload/FileUploadError.js +10 -0
- package/dist/production/content/upload/FileUploadError.js.map +1 -0
- package/dist/production/content/upload/GenerateUploadUrlMutationBuilder.js +35 -0
- package/dist/production/content/upload/GenerateUploadUrlMutationBuilder.js.map +1 -0
- package/dist/production/content/upload/S3FileUploader.js +108 -0
- package/dist/production/content/upload/S3FileUploader.js.map +1 -0
- package/dist/production/crudQueryBuilder/CrudQueryBuilder.js +104 -0
- package/dist/production/crudQueryBuilder/CrudQueryBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/CrudQueryBuilderError.js +6 -0
- package/dist/production/crudQueryBuilder/CrudQueryBuilderError.js.map +1 -0
- package/dist/production/crudQueryBuilder/ErrorsRelationBuilder.js +15 -0
- package/dist/production/crudQueryBuilder/ErrorsRelationBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/ReadBuilder.js +70 -0
- package/dist/production/crudQueryBuilder/ReadBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/ValidationRelationBuilder.js +18 -0
- package/dist/production/crudQueryBuilder/ValidationRelationBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/WriteBuilder.js +54 -0
- package/dist/production/crudQueryBuilder/WriteBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/WriteDataBuilder.js +110 -0
- package/dist/production/crudQueryBuilder/WriteDataBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/WriteManyRelationBuilder.js +77 -0
- package/dist/production/crudQueryBuilder/WriteManyRelationBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/WriteOneRelationBuilder.js +51 -0
- package/dist/production/crudQueryBuilder/WriteOneRelationBuilder.js.map +1 -0
- package/dist/production/crudQueryBuilder/types.js +40 -0
- package/dist/production/crudQueryBuilder/types.js.map +1 -0
- package/dist/production/graphQlBuilder/GraphQlBuilderError.js +6 -0
- package/dist/production/graphQlBuilder/GraphQlBuilderError.js.map +1 -0
- package/dist/production/graphQlBuilder/GraphQlLiteral.js +12 -0
- package/dist/production/graphQlBuilder/GraphQlLiteral.js.map +1 -0
- package/dist/production/graphQlBuilder/ObjectBuilder.js +80 -0
- package/dist/production/graphQlBuilder/ObjectBuilder.js.map +1 -0
- package/dist/production/graphQlBuilder/QueryBuilder.js +22 -0
- package/dist/production/graphQlBuilder/QueryBuilder.js.map +1 -0
- package/dist/production/graphQlBuilder/QueryCompiler.js +101 -0
- package/dist/production/graphQlBuilder/QueryCompiler.js.map +1 -0
- package/dist/production/graphQlBuilder/RootObjectBuilder.js +31 -0
- package/dist/production/graphQlBuilder/RootObjectBuilder.js.map +1 -0
- package/dist/production/graphQlClient/GraphQlClient.js +33 -0
- package/dist/production/graphQlClient/GraphQlClient.js.map +1 -0
- package/dist/production/index.js +58 -0
- package/dist/production/index.js.map +1 -0
- package/dist/production/system/formatSystemApiRelativeUrl.js +5 -0
- package/dist/production/system/formatSystemApiRelativeUrl.js.map +1 -0
- package/dist/production/tenant/loginMutation.js +34 -0
- package/dist/production/tenant/loginMutation.js.map +1 -0
- package/dist/production/tenant/tenantApiRelativeUrl.js +5 -0
- package/dist/production/tenant/tenantApiRelativeUrl.js.map +1 -0
- package/dist/production/tenant/tenantErrorMessages.js +18 -0
- package/dist/production/tenant/tenantErrorMessages.js.map +1 -0
- package/dist/production/utils/isEmptyObject.js +12 -0
- package/dist/production/utils/isEmptyObject.js.map +1 -0
- package/dist/production/utils/readFileAsArrayBuffer.js +15 -0
- package/dist/production/utils/readFileAsArrayBuffer.js.map +1 -0
- package/dist/types/content/formatContentApiRelativeUrl.d.ts +2 -0
- package/dist/types/content/formatContentApiRelativeUrl.d.ts.map +1 -0
- package/dist/types/content/index.d.ts +4 -0
- package/dist/types/content/index.d.ts.map +1 -0
- package/dist/types/content/params/index.d.ts +2 -0
- package/dist/types/content/params/index.d.ts.map +1 -0
- package/dist/types/content/params/whereToFilter.d.ts +4 -0
- package/dist/types/content/params/whereToFilter.d.ts.map +1 -0
- package/dist/types/content/upload/FileUploadError.d.ts +9 -0
- package/dist/types/content/upload/FileUploadError.d.ts.map +1 -0
- package/dist/types/content/upload/FileUploadProgress.d.ts +4 -0
- package/dist/types/content/upload/FileUploadProgress.d.ts.map +1 -0
- package/dist/types/content/upload/FileUploader.d.ts +15 -0
- package/dist/types/content/upload/FileUploader.d.ts.map +1 -0
- package/dist/types/content/upload/GenerateUploadUrlMutationBuilder.d.ts +35 -0
- package/dist/types/content/upload/GenerateUploadUrlMutationBuilder.d.ts.map +1 -0
- package/dist/types/content/upload/S3FileUploader.d.ts +33 -0
- package/dist/types/content/upload/S3FileUploader.d.ts.map +1 -0
- package/dist/types/content/upload/SwitchFileUploader.d.ts +13 -0
- package/dist/types/content/upload/SwitchFileUploader.d.ts.map +1 -0
- package/dist/types/content/upload/UploadedFileMetadata.d.ts +4 -0
- package/dist/types/content/upload/UploadedFileMetadata.d.ts.map +1 -0
- package/dist/types/content/upload/index.d.ts +8 -0
- package/dist/types/content/upload/index.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/CrudQueryBuilder.d.ts +21 -0
- package/dist/types/crudQueryBuilder/CrudQueryBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/CrudQueryBuilderError.d.ts +3 -0
- package/dist/types/crudQueryBuilder/CrudQueryBuilderError.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/ErrorsRelationBuilder.d.ts +5 -0
- package/dist/types/crudQueryBuilder/ErrorsRelationBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/ReadBuilder.d.ts +31 -0
- package/dist/types/crudQueryBuilder/ReadBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/ValidationRelationBuilder.d.ts +5 -0
- package/dist/types/crudQueryBuilder/ValidationRelationBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/WriteBuilder.d.ts +24 -0
- package/dist/types/crudQueryBuilder/WriteBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/WriteDataBuilder.d.ts +24 -0
- package/dist/types/crudQueryBuilder/WriteDataBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/WriteManyRelationBuilder.d.ts +27 -0
- package/dist/types/crudQueryBuilder/WriteManyRelationBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/WriteOneRelationBuilder.d.ts +28 -0
- package/dist/types/crudQueryBuilder/WriteOneRelationBuilder.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/index.d.ts +8 -0
- package/dist/types/crudQueryBuilder/index.d.ts.map +1 -0
- package/dist/types/crudQueryBuilder/types.d.ts +45 -0
- package/dist/types/crudQueryBuilder/types.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/GraphQlBuilderError.d.ts +3 -0
- package/dist/types/graphQlBuilder/GraphQlBuilderError.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/GraphQlLiteral.d.ts +6 -0
- package/dist/types/graphQlBuilder/GraphQlLiteral.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/ObjectBuilder.d.ts +28 -0
- package/dist/types/graphQlBuilder/ObjectBuilder.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/QueryBuilder.d.ts +17 -0
- package/dist/types/graphQlBuilder/QueryBuilder.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/QueryCompiler.d.ts +13 -0
- package/dist/types/graphQlBuilder/QueryCompiler.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/RootObjectBuilder.d.ts +17 -0
- package/dist/types/graphQlBuilder/RootObjectBuilder.d.ts.map +1 -0
- package/dist/types/graphQlBuilder/index.d.ts +6 -0
- package/dist/types/graphQlBuilder/index.d.ts.map +1 -0
- package/dist/types/graphQlClient/GraphQlClient.d.ts +19 -0
- package/dist/types/graphQlClient/GraphQlClient.d.ts.map +1 -0
- package/dist/types/graphQlClient/index.d.ts +2 -0
- package/dist/types/graphQlClient/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +45 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/system/events/RelationFilter.d.ts +5 -0
- package/dist/types/system/events/RelationFilter.d.ts.map +1 -0
- package/dist/types/system/events/SystemEvent.d.ts +10 -0
- package/dist/types/system/events/SystemEvent.d.ts.map +1 -0
- package/dist/types/system/events/TreeFilter.d.ts +7 -0
- package/dist/types/system/events/TreeFilter.d.ts.map +1 -0
- package/dist/types/system/events/index.d.ts +4 -0
- package/dist/types/system/events/index.d.ts.map +1 -0
- package/dist/types/system/formatSystemApiRelativeUrl.d.ts +2 -0
- package/dist/types/system/formatSystemApiRelativeUrl.d.ts.map +1 -0
- package/dist/types/system/index.d.ts +3 -0
- package/dist/types/system/index.d.ts.map +1 -0
- package/dist/types/tenant/index.d.ts +4 -0
- package/dist/types/tenant/index.d.ts.map +1 -0
- package/dist/types/tenant/loginMutation.d.ts +32 -0
- package/dist/types/tenant/loginMutation.d.ts.map +1 -0
- package/dist/types/tenant/tenantApiRelativeUrl.d.ts +2 -0
- package/dist/types/tenant/tenantApiRelativeUrl.d.ts.map +1 -0
- package/dist/types/tenant/tenantErrorMessages.d.ts +5 -0
- package/dist/types/tenant/tenantErrorMessages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/dist/types/utils/index.d.ts +3 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/isEmptyObject.d.ts +2 -0
- package/dist/types/utils/isEmptyObject.d.ts.map +1 -0
- package/dist/types/utils/readFileAsArrayBuffer.d.ts +2 -0
- package/dist/types/utils/readFileAsArrayBuffer.d.ts.map +1 -0
- package/package.json +35 -0
- package/src/content/formatContentApiRelativeUrl.ts +2 -0
- package/src/content/index.ts +4 -0
- package/src/content/params/index.ts +1 -0
- package/src/content/params/whereToFilter.ts +19 -0
- package/src/content/upload/FileUploadError.ts +10 -0
- package/src/content/upload/FileUploadProgress.ts +3 -0
- package/src/content/upload/FileUploader.ts +19 -0
- package/src/content/upload/GenerateUploadUrlMutationBuilder.ts +72 -0
- package/src/content/upload/S3FileUploader.ts +151 -0
- package/src/content/upload/SwitchFileUploader.ts +40 -0
- package/src/content/upload/UploadedFileMetadata.ts +3 -0
- package/src/content/upload/index.ts +7 -0
- package/src/crudQueryBuilder/CrudQueryBuilder.ts +168 -0
- package/src/crudQueryBuilder/CrudQueryBuilderError.ts +1 -0
- package/src/crudQueryBuilder/ErrorsRelationBuilder.ts +16 -0
- package/src/crudQueryBuilder/ReadBuilder.ts +106 -0
- package/src/crudQueryBuilder/ValidationRelationBuilder.ts +17 -0
- package/src/crudQueryBuilder/WriteBuilder.ts +79 -0
- package/src/crudQueryBuilder/WriteDataBuilder.ts +153 -0
- package/src/crudQueryBuilder/WriteManyRelationBuilder.ts +141 -0
- package/src/crudQueryBuilder/WriteOneRelationBuilder.ts +101 -0
- package/src/crudQueryBuilder/index.ts +7 -0
- package/src/crudQueryBuilder/types.ts +73 -0
- package/src/graphQlBuilder/GraphQlBuilderError.ts +1 -0
- package/src/graphQlBuilder/GraphQlLiteral.ts +7 -0
- package/src/graphQlBuilder/ObjectBuilder.ts +87 -0
- package/src/graphQlBuilder/QueryBuilder.ts +34 -0
- package/src/graphQlBuilder/QueryCompiler.ts +115 -0
- package/src/graphQlBuilder/RootObjectBuilder.ts +36 -0
- package/src/graphQlBuilder/index.ts +5 -0
- package/src/graphQlClient/GraphQlClient.ts +52 -0
- package/src/graphQlClient/index.ts +1 -0
- package/src/index.ts +49 -0
- package/src/system/events/RelationFilter.ts +4 -0
- package/src/system/events/SystemEvent.ts +9 -0
- package/src/system/events/TreeFilter.ts +7 -0
- package/src/system/events/index.ts +3 -0
- package/src/system/formatSystemApiRelativeUrl.ts +1 -0
- package/src/system/index.ts +2 -0
- package/src/tenant/index.ts +3 -0
- package/src/tenant/loginMutation.ts +61 -0
- package/src/tenant/tenantApiRelativeUrl.ts +1 -0
- package/src/tenant/tenantErrorMessages.ts +14 -0
- package/src/tsconfig.json +6 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/isEmptyObject.ts +9 -0
- package/src/utils/readFileAsArrayBuffer.ts +12 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class GraphQlClient {
|
|
2
|
+
constructor(apiUrl, apiToken) {
|
|
3
|
+
this.apiUrl = apiUrl;
|
|
4
|
+
this.apiToken = apiToken;
|
|
5
|
+
}
|
|
6
|
+
async sendRequest(query, { apiTokenOverride, signal, variables, headers } = {}) {
|
|
7
|
+
const resolvedHeaders = { "Content-Type": "application/json", ...headers };
|
|
8
|
+
const resolvedToken = apiTokenOverride ?? this.apiToken;
|
|
9
|
+
if (resolvedToken !== void 0) {
|
|
10
|
+
resolvedHeaders["Authorization"] = `Bearer ${resolvedToken}`;
|
|
11
|
+
}
|
|
12
|
+
console.debug(query);
|
|
13
|
+
const response = await fetch(this.apiUrl, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: resolvedHeaders,
|
|
16
|
+
signal,
|
|
17
|
+
body: JSON.stringify({ query, variables })
|
|
18
|
+
});
|
|
19
|
+
if (response.ok) {
|
|
20
|
+
return await response.json();
|
|
21
|
+
}
|
|
22
|
+
const failedRequest = {
|
|
23
|
+
status: response.status,
|
|
24
|
+
statusText: response.statusText,
|
|
25
|
+
responseText: await response.text()
|
|
26
|
+
};
|
|
27
|
+
return Promise.reject(failedRequest);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
GraphQlClient
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=GraphQlClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphQlClient.js","sources":["../../../src/graphQlClient/GraphQlClient.ts"],"sourcesContent":["export interface GraphQlClientRequestOptions {\n\tvariables?: GraphQlClientVariables\n\tapiTokenOverride?: string\n\tsignal?: AbortSignal\n\theaders?: Record<string, string>\n}\n\nexport interface GraphQlClientVariables {\n\t[name: string]: any\n}\n\nexport type GraphQlClientFailedRequestMetadata = Pick<Response, 'status' | 'statusText'> & {\n\tresponseText: string\n}\n\nexport class GraphQlClient {\n\tconstructor(public readonly apiUrl: string, private readonly apiToken?: string) { }\n\n\tasync sendRequest<T = unknown>(\n\t\tquery: string,\n\t\t{ apiTokenOverride, signal, variables, headers }: GraphQlClientRequestOptions = {},\n\t): Promise<T> {\n\t\tconst resolvedHeaders: Record<string, string> = { 'Content-Type': 'application/json', ...headers }\n\t\tconst resolvedToken = apiTokenOverride ?? this.apiToken\n\n\t\tif (resolvedToken !== undefined) {\n\t\t\tresolvedHeaders['Authorization'] = `Bearer ${resolvedToken}`\n\t\t}\n\n\t\tconsole.debug(query)\n\n\t\tconst response = await fetch(this.apiUrl, {\n\t\t\tmethod: 'POST',\n\t\t\theaders: resolvedHeaders,\n\t\t\tsignal,\n\t\t\tbody: JSON.stringify({ query, variables }),\n\t\t})\n\n\t\tif (response.ok) {\n\t\t\t// It may still have errors (e.g. unfilled fields) but as far as the request goes, it is ok.\n\t\t\treturn await response.json()\n\t\t}\n\n\t\tconst failedRequest: GraphQlClientFailedRequestMetadata = {\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t\tresponseText: await response.text(),\n\t\t}\n\n\t\treturn Promise.reject(failedRequest)\n\t}\n}\n"],"names":[],"mappings":"AAeO,MAAM,cAAc;AAAA,EAC1B,YAA4B,QAAiC,UAAmB;AAApD,SAAA,SAAA;AAAiC,SAAA,WAAA;AAAA,EAAqB;AAAA,EAElF,MAAM,YACL,OACA,EAAE,kBAAkB,QAAQ,WAAW,QAAyC,IAAA,IACnE;AACb,UAAM,kBAA0C,EAAE,gBAAgB,oBAAoB,GAAG,QAAQ;AAC3F,UAAA,gBAAgB,oBAAoB,KAAK;AAE/C,QAAI,kBAAkB,QAAW;AAChB,sBAAA,eAAe,IAAI,UAAU;AAAA,IAC9C;AAEA,YAAQ,MAAM,KAAK;AAEnB,UAAM,WAAW,MAAM,MAAM,KAAK,QAAQ;AAAA,MACzC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,OAAO,WAAW;AAAA,IAAA,CACzC;AAED,QAAI,SAAS,IAAI;AAET,aAAA,MAAM,SAAS;IACvB;AAEA,UAAM,gBAAoD;AAAA,MACzD,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,cAAc,MAAM,SAAS,KAAK;AAAA,IAAA;AAG5B,WAAA,QAAQ,OAAO,aAAa;AAAA,EACpC;AACD;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { GraphQlLiteral } from "./graphQlBuilder/GraphQlLiteral.js";
|
|
2
|
+
import { ObjectBuilder } from "./graphQlBuilder/ObjectBuilder.js";
|
|
3
|
+
import { QueryCompiler } from "./graphQlBuilder/QueryCompiler.js";
|
|
4
|
+
import { QueryBuilder } from "./graphQlBuilder/QueryBuilder.js";
|
|
5
|
+
import { RootObjectBuilder } from "./graphQlBuilder/RootObjectBuilder.js";
|
|
6
|
+
import { CrudQueryBuilder as CrudQueryBuilder$1 } from "./crudQueryBuilder/CrudQueryBuilder.js";
|
|
7
|
+
import { ReadBuilder } from "./crudQueryBuilder/ReadBuilder.js";
|
|
8
|
+
import { WriteBuilder } from "./crudQueryBuilder/WriteBuilder.js";
|
|
9
|
+
import { WriteDataBuilder } from "./crudQueryBuilder/WriteDataBuilder.js";
|
|
10
|
+
import { WriteManyRelationBuilder } from "./crudQueryBuilder/WriteManyRelationBuilder.js";
|
|
11
|
+
import { WriteOneRelationBuilder } from "./crudQueryBuilder/WriteOneRelationBuilder.js";
|
|
12
|
+
import { WriteOperation } from "./crudQueryBuilder/types.js";
|
|
13
|
+
import { FileUploadError } from "./content/upload/FileUploadError.js";
|
|
14
|
+
import { GenerateUploadUrlMutationBuilder } from "./content/upload/GenerateUploadUrlMutationBuilder.js";
|
|
15
|
+
import { S3FileUploader } from "./content/upload/S3FileUploader.js";
|
|
16
|
+
import { whereToFilter } from "./content/params/whereToFilter.js";
|
|
17
|
+
import { formatContentApiRelativeUrl } from "./content/formatContentApiRelativeUrl.js";
|
|
18
|
+
import { GraphQlClient } from "./graphQlClient/GraphQlClient.js";
|
|
19
|
+
import { formatSystemApiRelativeUrl } from "./system/formatSystemApiRelativeUrl.js";
|
|
20
|
+
import { loginMutation } from "./tenant/loginMutation.js";
|
|
21
|
+
import { tenantApiRelativeUrl } from "./tenant/tenantApiRelativeUrl.js";
|
|
22
|
+
import { getTenantErrorMessage, tenantErrorMessages } from "./tenant/tenantErrorMessages.js";
|
|
23
|
+
var GraphQlBuilder;
|
|
24
|
+
((GraphQlBuilder2) => {
|
|
25
|
+
GraphQlBuilder2.GraphqlLiteral = GraphQlLiteral;
|
|
26
|
+
GraphQlBuilder2.GraphQlLiteral = GraphQlLiteral;
|
|
27
|
+
GraphQlBuilder2.ObjectBuilder = ObjectBuilder;
|
|
28
|
+
GraphQlBuilder2.QueryCompiler = QueryCompiler;
|
|
29
|
+
GraphQlBuilder2.QueryBuilder = QueryBuilder;
|
|
30
|
+
GraphQlBuilder2.RootObjectBuilder = RootObjectBuilder;
|
|
31
|
+
})(GraphQlBuilder || (GraphQlBuilder = {}));
|
|
32
|
+
var CrudQueryBuilder;
|
|
33
|
+
((_CrudQueryBuilder) => {
|
|
34
|
+
_CrudQueryBuilder.CrudQueryBuilder = CrudQueryBuilder$1;
|
|
35
|
+
_CrudQueryBuilder.ReadBuilder = ReadBuilder;
|
|
36
|
+
_CrudQueryBuilder.WriteBuilder = WriteBuilder;
|
|
37
|
+
_CrudQueryBuilder.WriteDataBuilder = WriteDataBuilder;
|
|
38
|
+
_CrudQueryBuilder.WriteManyRelationBuilder = WriteManyRelationBuilder;
|
|
39
|
+
_CrudQueryBuilder.WriteOneRelationBuilder = WriteOneRelationBuilder;
|
|
40
|
+
_CrudQueryBuilder.WriteOperation = WriteOperation;
|
|
41
|
+
})(CrudQueryBuilder || (CrudQueryBuilder = {}));
|
|
42
|
+
export {
|
|
43
|
+
CrudQueryBuilder,
|
|
44
|
+
FileUploadError,
|
|
45
|
+
GenerateUploadUrlMutationBuilder,
|
|
46
|
+
GraphQlBuilder,
|
|
47
|
+
GraphQlClient,
|
|
48
|
+
GraphQlLiteral,
|
|
49
|
+
S3FileUploader,
|
|
50
|
+
formatContentApiRelativeUrl,
|
|
51
|
+
formatSystemApiRelativeUrl,
|
|
52
|
+
getTenantErrorMessage,
|
|
53
|
+
loginMutation,
|
|
54
|
+
tenantApiRelativeUrl,
|
|
55
|
+
tenantErrorMessages,
|
|
56
|
+
whereToFilter
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import * as CrudQueryBuilderTmp from './crudQueryBuilder'\n\nimport * as GraphQlBuilderTmp from './graphQlBuilder'\nexport { GraphQlLiteral } from './graphQlBuilder'\n\nexport namespace GraphQlBuilder {\n\texport import GraphqlLiteral = GraphQlBuilderTmp.GraphQlLiteral\n\texport import GraphQlLiteral = GraphQlBuilderTmp.GraphQlLiteral\n\texport import ObjectBuilder = GraphQlBuilderTmp.ObjectBuilder\n\texport import QueryCompiler = GraphQlBuilderTmp.QueryCompiler\n\texport import QueryBuilder = GraphQlBuilderTmp.QueryBuilder\n\texport import RootObjectBuilder = GraphQlBuilderTmp.RootObjectBuilder\n}\n\nexport namespace CrudQueryBuilder {\n\texport import CrudQueryBuilder = CrudQueryBuilderTmp.CrudQueryBuilder\n\texport import ReadBuilder = CrudQueryBuilderTmp.ReadBuilder\n\texport import WriteBuilder = CrudQueryBuilderTmp.WriteBuilder\n\texport import WriteDataBuilder = CrudQueryBuilderTmp.WriteDataBuilder\n\texport import WriteManyRelationBuilder = CrudQueryBuilderTmp.WriteManyRelationBuilder\n\texport import WriteOneRelationBuilder = CrudQueryBuilderTmp.WriteOneRelationBuilder\n\texport import WriteOperation = CrudQueryBuilderTmp.WriteOperation\n\texport type CreateMutationArguments = CrudQueryBuilderTmp.CreateMutationArguments\n\texport type CreateMutationFields = CrudQueryBuilderTmp.CreateMutationFields\n\texport type DeleteMutationArguments = CrudQueryBuilderTmp.DeleteMutationArguments\n\texport type DeleteMutationFields = CrudQueryBuilderTmp.DeleteMutationFields\n\texport type GetQueryArguments = CrudQueryBuilderTmp.GetQueryArguments\n\texport type HasManyArguments = CrudQueryBuilderTmp.HasManyArguments\n\texport type HasOneArguments = CrudQueryBuilderTmp.HasOneArguments\n\texport type ListQueryArguments = CrudQueryBuilderTmp.ListQueryArguments\n\texport type Mutations = CrudQueryBuilderTmp.Mutations\n\texport type OrderDirection = CrudQueryBuilderTmp.OrderDirection\n\texport type PaginateQueryArguments = CrudQueryBuilderTmp.PaginateQueryArguments\n\texport type Queries = CrudQueryBuilderTmp.Queries\n\texport type ReadArguments = CrudQueryBuilderTmp.ReadArguments\n\texport type ReductionArguments = CrudQueryBuilderTmp.ReductionArguments\n\texport type UpdateMutationArguments = CrudQueryBuilderTmp.UpdateMutationArguments\n\texport type UpdateMutationFields = CrudQueryBuilderTmp.UpdateMutationFields\n\texport type WriteArguments = CrudQueryBuilderTmp.WriteArguments\n\texport type WriteFields = CrudQueryBuilderTmp.WriteFields\n\texport type WriteRelationOps = CrudQueryBuilderTmp.WriteRelationOps\n}\n\nexport * from './content'\nexport * from './graphQlClient'\nexport * from './system'\nexport * from './tenant'\n\nexport type { Input, Value, Result, Writable } from '@contember/schema'\n"],"names":["GraphQlBuilder","GraphQlBuilderTmp.GraphQlLiteral","GraphQlBuilderTmp.ObjectBuilder","GraphQlBuilderTmp.QueryCompiler","GraphQlBuilderTmp.QueryBuilder","GraphQlBuilderTmp.RootObjectBuilder","CrudQueryBuilderTmp.CrudQueryBuilder","CrudQueryBuilderTmp.ReadBuilder","CrudQueryBuilderTmp.WriteBuilder","CrudQueryBuilderTmp.WriteDataBuilder","CrudQueryBuilderTmp.WriteManyRelationBuilder","CrudQueryBuilderTmp.WriteOneRelationBuilder","CrudQueryBuilderTmp.WriteOperation"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAKiB,IAAA;AAAA,CAAV,CAAUA,oBAAV;AACQA,kBAAA,iBAAiBC;AACjBD,kBAAA,iBAAiBC;AACjBD,kBAAA,gBAAgBE;AAChBF,kBAAA,gBAAgBG;AAChBH,kBAAA,eAAeI;AACfJ,kBAAA,oBAAoBK;AAAkB,GANpC,mBAAA,iBAAA,CAAA,EAAA;AASA,IAAA;AAAA,CAAV,CAAU,sBAAV;AACQ,uCAAmBC;AACnB,kCAAcC;AACd,mCAAeC;AACf,uCAAmBC;AACnB,+CAA2BC;AAC3B,8CAA0BC;AAC1B,qCAAiBC;AAAoB,GAPnC,qBAAA,mBAAA,CAAA,EAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatSystemApiRelativeUrl.js","sources":["../../../src/system/formatSystemApiRelativeUrl.ts"],"sourcesContent":["export const formatSystemApiRelativeUrl = (projectSlug: string) => `/system/${projectSlug}`\n"],"names":[],"mappings":"AAAa,MAAA,6BAA6B,CAAC,gBAAwB,WAAW;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const loginMutation = `
|
|
2
|
+
mutation($email: String!, $password: String!, $expiration: Int) {
|
|
3
|
+
signIn(email: $email, password: $password, expiration: $expiration) {
|
|
4
|
+
ok
|
|
5
|
+
errors {
|
|
6
|
+
endUserMessage
|
|
7
|
+
code
|
|
8
|
+
}
|
|
9
|
+
result {
|
|
10
|
+
token
|
|
11
|
+
person {
|
|
12
|
+
id
|
|
13
|
+
email
|
|
14
|
+
identity {
|
|
15
|
+
id
|
|
16
|
+
projects {
|
|
17
|
+
project {
|
|
18
|
+
id
|
|
19
|
+
slug
|
|
20
|
+
}
|
|
21
|
+
memberships {
|
|
22
|
+
role
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`;
|
|
31
|
+
export {
|
|
32
|
+
loginMutation
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=loginMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loginMutation.js","sources":["../../../src/tenant/loginMutation.ts"],"sourcesContent":["export interface LoginMutationResponse {\n\tdata: {\n\t\tsignIn: {\n\t\t\tok: boolean\n\t\t\terrors: Array<{\n\t\t\t\tendUserMessage: string | null\n\t\t\t\tcode: string\n\t\t\t}>\n\t\t\tresult: {\n\t\t\t\ttoken: string\n\t\t\t\tperson: {\n\t\t\t\t\tid: string\n\t\t\t\t\temail: string\n\t\t\t\t\tidentity: {\n\t\t\t\t\t\tid: string\n\t\t\t\t\t\tprojects: Array<{\n\t\t\t\t\t\t\tproject: {\n\t\t\t\t\t\t\t\tid: string\n\t\t\t\t\t\t\t\tslug: string\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmemberships: Array<{\n\t\t\t\t\t\t\t\trole: string\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t}>\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} | null\n\t\t}\n\t}\n}\n\nexport const loginMutation = `\n\tmutation($email: String!, $password: String!, $expiration: Int) {\n\t\tsignIn(email: $email, password: $password, expiration: $expiration) {\n\t\t\tok\n\t\t\terrors {\n\t\t\t\tendUserMessage\n\t\t\t\tcode\n\t\t\t}\n\t\t\tresult {\n\t\t\t\ttoken\n\t\t\t\tperson {\n\t\t\t\t\tid\n\t\t\t\t\temail\n\t\t\t\t\tidentity {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tprojects {\n\t\t\t\t\t\t\tproject {\n\t\t\t\t\t\t\t\tid\n\t\t\t\t\t\t\t\tslug\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmemberships {\n\t\t\t\t\t\t\t\trole\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n`\n"],"names":[],"mappings":"AA+BO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantApiRelativeUrl.js","sources":["../../../src/tenant/tenantApiRelativeUrl.ts"],"sourcesContent":["export const tenantApiRelativeUrl = '/tenant'\n"],"names":[],"mappings":"AAAO,MAAM,uBAAuB;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const tenantErrorMessages = {
|
|
2
|
+
TOO_WEAK: "Password is too weak.",
|
|
3
|
+
EMAIL_ALREADY_EXISTS: "Email already exists.",
|
|
4
|
+
UNKNOWN_EMAIL: "Unknown email.",
|
|
5
|
+
INVALID_PASSWORD: "Password is invalid.",
|
|
6
|
+
ALREADY_MEMBER: "User is already a member of this project."
|
|
7
|
+
};
|
|
8
|
+
const getTenantErrorMessage = (errorCode) => {
|
|
9
|
+
if (errorCode in tenantErrorMessages) {
|
|
10
|
+
return tenantErrorMessages[errorCode];
|
|
11
|
+
}
|
|
12
|
+
return `Unknown error occurred. [${errorCode}]`;
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
getTenantErrorMessage,
|
|
16
|
+
tenantErrorMessages
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=tenantErrorMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantErrorMessages.js","sources":["../../../src/tenant/tenantErrorMessages.ts"],"sourcesContent":["export const tenantErrorMessages: { [key: string]: string } = {\n\tTOO_WEAK: 'Password is too weak.',\n\tEMAIL_ALREADY_EXISTS: 'Email already exists.',\n\tUNKNOWN_EMAIL: 'Unknown email.',\n\tINVALID_PASSWORD: 'Password is invalid.',\n\tALREADY_MEMBER: 'User is already a member of this project.',\n}\n\nexport const getTenantErrorMessage = (errorCode: string): string => {\n\tif (errorCode in tenantErrorMessages) {\n\t\treturn tenantErrorMessages[errorCode]\n\t}\n\treturn `Unknown error occurred. [${errorCode}]`\n}\n"],"names":[],"mappings":"AAAO,MAAM,sBAAiD;AAAA,EAC7D,UAAU;AAAA,EACV,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,gBAAgB;AACjB;AAEa,MAAA,wBAAwB,CAAC,cAA8B;AACnE,MAAI,aAAa,qBAAqB;AACrC,WAAO,oBAAoB,SAAS;AAAA,EACrC;AACA,SAAO,4BAA4B;AACpC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isEmptyObject.js","sources":["../../../src/utils/isEmptyObject.ts"],"sourcesContent":["export const isEmptyObject = (arg: object): boolean => {\n\t// This is faster than Object.keys(arg).length === 0 && arg.constructor === Object\n\tfor (const key in arg) {\n\t\tif (arg.hasOwnProperty(key)) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"],"names":[],"mappings":"AAAa,MAAA,gBAAgB,CAAC,QAAyB;AAEtD,aAAW,OAAO,KAAK;AAClB,QAAA,IAAI,eAAe,GAAG,GAAG;AACrB,aAAA;AAAA,IACR;AAAA,EACD;AACO,SAAA;AACR;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const readFileAsArrayBuffer = (file) => new Promise((resolve, reject) => {
|
|
2
|
+
const reader = new FileReader();
|
|
3
|
+
reader.onload = () => {
|
|
4
|
+
if (reader.result === null) {
|
|
5
|
+
reject();
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
resolve(reader.result);
|
|
9
|
+
};
|
|
10
|
+
reader.readAsArrayBuffer(file);
|
|
11
|
+
});
|
|
12
|
+
export {
|
|
13
|
+
readFileAsArrayBuffer
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=readFileAsArrayBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readFileAsArrayBuffer.js","sources":["../../../src/utils/readFileAsArrayBuffer.ts"],"sourcesContent":["export const readFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>\n\tnew Promise((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onload = () => {\n\t\t\tif (reader.result === null) {\n\t\t\t\treject()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tresolve(reader.result)\n\t\t}\n\t\treader.readAsArrayBuffer(file)\n\t})\n"],"names":[],"mappings":"AAAO,MAAM,wBAAwB,CAAC,SACrC,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC1B,QAAA,SAAS,IAAI;AACnB,SAAO,SAAS,MAAM;AACjB,QAAA,OAAO,WAAW,MAAM;AACpB;AACP;AAAA,IACD;AACA,YAAQ,OAAO,MAAM;AAAA,EAAA;AAEtB,SAAO,kBAAkB,IAAI;AAC9B,CAAC;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatContentApiRelativeUrl.js","sources":["../../../src/content/formatContentApiRelativeUrl.ts"],"sourcesContent":["export const formatContentApiRelativeUrl = (projectSlug: string, stageSlug: string) =>\n\t`/content/${projectSlug}/${stageSlug}`\n"],"names":[],"mappings":"AAAO,MAAM,8BAA8B,CAAC,aAAqB,cAChE,YAAY,eAAe;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { GraphQlLiteral } from "../../graphQlBuilder/GraphQlLiteral.js";
|
|
2
|
+
const whereToFilter = (by) => {
|
|
3
|
+
const where = {};
|
|
4
|
+
for (const key in by) {
|
|
5
|
+
const value = by[key];
|
|
6
|
+
if (value instanceof GraphQlLiteral || typeof value === "string" || typeof value === "number") {
|
|
7
|
+
where[key] = { eq: value };
|
|
8
|
+
} else {
|
|
9
|
+
where[key] = whereToFilter(value);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return where;
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
whereToFilter
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=whereToFilter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whereToFilter.js","sources":["../../../../src/content/params/whereToFilter.ts"],"sourcesContent":["import type { Input, Writable } from '@contember/schema'\nimport { GraphQlLiteral } from '../../graphQlBuilder'\n\nexport const whereToFilter = (\n\tby: Input.UniqueWhere<GraphQlLiteral>,\n): Input.Where<Input.Condition<Input.ColumnValue<GraphQlLiteral>>> => {\n\tconst where: Writable<Input.Where<Input.Condition<Input.ColumnValue<GraphQlLiteral>>>> = {}\n\tfor (const key in by) {\n\t\tconst value = by[key]\n\n\t\tif (value instanceof GraphQlLiteral || typeof value === 'string' || typeof value === 'number') {\n\t\t\twhere[key] = { eq: value }\n\t\t} else {\n\t\t\twhere[key] = whereToFilter(value)\n\t\t}\n\t}\n\n\treturn where\n}\n"],"names":[],"mappings":";AAGa,MAAA,gBAAgB,CAC5B,OACqE;AACrE,QAAM,QAAmF,CAAA;AACzF,aAAW,OAAO,IAAI;AACf,UAAA,QAAQ,GAAG,GAAG;AAEpB,QAAI,iBAAiB,kBAAkB,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC9F,YAAM,GAAG,IAAI,EAAE,IAAI,MAAM;AAAA,IAAA,OACnB;AACA,YAAA,GAAG,IAAI,cAAc,KAAK;AAAA,IACjC;AAAA,EACD;AAEO,SAAA;AACR;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileUploadError.js","sources":["../../../../src/content/upload/FileUploadError.ts"],"sourcesContent":["export interface FileUploadErrorOptions {\n\tdeveloperMessage?: string\n\tendUserMessage?: string\n}\n\nexport class FileUploadError extends Error {\n\tpublic constructor(public readonly options: FileUploadErrorOptions = {}) {\n\t\tsuper(options.developerMessage)\n\t}\n}\n"],"names":[],"mappings":"AAKO,MAAM,wBAAwB,MAAM;AAAA,EACnC,YAA4B,UAAkC,IAAI;AACxE,UAAM,QAAQ,gBAAgB;AADI,SAAA,UAAA;AAAA,EAEnC;AACD;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
import { ObjectBuilder } from "../../graphQlBuilder/ObjectBuilder.js";
|
|
8
|
+
import { QueryBuilder } from "../../graphQlBuilder/QueryBuilder.js";
|
|
9
|
+
const _GenerateUploadUrlMutationBuilder = class {
|
|
10
|
+
static buildQuery(parameters) {
|
|
11
|
+
return new QueryBuilder().mutation((builder) => {
|
|
12
|
+
for (const alias in parameters) {
|
|
13
|
+
const fileParameters = parameters[alias];
|
|
14
|
+
if (fileParameters.suffix || fileParameters.fileName || fileParameters.extension) {
|
|
15
|
+
builder = builder.object(
|
|
16
|
+
alias,
|
|
17
|
+
_GenerateUploadUrlMutationBuilder.generateUploadUrlFields.argument("input", fileParameters)
|
|
18
|
+
);
|
|
19
|
+
} else {
|
|
20
|
+
builder = builder.object(
|
|
21
|
+
alias,
|
|
22
|
+
_GenerateUploadUrlMutationBuilder.generateUploadUrlFields.argument("contentType", fileParameters.contentType).argument("expiration", fileParameters.expiration).argument("prefix", fileParameters.prefix).argument("acl", fileParameters.acl)
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return builder;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
let GenerateUploadUrlMutationBuilder = _GenerateUploadUrlMutationBuilder;
|
|
31
|
+
__publicField(GenerateUploadUrlMutationBuilder, "generateUploadUrlFields", new ObjectBuilder().name("generateUploadUrl").field("url").field("publicUrl").field("method").object("headers", (builder) => builder.field("key").field("value")));
|
|
32
|
+
export {
|
|
33
|
+
GenerateUploadUrlMutationBuilder
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=GenerateUploadUrlMutationBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenerateUploadUrlMutationBuilder.js","sources":["../../../../src/content/upload/GenerateUploadUrlMutationBuilder.ts"],"sourcesContent":["import { GraphQlLiteral, ObjectBuilder, QueryBuilder } from '../../graphQlBuilder'\n\nclass GenerateUploadUrlMutationBuilder {\n\tprivate static generateUploadUrlFields = new ObjectBuilder()\n\t\t.name('generateUploadUrl')\n\t\t.field('url')\n\t\t.field('publicUrl')\n\t\t.field('method')\n\t\t.object('headers', builder => builder.field('key').field('value'))\n\n\tpublic static buildQuery(parameters: GenerateUploadUrlMutationBuilder.MutationParameters): string {\n\t\treturn new QueryBuilder().mutation(builder => {\n\t\t\tfor (const alias in parameters) {\n\t\t\t\tconst fileParameters = parameters[alias]\n\t\t\t\tif (fileParameters.suffix || fileParameters.fileName || fileParameters.extension) {\n\t\t\t\t\tbuilder = builder.object(\n\t\t\t\t\t\talias,\n\t\t\t\t\t\tGenerateUploadUrlMutationBuilder.generateUploadUrlFields\n\t\t\t\t\t\t\t.argument('input', fileParameters),\n\t\t\t\t\t)\n\t\t\t\t} else {\n\t\t\t\t\t// BC\n\t\t\t\t\tbuilder = builder.object(\n\t\t\t\t\t\talias,\n\t\t\t\t\t\tGenerateUploadUrlMutationBuilder.generateUploadUrlFields\n\t\t\t\t\t\t\t.argument('contentType', fileParameters.contentType)\n\t\t\t\t\t\t\t.argument('expiration', fileParameters.expiration)\n\t\t\t\t\t\t\t.argument('prefix', fileParameters.prefix)\n\t\t\t\t\t\t\t.argument('acl', fileParameters.acl),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn builder\n\t\t})\n\t}\n}\n\nnamespace GenerateUploadUrlMutationBuilder {\n\texport type Acl = GraphQlLiteral<'PUBLIC_READ' | 'PRIVATE' | 'NONE'>;\n\n\texport interface FileParameters {\n\t\tcontentType: string\n\t\texpiration?: number\n\t\tsize?: number\n\t\tprefix?: string\n\t\textension?: string\n\t\tsuffix?: string\n\t\tfileName?: string\n\t\tacl?: Acl\n\t}\n\n\texport interface MutationParameters {\n\t\t[alias: string]: FileParameters\n\t}\n\n\texport interface ResponseBody {\n\t\turl: string\n\t\tpublicUrl: string\n\t\tmethod: string\n\t\theaders: Array<{\n\t\t\tkey: string\n\t\t\tvalue: string\n\t\t}>\n\t}\n\n\texport interface MutationResponse {\n\t\t[alias: string]: ResponseBody\n\t}\n}\n\nexport { GenerateUploadUrlMutationBuilder }\n"],"names":[],"mappings":";;;;;;;;AAEA,MAAM,oCAAN,MAAuC;AAAA,EAQtC,OAAc,WAAW,YAAyE;AACjG,WAAO,IAAI,aAAA,EAAe,SAAS,CAAW,YAAA;AAC7C,iBAAW,SAAS,YAAY;AACzB,cAAA,iBAAiB,WAAW,KAAK;AACvC,YAAI,eAAe,UAAU,eAAe,YAAY,eAAe,WAAW;AACjF,oBAAU,QAAQ;AAAA,YACjB;AAAA,YACA,kCAAiC,wBAC/B,SAAS,SAAS,cAAc;AAAA,UAAA;AAAA,QACnC,OACM;AAEN,oBAAU,QAAQ;AAAA,YACjB;AAAA,YACA,kCAAiC,wBAC/B,SAAS,eAAe,eAAe,WAAW,EAClD,SAAS,cAAc,eAAe,UAAU,EAChD,SAAS,UAAU,eAAe,MAAM,EACxC,SAAS,OAAO,eAAe,GAAG;AAAA,UAAA;AAAA,QAEtC;AAAA,MACD;AAEO,aAAA;AAAA,IAAA,CACP;AAAA,EACF;AACD;AAlCA,IAAM,mCAAN;AACC,cADK,kCACU,2BAA0B,IAAI,cAAc,EACzD,KAAK,mBAAmB,EACxB,MAAM,KAAK,EACX,MAAM,WAAW,EACjB,MAAM,QAAQ,EACd,OAAO,WAAW,CAAA,YAAW,QAAQ,MAAM,KAAK,EAAE,MAAM,OAAO,CAAC;"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
import pLimit from "p-limit";
|
|
8
|
+
import { FileUploadError } from "./FileUploadError.js";
|
|
9
|
+
import { GenerateUploadUrlMutationBuilder } from "./GenerateUploadUrlMutationBuilder.js";
|
|
10
|
+
import { readFileAsArrayBuffer } from "../../utils/readFileAsArrayBuffer.js";
|
|
11
|
+
class S3FileUploader {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
__publicField(this, "uploadState");
|
|
14
|
+
__publicField(this, "generateNewAlias", (() => {
|
|
15
|
+
let alias = 1;
|
|
16
|
+
return () => alias++;
|
|
17
|
+
})());
|
|
18
|
+
this.options = options;
|
|
19
|
+
this.uploadState = /* @__PURE__ */ new WeakMap();
|
|
20
|
+
}
|
|
21
|
+
static formatFullAlias(alias) {
|
|
22
|
+
return `file${alias}`;
|
|
23
|
+
}
|
|
24
|
+
async upload(files, options) {
|
|
25
|
+
const parameters = {};
|
|
26
|
+
for (const [file, metadata] of files) {
|
|
27
|
+
if (this.uploadState.has(file)) {
|
|
28
|
+
const uploadState = this.uploadState.get(file);
|
|
29
|
+
uploadState.request?.abort();
|
|
30
|
+
}
|
|
31
|
+
const alias = this.generateNewAlias();
|
|
32
|
+
this.uploadState.set(file, {
|
|
33
|
+
alias
|
|
34
|
+
});
|
|
35
|
+
const uploadOptions = this.options.getUploadOptions?.(file);
|
|
36
|
+
parameters[S3FileUploader.formatFullAlias(alias)] = {
|
|
37
|
+
contentType: uploadOptions?.fileType ?? file.type,
|
|
38
|
+
prefix: uploadOptions?.filePrefix,
|
|
39
|
+
suffix: uploadOptions?.fileSuffix,
|
|
40
|
+
size: uploadOptions?.fileSize,
|
|
41
|
+
extension: uploadOptions?.fileExtension,
|
|
42
|
+
fileName: uploadOptions?.fileName,
|
|
43
|
+
expiration: uploadOptions?.fileExpiration,
|
|
44
|
+
acl: uploadOptions?.fileAcl
|
|
45
|
+
};
|
|
46
|
+
metadata.abortSignal.addEventListener("abort", () => {
|
|
47
|
+
this.uploadState.get(file)?.request?.abort();
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
const mutation = GenerateUploadUrlMutationBuilder.buildQuery(parameters);
|
|
51
|
+
try {
|
|
52
|
+
const response = await options.contentApiClient.sendRequest(mutation);
|
|
53
|
+
const responseData = response.data;
|
|
54
|
+
const limit = pLimit(this.options.concurrency ?? 5);
|
|
55
|
+
const promises = [];
|
|
56
|
+
for (const [file] of files) {
|
|
57
|
+
promises.push(limit(() => this.uploadSingleFile(file, responseData, options)));
|
|
58
|
+
}
|
|
59
|
+
await Promise.all(promises);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if (error instanceof FileUploadError) {
|
|
62
|
+
const fileUploadError = error;
|
|
63
|
+
options.onError(Array.from(files).map(([file]) => [file, fileUploadError]));
|
|
64
|
+
} else {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
uploadSingleFile(file, responseData, { onProgress, onError, onSuccess }) {
|
|
70
|
+
return new Promise(async (resolve, reject) => {
|
|
71
|
+
const fileState = this.uploadState.get(file);
|
|
72
|
+
const datumBody = responseData[S3FileUploader.formatFullAlias(fileState.alias)];
|
|
73
|
+
const uploadRequestBody = await readFileAsArrayBuffer(file);
|
|
74
|
+
const xhr = new XMLHttpRequest();
|
|
75
|
+
fileState.request = xhr;
|
|
76
|
+
xhr.open(datumBody.method, datumBody.url);
|
|
77
|
+
for (const header of datumBody.headers) {
|
|
78
|
+
xhr.setRequestHeader(header.key, header.value);
|
|
79
|
+
}
|
|
80
|
+
xhr.addEventListener("load", () => {
|
|
81
|
+
const successMetadata = {
|
|
82
|
+
fileUrl: datumBody.publicUrl
|
|
83
|
+
};
|
|
84
|
+
onSuccess([[file, successMetadata]]);
|
|
85
|
+
resolve();
|
|
86
|
+
});
|
|
87
|
+
xhr.addEventListener("error", (e) => {
|
|
88
|
+
onError([file]);
|
|
89
|
+
reject(e);
|
|
90
|
+
});
|
|
91
|
+
xhr.upload?.addEventListener("progress", (e) => {
|
|
92
|
+
onProgress([
|
|
93
|
+
[
|
|
94
|
+
file,
|
|
95
|
+
{
|
|
96
|
+
progress: e.loaded / e.total
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
]);
|
|
100
|
+
});
|
|
101
|
+
xhr.send(uploadRequestBody);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export {
|
|
106
|
+
S3FileUploader
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=S3FileUploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3FileUploader.js","sources":["../../../../src/content/upload/S3FileUploader.ts"],"sourcesContent":["import pLimit from 'p-limit'\nimport { readFileAsArrayBuffer } from '../../utils'\nimport { FileUploadError } from './FileUploadError'\nimport type { FileUploader, FileUploaderInitializeOptions } from './FileUploader'\nimport { GenerateUploadUrlMutationBuilder } from './GenerateUploadUrlMutationBuilder'\nimport type { UploadedFileMetadata } from './UploadedFileMetadata'\n\ninterface S3UploadState {\n\trequest?: XMLHttpRequest\n\talias: number\n}\n\nclass S3FileUploader implements FileUploader<S3FileUploader.SuccessMetadata> {\n\tprivate readonly uploadState: WeakMap<File, S3UploadState>\n\n\tpublic constructor(public readonly options: S3FileUploader.Options = {}) {\n\t\tthis.uploadState = new WeakMap()\n\t}\n\n\tprivate generateNewAlias = (() => {\n\t\tlet alias = 1\n\t\treturn () => alias++\n\t})()\n\n\tprivate static formatFullAlias(alias: number) {\n\t\treturn `file${alias}`\n\t}\n\n\tpublic async upload(\n\t\tfiles: Map<File, UploadedFileMetadata>,\n\t\toptions: FileUploaderInitializeOptions,\n\t) {\n\t\tconst parameters: GenerateUploadUrlMutationBuilder.MutationParameters = {}\n\n\t\tfor (const [file, metadata] of files) {\n\t\t\tif (this.uploadState.has(file)) {\n\t\t\t\tconst uploadState = this.uploadState.get(file)!\n\t\t\t\tuploadState.request?.abort()\n\t\t\t}\n\n\t\t\tconst alias = this.generateNewAlias()\n\t\t\tthis.uploadState.set(file, {\n\t\t\t\talias,\n\t\t\t})\n\n\t\t\tconst uploadOptions = this.options.getUploadOptions?.(file)\n\n\t\t\tparameters[S3FileUploader.formatFullAlias(alias)] = {\n\t\t\t\tcontentType: uploadOptions?.fileType ?? file.type,\n\t\t\t\tprefix: uploadOptions?.filePrefix,\n\t\t\t\tsuffix: uploadOptions?.fileSuffix,\n\t\t\t\tsize: uploadOptions?.fileSize,\n\t\t\t\textension: uploadOptions?.fileExtension,\n\t\t\t\tfileName: uploadOptions?.fileName,\n\t\t\t\texpiration: uploadOptions?.fileExpiration,\n\t\t\t\tacl: uploadOptions?.fileAcl,\n\t\t\t}\n\n\t\t\tmetadata.abortSignal.addEventListener('abort', () => {\n\t\t\t\tthis.uploadState.get(file)?.request?.abort()\n\t\t\t})\n\t\t}\n\n\t\tconst mutation = GenerateUploadUrlMutationBuilder.buildQuery(parameters)\n\t\ttry {\n\t\t\tconst response = await options.contentApiClient.sendRequest<{ data: GenerateUploadUrlMutationBuilder.MutationResponse }>(mutation)\n\t\t\tconst responseData = response.data\n\t\t\tconst limit = pLimit(this.options.concurrency ?? 5)\n\t\t\tconst promises: Promise<void>[] = []\n\t\t\tfor (const [file] of files) {\n\t\t\t\tpromises.push(limit(() => this.uploadSingleFile(file, responseData, options)))\n\t\t\t}\n\t\t\tawait Promise.all(promises)\n\t\t} catch (error) {\n\t\t\tif (error instanceof FileUploadError) {\n\t\t\t\tconst fileUploadError = error\n\t\t\t\toptions.onError(Array.from(files).map(([file]) => [file, fileUploadError]))\n\n\t\t\t} else {\n\t\t\t\tthrow error\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate uploadSingleFile(\n\t\tfile: File,\n\t\tresponseData: GenerateUploadUrlMutationBuilder.MutationResponse,\n\t\t{ onProgress, onError, onSuccess }: FileUploaderInitializeOptions,\n\t) {\n\t\treturn new Promise<void>(async (resolve, reject) => {\n\t\t\tconst fileState = this.uploadState.get(file)!\n\t\t\tconst datumBody = responseData[S3FileUploader.formatFullAlias(fileState.alias)]\n\t\t\tconst uploadRequestBody = await readFileAsArrayBuffer(file)\n\t\t\tconst xhr = new XMLHttpRequest()\n\n\t\t\tfileState.request = xhr\n\n\t\t\txhr.open(datumBody.method, datumBody.url)\n\n\t\t\tfor (const header of datumBody.headers) {\n\t\t\t\txhr.setRequestHeader(header.key, header.value)\n\t\t\t}\n\t\t\txhr.addEventListener('load', () => {\n\t\t\t\tconst successMetadata: S3FileUploader.SuccessMetadata = {\n\t\t\t\t\tfileUrl: datumBody.publicUrl,\n\t\t\t\t}\n\t\t\t\tonSuccess([[file, successMetadata]])\n\t\t\t\tresolve()\n\t\t\t})\n\t\t\txhr.addEventListener('error', e => {\n\t\t\t\tonError([file])\n\t\t\t\treject(e)\n\t\t\t})\n\t\t\txhr.upload?.addEventListener('progress', e => {\n\t\t\t\tonProgress([\n\t\t\t\t\t[\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprogress: e.loaded / e.total,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t])\n\t\t\t})\n\t\t\txhr.send(uploadRequestBody)\n\t\t})\n\t}\n}\n\nnamespace S3FileUploader {\n\texport interface SuccessMetadata {\n\t\tfileUrl: string\n\t}\n\n\texport interface Options {\n\t\tgetUploadOptions?: (file: File) => S3UploadOptions\n\t\tconcurrency?: number\n\t}\n\n\texport interface S3UploadOptions {\n\t\tfileType?: GenerateUploadUrlMutationBuilder.FileParameters['contentType']\n\t\tfileExpiration?: number\n\t\tfileSize?: number\n\t\tfilePrefix?: string\n\t\tfileSuffix?: string\n\t\tfileName?: string\n\t\tfileExtension?: string\n\t\tfileAcl?: GenerateUploadUrlMutationBuilder.Acl\n\t}\n}\n\nexport { S3FileUploader }\n"],"names":[],"mappings":";;;;;;;;;;AAYA,MAAM,eAAuE;AAAA,EAGrE,YAA4B,UAAkC,IAAI;AAFxD;AAMT,6CAAoB,MAAM;AACjC,UAAI,QAAQ;AACZ,aAAO,MAAM;AAAA,IAAA;AANqB,SAAA,UAAA;AAC7B,SAAA,kCAAkB;EACxB;AAAA,EAOA,OAAe,gBAAgB,OAAe;AAC7C,WAAO,OAAO;AAAA,EACf;AAAA,EAEA,MAAa,OACZ,OACA,SACC;AACD,UAAM,aAAkE,CAAA;AAExE,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO;AACrC,UAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC/B,cAAM,cAAc,KAAK,YAAY,IAAI,IAAI;AAC7C,oBAAY,SAAS;MACtB;AAEM,YAAA,QAAQ,KAAK;AACd,WAAA,YAAY,IAAI,MAAM;AAAA,QAC1B;AAAA,MAAA,CACA;AAED,YAAM,gBAAgB,KAAK,QAAQ,mBAAmB,IAAI;AAE1D,iBAAW,eAAe,gBAAgB,KAAK,CAAC,IAAI;AAAA,QACnD,aAAa,eAAe,YAAY,KAAK;AAAA,QAC7C,QAAQ,eAAe;AAAA,QACvB,QAAQ,eAAe;AAAA,QACvB,MAAM,eAAe;AAAA,QACrB,WAAW,eAAe;AAAA,QAC1B,UAAU,eAAe;AAAA,QACzB,YAAY,eAAe;AAAA,QAC3B,KAAK,eAAe;AAAA,MAAA;AAGZ,eAAA,YAAY,iBAAiB,SAAS,MAAM;AACpD,aAAK,YAAY,IAAI,IAAI,GAAG,SAAS;MAAM,CAC3C;AAAA,IACF;AAEM,UAAA,WAAW,iCAAiC,WAAW,UAAU;AACnE,QAAA;AACH,YAAM,WAAW,MAAM,QAAQ,iBAAiB,YAAyE,QAAQ;AACjI,YAAM,eAAe,SAAS;AAC9B,YAAM,QAAQ,OAAO,KAAK,QAAQ,eAAe,CAAC;AAClD,YAAM,WAA4B,CAAA;AACvB,iBAAA,CAAC,IAAI,KAAK,OAAO;AAClB,iBAAA,KAAK,MAAM,MAAM,KAAK,iBAAiB,MAAM,cAAc,OAAO,CAAC,CAAC;AAAA,MAC9E;AACM,YAAA,QAAQ,IAAI,QAAQ;AAAA,aAClB;AACR,UAAI,iBAAiB,iBAAiB;AACrC,cAAM,kBAAkB;AACxB,gBAAQ,QAAQ,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,eAAe,CAAC,CAAC;AAAA,MAAA,OAEpE;AACA,cAAA;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,iBACP,MACA,cACA,EAAE,YAAY,SAAS,aACtB;AACD,WAAO,IAAI,QAAc,OAAO,SAAS,WAAW;AACnD,YAAM,YAAY,KAAK,YAAY,IAAI,IAAI;AAC3C,YAAM,YAAY,aAAa,eAAe,gBAAgB,UAAU,KAAK,CAAC;AACxE,YAAA,oBAAoB,MAAM,sBAAsB,IAAI;AACpD,YAAA,MAAM,IAAI;AAEhB,gBAAU,UAAU;AAEpB,UAAI,KAAK,UAAU,QAAQ,UAAU,GAAG;AAE7B,iBAAA,UAAU,UAAU,SAAS;AACvC,YAAI,iBAAiB,OAAO,KAAK,OAAO,KAAK;AAAA,MAC9C;AACI,UAAA,iBAAiB,QAAQ,MAAM;AAClC,cAAM,kBAAkD;AAAA,UACvD,SAAS,UAAU;AAAA,QAAA;AAEpB,kBAAU,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC;AAC3B;MAAA,CACR;AACG,UAAA,iBAAiB,SAAS,CAAK,MAAA;AAC1B,gBAAA,CAAC,IAAI,CAAC;AACd,eAAO,CAAC;AAAA,MAAA,CACR;AACG,UAAA,QAAQ,iBAAiB,YAAY,CAAK,MAAA;AAClC,mBAAA;AAAA,UACV;AAAA,YACC;AAAA,YACA;AAAA,cACC,UAAU,EAAE,SAAS,EAAE;AAAA,YACxB;AAAA,UACD;AAAA,QAAA,CACA;AAAA,MAAA,CACD;AACD,UAAI,KAAK,iBAAiB;AAAA,IAAA,CAC1B;AAAA,EACF;AACD;"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { CrudQueryBuilderError } from "./CrudQueryBuilderError.js";
|
|
2
|
+
import { ReadBuilder } from "./ReadBuilder.js";
|
|
3
|
+
import { WriteBuilder } from "./WriteBuilder.js";
|
|
4
|
+
import { RootObjectBuilder } from "../graphQlBuilder/RootObjectBuilder.js";
|
|
5
|
+
import { QueryBuilder } from "../graphQlBuilder/QueryBuilder.js";
|
|
6
|
+
import { isEmptyObject } from "../utils/isEmptyObject.js";
|
|
7
|
+
import { ObjectBuilder } from "../graphQlBuilder/ObjectBuilder.js";
|
|
8
|
+
class CrudQueryBuilder {
|
|
9
|
+
constructor(type = void 0, rootObjectBuilder = new RootObjectBuilder()) {
|
|
10
|
+
this.type = type;
|
|
11
|
+
this.rootObjectBuilder = rootObjectBuilder;
|
|
12
|
+
}
|
|
13
|
+
fragment(name, typeName, query) {
|
|
14
|
+
const readBuilder = ReadBuilder.instantiateFromFactory(query);
|
|
15
|
+
const objectBuilder = readBuilder.objectBuilder.name(typeName);
|
|
16
|
+
return new CrudQueryBuilder(this.type, this.rootObjectBuilder.fragment(name, objectBuilder));
|
|
17
|
+
}
|
|
18
|
+
list(name, query, alias) {
|
|
19
|
+
if (this.type === "mutation") {
|
|
20
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
21
|
+
}
|
|
22
|
+
name = `list${name}`;
|
|
23
|
+
query = ReadBuilder.instantiateFromFactory(query);
|
|
24
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
25
|
+
return new CrudQueryBuilder("query", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
26
|
+
}
|
|
27
|
+
paginate(name, query, alias) {
|
|
28
|
+
if (this.type === "mutation") {
|
|
29
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
30
|
+
}
|
|
31
|
+
name = `paginate${name}`;
|
|
32
|
+
query = ReadBuilder.instantiateFromFactory(query);
|
|
33
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
34
|
+
return new CrudQueryBuilder("query", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
35
|
+
}
|
|
36
|
+
get(name, query, alias) {
|
|
37
|
+
if (this.type === "mutation") {
|
|
38
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
39
|
+
}
|
|
40
|
+
name = `get${name}`;
|
|
41
|
+
query = ReadBuilder.instantiateFromFactory(query);
|
|
42
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
43
|
+
return new CrudQueryBuilder("query", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
44
|
+
}
|
|
45
|
+
update(name, query, alias) {
|
|
46
|
+
if (this.type === "query") {
|
|
47
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
48
|
+
}
|
|
49
|
+
name = `update${name}`;
|
|
50
|
+
query = WriteBuilder.instantiateFromFactory(query);
|
|
51
|
+
if (isEmptyObject(query.objectBuilder.args.data)) {
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
55
|
+
return new CrudQueryBuilder("mutation", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
56
|
+
}
|
|
57
|
+
create(name, query, alias) {
|
|
58
|
+
if (this.type === "query") {
|
|
59
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
60
|
+
}
|
|
61
|
+
name = `create${name}`;
|
|
62
|
+
query = WriteBuilder.instantiateFromFactory(query);
|
|
63
|
+
if (isEmptyObject(query.objectBuilder.args.data)) {
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
67
|
+
return new CrudQueryBuilder("mutation", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
68
|
+
}
|
|
69
|
+
delete(name, query, alias) {
|
|
70
|
+
if (this.type === "query") {
|
|
71
|
+
throw new CrudQueryBuilderError("Cannot combine queries and mutations");
|
|
72
|
+
}
|
|
73
|
+
name = `delete${name}`;
|
|
74
|
+
query = WriteBuilder.instantiateFromFactory(query);
|
|
75
|
+
const [objectName, objectBuilder] = typeof alias === "string" ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder];
|
|
76
|
+
return new CrudQueryBuilder("mutation", this.rootObjectBuilder.object(objectName, objectBuilder));
|
|
77
|
+
}
|
|
78
|
+
inTransaction(alias = "transaction", options = {}) {
|
|
79
|
+
const objectBuilder = new ObjectBuilder(
|
|
80
|
+
["ok", "errorMessage"],
|
|
81
|
+
{ ...this.rootObjectBuilder.objects },
|
|
82
|
+
{ options },
|
|
83
|
+
void 0,
|
|
84
|
+
void 0,
|
|
85
|
+
"transaction"
|
|
86
|
+
);
|
|
87
|
+
return new CrudQueryBuilder(this.type, new RootObjectBuilder({ [alias]: objectBuilder }, this.rootObjectBuilder.fragmentDefinitions));
|
|
88
|
+
}
|
|
89
|
+
getGql() {
|
|
90
|
+
const builder = new QueryBuilder();
|
|
91
|
+
switch (this.type) {
|
|
92
|
+
case "mutation":
|
|
93
|
+
return builder.mutation(this.rootObjectBuilder);
|
|
94
|
+
case "query":
|
|
95
|
+
return builder.query(this.rootObjectBuilder);
|
|
96
|
+
default:
|
|
97
|
+
throw new CrudQueryBuilderError(`Invalid type ${this.type}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
CrudQueryBuilder
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=CrudQueryBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrudQueryBuilder.js","sources":["../../../src/crudQueryBuilder/CrudQueryBuilder.ts"],"sourcesContent":["import { ObjectBuilder, QueryBuilder, RootObjectBuilder } from '../graphQlBuilder'\nimport { isEmptyObject } from '../utils'\nimport { CrudQueryBuilderError } from './CrudQueryBuilderError'\nimport { ReadBuilder } from './ReadBuilder'\nimport type {\n\tCreateMutationArguments,\n\tCreateMutationFields,\n\tDeleteMutationArguments,\n\tDeleteMutationFields,\n\tGetQueryArguments,\n\tListQueryArguments,\n\tMutations,\n\tPaginateQueryArguments,\n\tQueries,\n\tUpdateMutationArguments,\n\tUpdateMutationFields,\n\tWriteOperation,\n} from './types'\nimport { WriteBuilder } from './WriteBuilder'\n\nexport class CrudQueryBuilder {\n\tconstructor(\n\t\tprivate type: undefined | 'query' | 'mutation' = undefined,\n\t\tprivate rootObjectBuilder: RootObjectBuilder = new RootObjectBuilder(),\n\t) {}\n\n\tpublic fragment(name: string, typeName: string, query: ReadBuilder.BuilderFactory<never>): CrudQueryBuilder {\n\t\tconst readBuilder = ReadBuilder.instantiateFromFactory(query)\n\t\tconst objectBuilder = readBuilder.objectBuilder.name(typeName)\n\n\t\treturn new CrudQueryBuilder(this.type, this.rootObjectBuilder.fragment(name, objectBuilder))\n\t}\n\n\tpublic list(\n\t\tname: string,\n\t\tquery: ReadBuilder.BuilderFactory<ListQueryArguments>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Mutations> {\n\t\tif (this.type === 'mutation') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `list${name}`\n\t\tquery = ReadBuilder.instantiateFromFactory(query)\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('query', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic paginate(\n\t\tname: string,\n\t\tquery: ReadBuilder.BuilderFactory<PaginateQueryArguments>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Mutations> {\n\t\tif (this.type === 'mutation') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `paginate${name}`\n\t\tquery = ReadBuilder.instantiateFromFactory(query)\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('query', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic get(\n\t\tname: string,\n\t\tquery: ReadBuilder.BuilderFactory<GetQueryArguments>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Mutations> {\n\t\tif (this.type === 'mutation') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `get${name}`\n\t\tquery = ReadBuilder.instantiateFromFactory(query)\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('query', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic update(\n\t\tname: string,\n\t\tquery: WriteBuilder.BuilderFactory<UpdateMutationArguments, UpdateMutationFields, WriteOperation.Update>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Queries> {\n\t\tif (this.type === 'query') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `update${name}`\n\t\tquery = WriteBuilder.instantiateFromFactory(query)\n\n\t\tif (isEmptyObject(query.objectBuilder.args.data)) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('mutation', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic create(\n\t\tname: string,\n\t\tquery: WriteBuilder.BuilderFactory<CreateMutationArguments, CreateMutationFields, WriteOperation.Create>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Queries> {\n\t\tif (this.type === 'query') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `create${name}`\n\t\tquery = WriteBuilder.instantiateFromFactory(query)\n\n\t\tif (isEmptyObject(query.objectBuilder.args.data)) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('mutation', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic delete(\n\t\tname: string,\n\t\tquery: WriteBuilder.BuilderFactory<DeleteMutationArguments, DeleteMutationFields, WriteOperation.Delete>,\n\t\talias?: string,\n\t): Omit<CrudQueryBuilder, Queries> {\n\t\tif (this.type === 'query') {\n\t\t\tthrow new CrudQueryBuilderError('Cannot combine queries and mutations')\n\t\t}\n\t\tname = `delete${name}`\n\t\tquery = WriteBuilder.instantiateFromFactory(query)\n\n\t\tconst [objectName, objectBuilder] =\n\t\t\ttypeof alias === 'string' ? [alias, query.objectBuilder.name(name)] : [name, query.objectBuilder]\n\n\t\treturn new CrudQueryBuilder('mutation', this.rootObjectBuilder.object(objectName, objectBuilder))\n\t}\n\n\tpublic inTransaction(alias: string = 'transaction', options: { deferForeignKeyConstraints?: boolean } = {}): CrudQueryBuilder {\n\t\tconst objectBuilder = new ObjectBuilder(\n\t\t\t['ok', 'errorMessage'],\n\t\t\t{ ...this.rootObjectBuilder.objects },\n\t\t\t{ options },\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t'transaction',\n\t\t)\n\n\t\treturn new CrudQueryBuilder(this.type, new RootObjectBuilder({ [alias]: objectBuilder }, this.rootObjectBuilder.fragmentDefinitions))\n\t}\n\n\tgetGql(): string {\n\t\tconst builder = new QueryBuilder()\n\t\tswitch (this.type) {\n\t\t\tcase 'mutation':\n\t\t\t\treturn builder.mutation(this.rootObjectBuilder)\n\t\t\tcase 'query':\n\t\t\t\treturn builder.query(this.rootObjectBuilder)\n\t\t\tdefault:\n\t\t\t\tthrow new CrudQueryBuilderError(`Invalid type ${this.type}`)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrudQueryBuilderError.js","sources":["../../../src/crudQueryBuilder/CrudQueryBuilderError.ts"],"sourcesContent":["export class CrudQueryBuilderError extends Error {}\n"],"names":[],"mappings":"AAAO,MAAM,8BAA8B,MAAM;AAAC;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class ErrorsRelationBuilder {
|
|
2
|
+
static errorsRelation(objectBuilder) {
|
|
3
|
+
return objectBuilder.object(
|
|
4
|
+
"errors",
|
|
5
|
+
(builder) => builder.field("type").field("message").object(
|
|
6
|
+
"path",
|
|
7
|
+
(builder2) => builder2.inlineFragment("_FieldPathFragment", (builder3) => builder3.field("field")).inlineFragment("_IndexPathFragment", (builder3) => builder3.field("index").field("alias"))
|
|
8
|
+
)
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export {
|
|
13
|
+
ErrorsRelationBuilder
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=ErrorsRelationBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorsRelationBuilder.js","sources":["../../../src/crudQueryBuilder/ErrorsRelationBuilder.ts"],"sourcesContent":["import type { ObjectBuilder } from '../graphQlBuilder'\n\nexport class ErrorsRelationBuilder {\n\tpublic static errorsRelation(objectBuilder: ObjectBuilder): ObjectBuilder {\n\t\treturn objectBuilder.object('errors', builder =>\n\t\t\tbuilder\n\t\t\t\t.field('type')\n\t\t\t\t.field('message')\n\t\t\t\t.object('path', builder =>\n\t\t\t\t\tbuilder\n\t\t\t\t\t\t.inlineFragment('_FieldPathFragment', builder => builder.field('field'))\n\t\t\t\t\t\t.inlineFragment('_IndexPathFragment', builder => builder.field('index').field('alias')),\n\t\t\t\t),\n\t\t)\n\t}\n}\n"],"names":["builder"],"mappings":"AAEO,MAAM,sBAAsB;AAAA,EAClC,OAAc,eAAe,eAA6C;AACzE,WAAO,cAAc;AAAA,MAAO;AAAA,MAAU,aACrC,QACE,MAAM,MAAM,EACZ,MAAM,SAAS,EACf;AAAA,QAAO;AAAA,QAAQ,CAAAA,aACfA,SACE,eAAe,sBAAsB,CAAAA,aAAWA,SAAQ,MAAM,OAAO,CAAC,EACtE,eAAe,sBAAsB,CAAAA,aAAWA,SAAQ,MAAM,OAAO,EAAE,MAAM,OAAO,CAAC;AAAA,MACxF;AAAA,IAAA;AAAA,EAEH;AACD;"}
|