@awell-health/awell-extensions 1.0.192 → 1.0.194
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/extensions/icd/actions/tfu/config/fields.js +1 -1
- package/dist/extensions/icd/actions/tfu/config/fields.js.map +1 -1
- package/dist/extensions/icd/index.js +2 -2
- package/dist/extensions/icd/index.js.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/markdown.json +4 -0
- package/dist/extensions/textline/actions/getMessages/config/dataPoints.d.ts +14 -0
- package/dist/extensions/textline/actions/getMessages/config/dataPoints.js +18 -0
- package/dist/extensions/textline/actions/getMessages/config/dataPoints.js.map +1 -0
- package/dist/extensions/textline/actions/getMessages/config/fields.d.ts +19 -0
- package/dist/extensions/textline/actions/getMessages/config/fields.js +20 -0
- package/dist/extensions/textline/actions/getMessages/config/fields.js.map +1 -0
- package/dist/extensions/textline/actions/getMessages/config/index.d.ts +2 -0
- package/dist/extensions/textline/actions/getMessages/config/index.js +9 -0
- package/dist/extensions/textline/actions/getMessages/config/index.js.map +1 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.d.ts +4 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.js +96 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.js.map +1 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.test.d.ts +1 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.test.js +75 -0
- package/dist/extensions/textline/actions/getMessages/getMessages.test.js.map +1 -0
- package/dist/extensions/textline/actions/getMessages/index.d.ts +1 -0
- package/dist/extensions/textline/actions/getMessages/index.js +6 -0
- package/dist/extensions/textline/actions/getMessages/index.js.map +1 -0
- package/dist/extensions/textline/actions/index.d.ts +73 -0
- package/dist/extensions/textline/actions/index.js +10 -0
- package/dist/extensions/textline/actions/index.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/config/dataPoints.d.ts +6 -0
- package/dist/extensions/textline/actions/sendSms/config/dataPoints.js +10 -0
- package/dist/extensions/textline/actions/sendSms/config/dataPoints.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/config/fields.d.ts +31 -0
- package/dist/extensions/textline/actions/sendSms/config/fields.js +29 -0
- package/dist/extensions/textline/actions/sendSms/config/fields.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/config/index.d.ts +2 -0
- package/dist/extensions/textline/actions/sendSms/config/index.js +9 -0
- package/dist/extensions/textline/actions/sendSms/config/index.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/index.d.ts +1 -0
- package/dist/extensions/textline/actions/sendSms/index.js +6 -0
- package/dist/extensions/textline/actions/sendSms/index.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.d.ts +4 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.js +72 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.js.map +1 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.test.d.ts +1 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.test.js +64 -0
- package/dist/extensions/textline/actions/sendSms/sendSms.test.js.map +1 -0
- package/dist/extensions/textline/client/schema.d.ts +161 -0
- package/dist/extensions/textline/client/schema.js +22 -0
- package/dist/extensions/textline/client/schema.js.map +1 -0
- package/dist/extensions/textline/client/textLineApi.d.ts +13 -0
- package/dist/extensions/textline/client/textLineApi.js +93 -0
- package/dist/extensions/textline/client/textLineApi.js.map +1 -0
- package/dist/extensions/textline/index.d.ts +2 -0
- package/dist/extensions/textline/index.js +19 -0
- package/dist/extensions/textline/index.js.map +1 -0
- package/dist/extensions/textline/settings.d.ts +37 -0
- package/dist/extensions/textline/settings.js +33 -0
- package/dist/extensions/textline/settings.js.map +1 -0
- package/dist/extensions/textline/validation.d.ts +2 -0
- package/dist/extensions/textline/validation.js +9 -0
- package/dist/extensions/textline/validation.js.map +1 -0
- package/package.json +1 -1
@@ -0,0 +1,72 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.sendSms = void 0;
|
7
|
+
const zod_1 = require("zod");
|
8
|
+
const zod_validation_error_1 = require("zod-validation-error");
|
9
|
+
const settings_1 = require("../../settings");
|
10
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
11
|
+
const config_1 = require("./config");
|
12
|
+
const textLineApi_1 = __importDefault(require("../../client/textLineApi"));
|
13
|
+
exports.sendSms = {
|
14
|
+
key: 'sendSms',
|
15
|
+
title: 'Send SMS (with from number)',
|
16
|
+
description: 'Send a text message from a given telephone number to a recipient of your choice.',
|
17
|
+
category: extensions_core_1.Category.COMMUNICATION,
|
18
|
+
fields: config_1.fields,
|
19
|
+
previewable: true,
|
20
|
+
dataPoints: config_1.dataPoints,
|
21
|
+
onActivityCreated: async (payload, onComplete, onError) => {
|
22
|
+
try {
|
23
|
+
const { settings: { email, password, apiKey }, fields: { recipient, message }, } = (0, extensions_core_1.validate)({
|
24
|
+
schema: zod_1.z.object({
|
25
|
+
settings: settings_1.SettingsValidationSchema,
|
26
|
+
fields: config_1.FieldsValidationSchema,
|
27
|
+
}),
|
28
|
+
payload,
|
29
|
+
});
|
30
|
+
const textLineApi = new textLineApi_1.default(email, password, apiKey);
|
31
|
+
const response = await textLineApi.sendMessage(recipient, message);
|
32
|
+
await onComplete({
|
33
|
+
data_points: {
|
34
|
+
conversationId: response.post.conversation_uuid,
|
35
|
+
},
|
36
|
+
});
|
37
|
+
}
|
38
|
+
catch (err) {
|
39
|
+
if (err instanceof zod_1.ZodError) {
|
40
|
+
const error = (0, zod_validation_error_1.fromZodError)(err);
|
41
|
+
await onError({
|
42
|
+
events: [
|
43
|
+
{
|
44
|
+
date: new Date().toISOString(),
|
45
|
+
text: { en: error.message },
|
46
|
+
error: {
|
47
|
+
category: 'BAD_REQUEST',
|
48
|
+
message: error.message,
|
49
|
+
},
|
50
|
+
},
|
51
|
+
],
|
52
|
+
});
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
const message = err.message;
|
56
|
+
await onError({
|
57
|
+
events: [
|
58
|
+
{
|
59
|
+
date: new Date().toISOString(),
|
60
|
+
text: { en: message },
|
61
|
+
error: {
|
62
|
+
category: 'SERVER_ERROR',
|
63
|
+
message,
|
64
|
+
},
|
65
|
+
},
|
66
|
+
],
|
67
|
+
});
|
68
|
+
}
|
69
|
+
}
|
70
|
+
},
|
71
|
+
};
|
72
|
+
//# sourceMappingURL=sendSms.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sendSms.js","sourceRoot":"","sources":["../../../../../extensions/textline/actions/sendSms/sendSms.ts"],"names":[],"mappings":";;;;;;AAAA,6BAAiC;AACjC,+DAAmD;AAEnD,6CAAwE;AACxE,mEAAkE;AAClE,qCAAqE;AACrE,2EAAkD;AAGrC,QAAA,OAAO,GAA2C;IAC7D,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,kFAAkF;IACpF,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAN,eAAM;IACN,WAAW,EAAE,IAAI;IACjB,UAAU,EAAV,mBAAU;IACV,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;QACxD,IAAI;YACF,MAAM,EACJ,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EACrC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,GAC/B,GAAG,IAAA,0BAAQ,EAAC;gBACX,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;oBACf,QAAQ,EAAE,mCAAwB;oBAClC,MAAM,EAAE,+BAAsB;iBAC/B,CAAC;gBACF,OAAO;aACR,CAAC,CAAA;YAEF,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YAC5D,MAAM,QAAQ,GAAwB,MAAM,WAAW,CAAC,WAAW,CACjE,SAAS,EACT,OAAO,CACR,CAAA;YACD,MAAM,UAAU,CAAC;gBACf,WAAW,EAAE;oBACX,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB;iBAChD;aACF,CAAC,CAAA;SACH;QAAC,OAAO,GAAG,EAAE;YACZ,IAAI,GAAG,YAAY,cAAQ,EAAE;gBAC3B,MAAM,KAAK,GAAG,IAAA,mCAAY,EAAC,GAAG,CAAC,CAAA;gBAC/B,MAAM,OAAO,CAAC;oBACZ,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAC9B,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE;4BAC3B,KAAK,EAAE;gCACL,QAAQ,EAAE,aAAa;gCACvB,OAAO,EAAE,KAAK,CAAC,OAAO;6BACvB;yBACF;qBACF;iBACF,CAAC,CAAA;aACH;iBAAM;gBACL,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAA;gBACtC,MAAM,OAAO,CAAC;oBACZ,MAAM,EAAE;wBACN;4BACE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAC9B,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;4BACrB,KAAK,EAAE;gCACL,QAAQ,EAAE,cAAc;gCACxB,OAAO;6BACR;yBACF;qBACF;iBACF,CAAC,CAAA;aACH;SACF;IACH,CAAC;CACF,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,64 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const sendSms_1 = require("./sendSms");
|
4
|
+
const tests_1 = require("../../../../src/tests");
|
5
|
+
const textLineApi_1 = require("../../client/__mocks__/textLineApi");
|
6
|
+
jest.mock('../../client/textLineApi', () => jest.fn(() => textLineApi_1.mockReturnValue));
|
7
|
+
describe('Send SMS action', () => {
|
8
|
+
const onComplete = jest.fn();
|
9
|
+
const onError = jest.fn();
|
10
|
+
beforeEach(() => {
|
11
|
+
onComplete.mockClear();
|
12
|
+
onError.mockClear();
|
13
|
+
});
|
14
|
+
test('Should call the onComplete callback', async () => {
|
15
|
+
await sendSms_1.sendSms.onActivityCreated((0, tests_1.generateTestPayload)({
|
16
|
+
fields: {
|
17
|
+
message: 'Message content',
|
18
|
+
recipient: '+13108820245',
|
19
|
+
},
|
20
|
+
settings: {
|
21
|
+
email: 'user',
|
22
|
+
password: 'password',
|
23
|
+
apiKey: 'apikey',
|
24
|
+
},
|
25
|
+
}), onComplete, onError);
|
26
|
+
expect(onComplete).toHaveBeenCalledWith({
|
27
|
+
data_points: {
|
28
|
+
conversationId: '30cded5d-90b7-4aae-9f51-b6b143376bb2',
|
29
|
+
},
|
30
|
+
});
|
31
|
+
expect(onError).not.toHaveBeenCalled();
|
32
|
+
}, 20000);
|
33
|
+
test('Should call the onError callback when there is no recipient', async () => {
|
34
|
+
await sendSms_1.sendSms.onActivityCreated((0, tests_1.generateTestPayload)({
|
35
|
+
fields: {
|
36
|
+
message: 'Message content',
|
37
|
+
recipient: undefined,
|
38
|
+
},
|
39
|
+
settings: {
|
40
|
+
email: 'user',
|
41
|
+
password: 'password',
|
42
|
+
apiKey: 'apikey',
|
43
|
+
},
|
44
|
+
}), onComplete, onError);
|
45
|
+
expect(onComplete).not.toHaveBeenCalled();
|
46
|
+
expect(onError).toHaveBeenCalled();
|
47
|
+
});
|
48
|
+
test('Should call the onError callback when there is no message', async () => {
|
49
|
+
await sendSms_1.sendSms.onActivityCreated((0, tests_1.generateTestPayload)({
|
50
|
+
fields: {
|
51
|
+
message: undefined,
|
52
|
+
recipient: '+13108820245',
|
53
|
+
},
|
54
|
+
settings: {
|
55
|
+
email: 'user',
|
56
|
+
password: 'password',
|
57
|
+
apiKey: 'apikey',
|
58
|
+
},
|
59
|
+
}), onComplete, onError);
|
60
|
+
expect(onComplete).not.toHaveBeenCalled();
|
61
|
+
expect(onError).toHaveBeenCalled();
|
62
|
+
});
|
63
|
+
});
|
64
|
+
//# sourceMappingURL=sendSms.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sendSms.test.js","sourceRoot":"","sources":["../../../../../extensions/textline/actions/sendSms/sendSms.test.ts"],"names":[],"mappings":";;AAAA,uCAAmC;AACnC,iDAA2D;AAC3D,oEAAoE;AAEpE,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,6BAAe,CAAC,CAAC,CAAA;AAE3E,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAA;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,CAAC,SAAS,EAAE,CAAA;QACtB,OAAO,CAAC,SAAS,EAAE,CAAA;IACrB,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,iBAAO,CAAC,iBAAiB,CAC7B,IAAA,2BAAmB,EAAC;YAClB,MAAM,EAAE;gBACN,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,cAAc;aAC1B;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,EACF,UAAU,EACV,OAAO,CACR,CAAA;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,WAAW,EAAE;gBACX,cAAc,EAAE,sCAAsC;aACvD;SACF,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IACxC,CAAC,EAAE,KAAK,CAAC,CAAA;IAET,IAAI,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,iBAAO,CAAC,iBAAiB,CAC7B,IAAA,2BAAmB,EAAC;YAClB,MAAM,EAAE;gBACN,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,SAAS;aACrB;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,EACF,UAAU,EACV,OAAO,CACR,CAAA;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,iBAAO,CAAC,iBAAiB,CAC7B,IAAA,2BAAmB,EAAC;YAClB,MAAM,EAAE;gBACN,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,cAAc;aAC1B;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,EACF,UAAU,EACV,OAAO,CACR,CAAA;QACD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
@@ -0,0 +1,161 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
declare const PostSchema: z.ZodObject<{
|
3
|
+
body: z.ZodString;
|
4
|
+
created_at: z.ZodNumber;
|
5
|
+
creator: z.ZodObject<{
|
6
|
+
phone_number: z.ZodOptional<z.ZodString>;
|
7
|
+
type: z.ZodString;
|
8
|
+
name: z.ZodString;
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
10
|
+
type: string;
|
11
|
+
name: string;
|
12
|
+
phone_number?: string | undefined;
|
13
|
+
}, {
|
14
|
+
type: string;
|
15
|
+
name: string;
|
16
|
+
phone_number?: string | undefined;
|
17
|
+
}>;
|
18
|
+
conversation_uuid: z.ZodString;
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
20
|
+
body: string;
|
21
|
+
created_at: number;
|
22
|
+
creator: {
|
23
|
+
type: string;
|
24
|
+
name: string;
|
25
|
+
phone_number?: string | undefined;
|
26
|
+
};
|
27
|
+
conversation_uuid: string;
|
28
|
+
}, {
|
29
|
+
body: string;
|
30
|
+
created_at: number;
|
31
|
+
creator: {
|
32
|
+
type: string;
|
33
|
+
name: string;
|
34
|
+
phone_number?: string | undefined;
|
35
|
+
};
|
36
|
+
conversation_uuid: string;
|
37
|
+
}>;
|
38
|
+
export declare const GetMessagesSchema: z.ZodObject<{
|
39
|
+
posts: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
40
|
+
body: z.ZodString;
|
41
|
+
created_at: z.ZodNumber;
|
42
|
+
creator: z.ZodObject<{
|
43
|
+
phone_number: z.ZodOptional<z.ZodString>;
|
44
|
+
type: z.ZodString;
|
45
|
+
name: z.ZodString;
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
47
|
+
type: string;
|
48
|
+
name: string;
|
49
|
+
phone_number?: string | undefined;
|
50
|
+
}, {
|
51
|
+
type: string;
|
52
|
+
name: string;
|
53
|
+
phone_number?: string | undefined;
|
54
|
+
}>;
|
55
|
+
conversation_uuid: z.ZodString;
|
56
|
+
}, "strip", z.ZodTypeAny, {
|
57
|
+
body: string;
|
58
|
+
created_at: number;
|
59
|
+
creator: {
|
60
|
+
type: string;
|
61
|
+
name: string;
|
62
|
+
phone_number?: string | undefined;
|
63
|
+
};
|
64
|
+
conversation_uuid: string;
|
65
|
+
}, {
|
66
|
+
body: string;
|
67
|
+
created_at: number;
|
68
|
+
creator: {
|
69
|
+
type: string;
|
70
|
+
name: string;
|
71
|
+
phone_number?: string | undefined;
|
72
|
+
};
|
73
|
+
conversation_uuid: string;
|
74
|
+
}>, "many">>;
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
76
|
+
posts?: {
|
77
|
+
body: string;
|
78
|
+
created_at: number;
|
79
|
+
creator: {
|
80
|
+
type: string;
|
81
|
+
name: string;
|
82
|
+
phone_number?: string | undefined;
|
83
|
+
};
|
84
|
+
conversation_uuid: string;
|
85
|
+
}[] | undefined;
|
86
|
+
}, {
|
87
|
+
posts?: {
|
88
|
+
body: string;
|
89
|
+
created_at: number;
|
90
|
+
creator: {
|
91
|
+
type: string;
|
92
|
+
name: string;
|
93
|
+
phone_number?: string | undefined;
|
94
|
+
};
|
95
|
+
conversation_uuid: string;
|
96
|
+
}[] | undefined;
|
97
|
+
}>;
|
98
|
+
declare const SendMessageResponseSchema: z.ZodObject<{
|
99
|
+
post: z.ZodObject<{
|
100
|
+
body: z.ZodString;
|
101
|
+
created_at: z.ZodNumber;
|
102
|
+
creator: z.ZodObject<{
|
103
|
+
phone_number: z.ZodOptional<z.ZodString>;
|
104
|
+
type: z.ZodString;
|
105
|
+
name: z.ZodString;
|
106
|
+
}, "strip", z.ZodTypeAny, {
|
107
|
+
type: string;
|
108
|
+
name: string;
|
109
|
+
phone_number?: string | undefined;
|
110
|
+
}, {
|
111
|
+
type: string;
|
112
|
+
name: string;
|
113
|
+
phone_number?: string | undefined;
|
114
|
+
}>;
|
115
|
+
conversation_uuid: z.ZodString;
|
116
|
+
}, "strip", z.ZodTypeAny, {
|
117
|
+
body: string;
|
118
|
+
created_at: number;
|
119
|
+
creator: {
|
120
|
+
type: string;
|
121
|
+
name: string;
|
122
|
+
phone_number?: string | undefined;
|
123
|
+
};
|
124
|
+
conversation_uuid: string;
|
125
|
+
}, {
|
126
|
+
body: string;
|
127
|
+
created_at: number;
|
128
|
+
creator: {
|
129
|
+
type: string;
|
130
|
+
name: string;
|
131
|
+
phone_number?: string | undefined;
|
132
|
+
};
|
133
|
+
conversation_uuid: string;
|
134
|
+
}>;
|
135
|
+
}, "strip", z.ZodTypeAny, {
|
136
|
+
post: {
|
137
|
+
body: string;
|
138
|
+
created_at: number;
|
139
|
+
creator: {
|
140
|
+
type: string;
|
141
|
+
name: string;
|
142
|
+
phone_number?: string | undefined;
|
143
|
+
};
|
144
|
+
conversation_uuid: string;
|
145
|
+
};
|
146
|
+
}, {
|
147
|
+
post: {
|
148
|
+
body: string;
|
149
|
+
created_at: number;
|
150
|
+
creator: {
|
151
|
+
type: string;
|
152
|
+
name: string;
|
153
|
+
phone_number?: string | undefined;
|
154
|
+
};
|
155
|
+
conversation_uuid: string;
|
156
|
+
};
|
157
|
+
}>;
|
158
|
+
export type SendMessageResponse = z.infer<typeof SendMessageResponseSchema>;
|
159
|
+
export type GetMessagesResponse = z.infer<typeof GetMessagesSchema>;
|
160
|
+
export type Post = z.infer<typeof PostSchema>;
|
161
|
+
export {};
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.GetMessagesSchema = void 0;
|
4
|
+
const zod_1 = require("zod");
|
5
|
+
const CreatorSchema = zod_1.z.object({
|
6
|
+
phone_number: zod_1.z.optional(zod_1.z.string()),
|
7
|
+
type: zod_1.z.string(),
|
8
|
+
name: zod_1.z.string(),
|
9
|
+
});
|
10
|
+
const PostSchema = zod_1.z.object({
|
11
|
+
body: zod_1.z.string(),
|
12
|
+
created_at: zod_1.z.number(),
|
13
|
+
creator: CreatorSchema,
|
14
|
+
conversation_uuid: zod_1.z.string(),
|
15
|
+
});
|
16
|
+
exports.GetMessagesSchema = zod_1.z.object({
|
17
|
+
posts: zod_1.z.optional(zod_1.z.array(PostSchema)),
|
18
|
+
});
|
19
|
+
const SendMessageResponseSchema = zod_1.z.object({
|
20
|
+
post: PostSchema,
|
21
|
+
});
|
22
|
+
//# sourceMappingURL=schema.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../extensions/textline/client/schema.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEvB,MAAM,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7B,YAAY,EAAE,OAAC,CAAC,QAAQ,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC;IACpC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAA;AAEF,MAAM,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,aAAa;IACtB,iBAAiB,EAAE,OAAC,CAAC,MAAM,EAAE;CAC9B,CAAC,CAAA;AAEW,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,OAAC,CAAC,QAAQ,CAAC,OAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;CACvC,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,OAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,UAAU;CACjB,CAAC,CAAA"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { type SendMessageResponse, type GetMessagesResponse } from './schema';
|
2
|
+
declare class TextLineApi {
|
3
|
+
private readonly email;
|
4
|
+
private readonly password;
|
5
|
+
private readonly apiKey;
|
6
|
+
private readonly baseUrl;
|
7
|
+
constructor(email: string, password: string, apiKey: string);
|
8
|
+
private constructUrl;
|
9
|
+
getMessages(phoneNumber?: string, page?: number, pageSize?: number): Promise<GetMessagesResponse>;
|
10
|
+
authenticate(): Promise<string>;
|
11
|
+
sendMessage(content: string, recipient: string): Promise<SendMessageResponse>;
|
12
|
+
}
|
13
|
+
export default TextLineApi;
|
@@ -0,0 +1,93 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
7
|
+
const lodash_1 = require("lodash");
|
8
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
9
|
+
const schema_1 = require("./schema");
|
10
|
+
class TextLineApi {
|
11
|
+
constructor(email, password, apiKey) {
|
12
|
+
this.baseUrl = 'https://application.textline.com';
|
13
|
+
this.email = email;
|
14
|
+
this.password = password;
|
15
|
+
this.apiKey = apiKey;
|
16
|
+
}
|
17
|
+
constructUrl(url, params) {
|
18
|
+
const nonEmptyParams = (0, lodash_1.omitBy)(params, lodash_1.isNil);
|
19
|
+
const stringParams = Object.fromEntries(Object.entries(nonEmptyParams).map(([key, value]) => [key, String(value)]));
|
20
|
+
const queryParams = new URLSearchParams(stringParams);
|
21
|
+
return `${this.baseUrl}${url}?${queryParams.toString()}`;
|
22
|
+
}
|
23
|
+
async getMessages(phoneNumber, page, pageSize) {
|
24
|
+
const accessToken = await this.authenticate();
|
25
|
+
const url = this.constructUrl(`/api/conversations.json`, {
|
26
|
+
phone_number: phoneNumber,
|
27
|
+
page_size: pageSize,
|
28
|
+
page,
|
29
|
+
});
|
30
|
+
const response = await (0, extensions_core_1.fetchTyped)(url, schema_1.GetMessagesSchema, {
|
31
|
+
headers: {
|
32
|
+
Accept: 'application/json',
|
33
|
+
'Content-Type': 'application/json',
|
34
|
+
'X-TGP-ACCESS-TOKEN': accessToken,
|
35
|
+
},
|
36
|
+
});
|
37
|
+
return response;
|
38
|
+
}
|
39
|
+
async authenticate() {
|
40
|
+
var _a, _b;
|
41
|
+
const url = this.constructUrl(`/auth/sign_in.json`);
|
42
|
+
const response = await (0, node_fetch_1.default)(url, {
|
43
|
+
method: 'POST',
|
44
|
+
headers: {
|
45
|
+
Accept: 'application/json',
|
46
|
+
'Content-Type': 'application/json',
|
47
|
+
},
|
48
|
+
body: JSON.stringify({
|
49
|
+
user: {
|
50
|
+
email: this.email,
|
51
|
+
password: this.password,
|
52
|
+
},
|
53
|
+
api_key: this.apiKey,
|
54
|
+
}),
|
55
|
+
});
|
56
|
+
const result = await response.json();
|
57
|
+
if (response.status >= 400) {
|
58
|
+
throw new Error((0, lodash_1.isNil)(result === null || result === void 0 ? void 0 : result.error)
|
59
|
+
? 'Unable to authenticate'
|
60
|
+
: `Authentication failed with error: ${JSON.stringify(result.error)}`);
|
61
|
+
}
|
62
|
+
if ((0, lodash_1.isNil)((_a = result === null || result === void 0 ? void 0 : result.access_token) === null || _a === void 0 ? void 0 : _a.token)) {
|
63
|
+
throw new Error(`Can't get access token from authentication response ${JSON.stringify(result)}`);
|
64
|
+
}
|
65
|
+
return (_b = result === null || result === void 0 ? void 0 : result.access_token) === null || _b === void 0 ? void 0 : _b.token;
|
66
|
+
}
|
67
|
+
async sendMessage(content, recipient) {
|
68
|
+
var _a;
|
69
|
+
const accessToken = await this.authenticate();
|
70
|
+
const url = this.constructUrl(`/api/conversations.json`);
|
71
|
+
const response = await (0, node_fetch_1.default)(url, {
|
72
|
+
method: 'POST',
|
73
|
+
headers: {
|
74
|
+
Accept: 'application/json',
|
75
|
+
'Content-Type': 'application/json',
|
76
|
+
'X-TGP-ACCESS-TOKEN': accessToken,
|
77
|
+
},
|
78
|
+
body: JSON.stringify({
|
79
|
+
phone_number: recipient,
|
80
|
+
comment: {
|
81
|
+
body: content,
|
82
|
+
},
|
83
|
+
}),
|
84
|
+
});
|
85
|
+
const result = await response.json();
|
86
|
+
if (response.status >= 400) {
|
87
|
+
throw new Error((_a = result === null || result === void 0 ? void 0 : result.message) !== null && _a !== void 0 ? _a : 'Unknown error in TextLine API has occurred');
|
88
|
+
}
|
89
|
+
return result;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
exports.default = TextLineApi;
|
93
|
+
//# sourceMappingURL=textLineApi.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"textLineApi.js","sourceRoot":"","sources":["../../../../extensions/textline/client/textLineApi.ts"],"names":[],"mappings":";;;;;AAAA,mEAA0D;AAC1D,mCAAsC;AACtC,4DAA8B;AAC9B,qCAIiB;AAEjB,MAAM,WAAW;IAOf,YAAY,KAAa,EAAE,QAAgB,EAAE,MAAc;QAF1C,YAAO,GAAG,kCAAkC,CAAA;QAG3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEO,YAAY,CAClB,GAAW,EACX,MAA8D;QAE9D,MAAM,cAAc,GAAG,IAAA,eAAM,EAAC,MAAM,EAAE,cAAK,CAAC,CAAA;QAE5C,MAAM,YAAY,GAA2B,MAAM,CAAC,WAAW,CAC7D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3E,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC;QAGtD,OAAO,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAA;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW,CACf,WAAoB,EACpB,IAAa,EACb,QAAiB;QAEjB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACvD,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,QAAQ;YACnB,IAAI;SACL,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,IAAA,4BAAU,EAAC,GAAG,EAAE,0BAAiB,EAAE;YACxD,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,oBAAoB,EAAE,WAAW;aAClC;SACF,CAAC,CAAA;QACF,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,YAAY;;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI,EAAE;oBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB;gBACD,OAAO,EAAE,IAAI,CAAC,MAAM;aACrB,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAEpC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE;YAC1B,MAAM,IAAI,KAAK,CACb,IAAA,cAAK,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC;gBAClB,CAAC,CAAC,wBAAwB;gBAC1B,CAAC,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxE,CAAA;SACF;QAED,IAAI,IAAA,cAAK,EAAC,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,KAAK,CAAC,EAAE;YACtC,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CACnE,MAAM,CACP,EAAE,CACJ,CAAA;SACF;QAED,OAAO,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,KAAK,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,SAAiB;;QAEjB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;QAE7C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAA;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,oBAAoB,EAAE,WAAW;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,YAAY,EAAE,SAAS;gBACvB,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;iBACd;aACF,CAAC;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAEpC,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE;YAC1B,MAAM,IAAI,KAAK,CACb,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,mCAAI,4CAA4C,CAChE,CAAA;SACF;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAED,kBAAe,WAAW,CAAA"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.TextLine = void 0;
|
4
|
+
const extensions_core_1 = require("@awell-health/extensions-core");
|
5
|
+
const actions_1 = require("./actions");
|
6
|
+
const settings_1 = require("./settings");
|
7
|
+
exports.TextLine = {
|
8
|
+
key: 'textline',
|
9
|
+
title: 'TextLine',
|
10
|
+
icon_url: 'https://res.cloudinary.com/da7x4rzl4/image/upload/v1709035140/Awell%20Extensions/OkNMApXr_400x400.jpg',
|
11
|
+
description: "Textline's business texting software offers solutions for sales, marketing, customer service, and beyond. Utilize the power of SMS to grow quickly.",
|
12
|
+
category: extensions_core_1.Category.COMMUNICATION,
|
13
|
+
author: {
|
14
|
+
authorType: extensions_core_1.AuthorType.AWELL,
|
15
|
+
},
|
16
|
+
actions: actions_1.actions,
|
17
|
+
settings: settings_1.settings,
|
18
|
+
};
|
19
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../extensions/textline/index.ts"],"names":[],"mappings":";;;AACA,mEAAoE;AACpE,uCAAmC;AACnC,yCAAqC;AAExB,QAAA,QAAQ,GAAc;IACjC,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,QAAQ,EACN,uGAAuG;IACzG,WAAW,EACT,qJAAqJ;IACvJ,QAAQ,EAAE,0BAAQ,CAAC,aAAa;IAChC,MAAM,EAAE;QACN,UAAU,EAAE,4BAAU,CAAC,KAAK;KAC7B;IACD,OAAO,EAAP,iBAAO;IACP,QAAQ,EAAR,mBAAQ;CACT,CAAA"}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
import { z } from 'zod';
|
2
|
+
export declare const settings: {
|
3
|
+
email: {
|
4
|
+
label: string;
|
5
|
+
key: string;
|
6
|
+
obfuscated: false;
|
7
|
+
required: true;
|
8
|
+
description: string;
|
9
|
+
};
|
10
|
+
password: {
|
11
|
+
label: string;
|
12
|
+
key: string;
|
13
|
+
obfuscated: true;
|
14
|
+
required: true;
|
15
|
+
description: string;
|
16
|
+
};
|
17
|
+
apiKey: {
|
18
|
+
label: string;
|
19
|
+
key: string;
|
20
|
+
obfuscated: true;
|
21
|
+
required: true;
|
22
|
+
description: string;
|
23
|
+
};
|
24
|
+
};
|
25
|
+
export declare const SettingsValidationSchema: z.ZodObject<{
|
26
|
+
password: z.ZodString;
|
27
|
+
email: z.ZodString;
|
28
|
+
apiKey: z.ZodString;
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
30
|
+
password: string;
|
31
|
+
email: string;
|
32
|
+
apiKey: string;
|
33
|
+
}, {
|
34
|
+
password: string;
|
35
|
+
email: string;
|
36
|
+
apiKey: string;
|
37
|
+
}>;
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.SettingsValidationSchema = exports.settings = void 0;
|
4
|
+
const zod_1 = require("zod");
|
5
|
+
exports.settings = {
|
6
|
+
email: {
|
7
|
+
label: 'Email',
|
8
|
+
key: 'email',
|
9
|
+
obfuscated: false,
|
10
|
+
required: true,
|
11
|
+
description: 'Your TextLine agent email',
|
12
|
+
},
|
13
|
+
password: {
|
14
|
+
label: 'Password',
|
15
|
+
key: 'password',
|
16
|
+
obfuscated: true,
|
17
|
+
required: true,
|
18
|
+
description: 'Your TextLine agent password',
|
19
|
+
},
|
20
|
+
apiKey: {
|
21
|
+
label: 'Api Key',
|
22
|
+
key: 'apiKey',
|
23
|
+
obfuscated: true,
|
24
|
+
required: true,
|
25
|
+
description: 'Find your API key at https://application.textline.com/organization/api_settings.',
|
26
|
+
},
|
27
|
+
};
|
28
|
+
exports.SettingsValidationSchema = zod_1.z.object({
|
29
|
+
password: zod_1.z.string().min(1, { message: 'Missing TextLine password' }),
|
30
|
+
email: zod_1.z.string().min(1, { message: 'Missing TextLine email' }),
|
31
|
+
apiKey: zod_1.z.string().min(1, { message: 'Missing TextLine access token' }),
|
32
|
+
});
|
33
|
+
//# sourceMappingURL=settings.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../extensions/textline/settings.ts"],"names":[],"mappings":";;;AACA,6BAAwC;AAE3B,QAAA,QAAQ,GAAG;IACtB,KAAK,EAAE;QACL,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,OAAO;QACZ,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,2BAA2B;KACzC;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,UAAU;QACjB,GAAG,EAAE,UAAU;QACf,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,8BAA8B;KAC5C;IACD,MAAM,EAAE;QACN,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,QAAQ;QACb,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,kFAAkF;KACrF;CACgC,CAAA;AAEtB,QAAA,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IACrE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IAC/D,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;CACpB,CAAC,CAAA"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.MessageValidationSchema = void 0;
|
4
|
+
const zod_1 = require("zod");
|
5
|
+
exports.MessageValidationSchema = zod_1.z
|
6
|
+
.string()
|
7
|
+
.min(1, { message: 'Missing or empty message' })
|
8
|
+
.max(1600, { message: 'Message can not be longer than 1600 characters' });
|
9
|
+
//# sourceMappingURL=validation.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../extensions/textline/validation.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEV,QAAA,uBAAuB,GAAG,OAAC;KACrC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;KAC/C,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,gDAAgD,EAAE,CAAC,CAAA"}
|