@contember/client 1.0.0-rc.2 → 1.0.0-rc.4
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/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 +30 -0
- package/dist/types/content/upload/GenerateUploadUrlMutationBuilder.d.ts.map +1 -0
- package/dist/types/content/upload/S3FileUploader.d.ts +26 -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 +10 -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 +4 -5
- 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 +58 -0
- package/src/content/upload/S3FileUploader.ts +121 -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 +160 -0
- package/src/crudQueryBuilder/CrudQueryBuilderError.ts +1 -0
- package/src/crudQueryBuilder/ErrorsRelationBuilder.ts +17 -0
- package/src/crudQueryBuilder/ReadBuilder.ts +106 -0
- package/src/crudQueryBuilder/ValidationRelationBuilder.ts +18 -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 +11 -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
- package/dist/client.d.ts +0 -716
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { GraphQlLiteral } from './GraphQlLiteral'
|
|
2
|
+
import type { ObjectBuilder } from './ObjectBuilder'
|
|
3
|
+
import type { RootObjectBuilder } from './RootObjectBuilder'
|
|
4
|
+
|
|
5
|
+
export class QueryCompiler {
|
|
6
|
+
constructor(private operation: 'query' | 'mutation', private builder: RootObjectBuilder) {}
|
|
7
|
+
|
|
8
|
+
public create(): string {
|
|
9
|
+
const rootObjects = this.formatRootObjects(this.builder.objects)
|
|
10
|
+
const fragmentDefinitions = this.formatFragmentDefinitions(this.builder.fragmentDefinitions)
|
|
11
|
+
|
|
12
|
+
return `${this.operation} {\n${rootObjects}\n}${fragmentDefinitions ? `\n${fragmentDefinitions}` : ''}`
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private formatFragmentDefinitions(fragments: RootObjectBuilder['fragmentDefinitions']): string {
|
|
16
|
+
const lines: string[] = []
|
|
17
|
+
|
|
18
|
+
for (const name in fragments) {
|
|
19
|
+
const object = fragments[name]
|
|
20
|
+
|
|
21
|
+
lines.push(`fragment ${name} on ${object.objectName!} {`)
|
|
22
|
+
lines.push(...this.formatObjectBody(object))
|
|
23
|
+
lines.push('}')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return lines.join('\n')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private formatRootObjects(objects: RootObjectBuilder['objects']): string {
|
|
30
|
+
const lines: string[] = []
|
|
31
|
+
|
|
32
|
+
for (const alias in objects) {
|
|
33
|
+
lines.push(...this.formatObject(alias, objects[alias]).map(val => `\t${val}`))
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return lines.join('\n')
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private formatObject(alias: string, builder: ObjectBuilder): string[] {
|
|
40
|
+
const result = []
|
|
41
|
+
|
|
42
|
+
result.push(`${alias}${builder.objectName ? `: ${builder.objectName}` : ''}${this.formatArgs(builder.args, 0)} {`)
|
|
43
|
+
|
|
44
|
+
result.push(...this.formatObjectBody(builder))
|
|
45
|
+
|
|
46
|
+
result.push('}')
|
|
47
|
+
|
|
48
|
+
return result
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private formatObjectBody(builder: ObjectBuilder): string[] {
|
|
52
|
+
const result = []
|
|
53
|
+
for (const fieldName of builder.fields) {
|
|
54
|
+
result.push(fieldName)
|
|
55
|
+
}
|
|
56
|
+
for (const fragmentName of builder.fragmentApplications) {
|
|
57
|
+
result.push(`... ${fragmentName}`)
|
|
58
|
+
}
|
|
59
|
+
for (const typeName in builder.inlineFragments) {
|
|
60
|
+
const fragment = builder.inlineFragments[typeName]
|
|
61
|
+
result.push(`... on ${typeName} {`, ...this.formatObjectBody(fragment), '}')
|
|
62
|
+
}
|
|
63
|
+
for (const alias in builder.objects) {
|
|
64
|
+
result.push(...this.formatObject(alias, builder.objects[alias]))
|
|
65
|
+
}
|
|
66
|
+
return result.map(val => `\t${val}`)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private formatArgs(args: any, level: number): string {
|
|
70
|
+
if (args === null) {
|
|
71
|
+
return 'null'
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (typeof args === 'number') {
|
|
75
|
+
return args.toString()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (typeof args === 'boolean') {
|
|
79
|
+
return args ? 'true' : 'false'
|
|
80
|
+
}
|
|
81
|
+
if (typeof args === 'string') {
|
|
82
|
+
return JSON.stringify(args)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (Array.isArray(args)) {
|
|
86
|
+
const vals = args.map(val => this.formatArgs(val, level + 1))
|
|
87
|
+
return `[${vals.join(', ')}]`
|
|
88
|
+
}
|
|
89
|
+
if (args instanceof GraphQlLiteral) {
|
|
90
|
+
return args.value
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (typeof args === 'object') {
|
|
94
|
+
let result = ''
|
|
95
|
+
for (let key in args) {
|
|
96
|
+
const argValue = args[key]
|
|
97
|
+
if (argValue === undefined) {
|
|
98
|
+
continue
|
|
99
|
+
}
|
|
100
|
+
result += `${key}: ${this.formatArgs(argValue, level + 1)}, `
|
|
101
|
+
}
|
|
102
|
+
if (result.length > 0) {
|
|
103
|
+
result = result.substring(0, result.length - 2)
|
|
104
|
+
}
|
|
105
|
+
if (level > 0) {
|
|
106
|
+
return `{${result}}`
|
|
107
|
+
} else if (result.length > 0) {
|
|
108
|
+
return `(${result})`
|
|
109
|
+
}
|
|
110
|
+
return ''
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
throw new Error(typeof args)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isEmptyObject } from '../utils'
|
|
2
|
+
import { GraphQlBuilderError } from './GraphQlBuilderError'
|
|
3
|
+
import { ObjectBuilder } from './ObjectBuilder'
|
|
4
|
+
|
|
5
|
+
export class RootObjectBuilder {
|
|
6
|
+
constructor(
|
|
7
|
+
public readonly objects: { [name: string]: ObjectBuilder } = {},
|
|
8
|
+
public readonly fragmentDefinitions: { [name: string]: ObjectBuilder } = {},
|
|
9
|
+
) {}
|
|
10
|
+
|
|
11
|
+
public fragment(
|
|
12
|
+
name: string,
|
|
13
|
+
builder: ((builder: ObjectBuilder) => ObjectBuilder) | ObjectBuilder,
|
|
14
|
+
): RootObjectBuilder {
|
|
15
|
+
if (!(builder instanceof ObjectBuilder)) {
|
|
16
|
+
builder = builder(new ObjectBuilder())
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!isEmptyObject(builder.args)) {
|
|
20
|
+
throw new GraphQlBuilderError(`Cannot supply args to Graph QL fragments!`)
|
|
21
|
+
}
|
|
22
|
+
if (!builder.objectName) {
|
|
23
|
+
throw new GraphQlBuilderError(`Object names are mandatory for Graph QL fragments!`)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return new RootObjectBuilder(this.objects, { ...this.fragmentDefinitions, [name]: builder })
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public object(name: string, builder: ((builder: ObjectBuilder) => ObjectBuilder) | ObjectBuilder): RootObjectBuilder {
|
|
30
|
+
if (!(builder instanceof ObjectBuilder)) {
|
|
31
|
+
builder = builder(new ObjectBuilder())
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return new RootObjectBuilder({ ...this.objects, [name]: builder }, this.fragmentDefinitions)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface GraphQlClientRequestOptions {
|
|
2
|
+
variables?: GraphQlClientVariables
|
|
3
|
+
apiTokenOverride?: string
|
|
4
|
+
signal?: AbortSignal
|
|
5
|
+
headers?: Record<string, string>
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface GraphQlClientVariables {
|
|
9
|
+
[name: string]: any
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type GraphQlClientFailedRequestMetadata = Pick<Response, 'status' | 'statusText'> & {
|
|
13
|
+
responseText: string
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class GraphQlClient {
|
|
17
|
+
constructor(public readonly apiUrl: string, private readonly apiToken?: string) {}
|
|
18
|
+
|
|
19
|
+
async sendRequest<T = any>(
|
|
20
|
+
query: string,
|
|
21
|
+
{ apiTokenOverride, signal, variables, headers }: GraphQlClientRequestOptions = {},
|
|
22
|
+
): Promise<T> {
|
|
23
|
+
const resolvedHeaders: Record<string, string> = { 'Content-Type': 'application/json', ...headers }
|
|
24
|
+
const resolvedToken = apiTokenOverride ?? this.apiToken
|
|
25
|
+
|
|
26
|
+
if (resolvedToken !== undefined) {
|
|
27
|
+
resolvedHeaders['Authorization'] = `Bearer ${resolvedToken}`
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.debug(query)
|
|
31
|
+
|
|
32
|
+
const response = await fetch(this.apiUrl, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: resolvedHeaders,
|
|
35
|
+
signal,
|
|
36
|
+
body: JSON.stringify({ query, variables }),
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
if (response.ok) {
|
|
40
|
+
// It may still have errors (e.g. unfilled fields) but as far as the request goes, it is ok.
|
|
41
|
+
return await response.json()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const failedRequest: GraphQlClientFailedRequestMetadata = {
|
|
45
|
+
status: response.status,
|
|
46
|
+
statusText: response.statusText,
|
|
47
|
+
responseText: await response.text(),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return Promise.reject(failedRequest)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './GraphQlClient'
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as CrudQueryBuilder from './crudQueryBuilder'
|
|
2
|
+
import * as GraphQlBuilder from './graphQlBuilder'
|
|
3
|
+
|
|
4
|
+
export { GraphQlLiteral } from './graphQlBuilder'
|
|
5
|
+
export { GraphQlBuilder, CrudQueryBuilder }
|
|
6
|
+
export * from './content'
|
|
7
|
+
export * from './graphQlClient'
|
|
8
|
+
export * from './system'
|
|
9
|
+
export * from './tenant'
|
|
10
|
+
|
|
11
|
+
export type { Input, Value, Result } from '@contember/schema'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const formatSystemApiRelativeUrl = (projectSlug: string) => `/system/${projectSlug}`
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface LoginMutationResponse {
|
|
2
|
+
data: {
|
|
3
|
+
signIn: {
|
|
4
|
+
ok: boolean
|
|
5
|
+
errors: Array<{
|
|
6
|
+
endUserMessage: string | null
|
|
7
|
+
code: string
|
|
8
|
+
}>
|
|
9
|
+
result: {
|
|
10
|
+
token: string
|
|
11
|
+
person: {
|
|
12
|
+
id: string
|
|
13
|
+
email: string
|
|
14
|
+
identity: {
|
|
15
|
+
id: string
|
|
16
|
+
projects: Array<{
|
|
17
|
+
project: {
|
|
18
|
+
id: string
|
|
19
|
+
slug: string
|
|
20
|
+
}
|
|
21
|
+
memberships: Array<{
|
|
22
|
+
role: string
|
|
23
|
+
}>
|
|
24
|
+
}>
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
} | null
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const loginMutation = `
|
|
33
|
+
mutation($email: String!, $password: String!, $expiration: Int) {
|
|
34
|
+
signIn(email: $email, password: $password, expiration: $expiration) {
|
|
35
|
+
ok
|
|
36
|
+
errors {
|
|
37
|
+
endUserMessage
|
|
38
|
+
code
|
|
39
|
+
}
|
|
40
|
+
result {
|
|
41
|
+
token
|
|
42
|
+
person {
|
|
43
|
+
id
|
|
44
|
+
email
|
|
45
|
+
identity {
|
|
46
|
+
id
|
|
47
|
+
projects {
|
|
48
|
+
project {
|
|
49
|
+
id
|
|
50
|
+
slug
|
|
51
|
+
}
|
|
52
|
+
memberships {
|
|
53
|
+
role
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const tenantApiRelativeUrl = '/tenant'
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const tenantErrorMessages: { [key: string]: string } = {
|
|
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
|
+
|
|
9
|
+
export const getTenantErrorMessage = (errorCode: string): string => {
|
|
10
|
+
if (errorCode in tenantErrorMessages) {
|
|
11
|
+
return tenantErrorMessages[errorCode]
|
|
12
|
+
}
|
|
13
|
+
return `Unknown error occurred. [${errorCode}]`
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const readFileAsArrayBuffer = (file: File): Promise<string | ArrayBuffer> =>
|
|
2
|
+
new Promise((resolve, reject) => {
|
|
3
|
+
const reader = new FileReader()
|
|
4
|
+
reader.onload = () => {
|
|
5
|
+
if (reader.result === null) {
|
|
6
|
+
reject()
|
|
7
|
+
return
|
|
8
|
+
}
|
|
9
|
+
resolve(reader.result)
|
|
10
|
+
}
|
|
11
|
+
reader.readAsArrayBuffer(file)
|
|
12
|
+
})
|