@taskmagic/apps-loops 0.0.1

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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Loops
2
+
3
+ Loops is an email platform for sending transactional and marketing emails. Manage contacts, trigger automations with events, and send transactional emails from your workflows.
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@taskmagic/apps-loops",
3
+ "version": "0.0.1",
4
+ "dependencies": {
5
+ "@anthropic-ai/sdk": "0.33.1",
6
+ "@sinclair/typebox": "0.34.11",
7
+ "axios": "1.17.0",
8
+ "axios-retry": "4.4.1",
9
+ "deepmerge-ts": "7.1.0",
10
+ "mime-types": "2.1.35",
11
+ "nanoid": "3.3.8",
12
+ "openai": "4.67.1",
13
+ "replicate": "0.34.1",
14
+ "semver": "7.6.0",
15
+ "zod": "3.25.76",
16
+ "@taskmagic/pieces-common": "0.4.4",
17
+ "@taskmagic/pieces-framework": "0.7.46",
18
+ "@taskmagic/shared": "0.10.171",
19
+ "tslib": "1.14.1"
20
+ },
21
+ "overrides": {
22
+ "cross-spawn": "7.0.6",
23
+ "elliptic": "^6.6.1",
24
+ "fast-xml-parser": "^4.4.1",
25
+ "protobufjs": "^7.5.5",
26
+ "tmp": "^0.2.4",
27
+ "koa": "^2.16.4",
28
+ "picomatch": "^4.0.4",
29
+ "langsmith": "^0.6.0",
30
+ "serialize-javascript": "^6.0.2",
31
+ "elevenlabs": {
32
+ "form-data": "^4.0.4"
33
+ },
34
+ "@tryfabric/martian": {
35
+ "@notionhq/client": "$@notionhq/client"
36
+ },
37
+ "vite": {
38
+ "rollup": "npm:@rollup/wasm-node@^4.61.1"
39
+ }
40
+ },
41
+ "resolutions": {
42
+ "rollup": "npm:@rollup/wasm-node@^4.61.1"
43
+ },
44
+ "types": "./src/index.d.ts",
45
+ "main": "./src/index.js",
46
+ "type": "commonjs"
47
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const loops: import("@taskmagic/pieces-framework").Piece<import("@taskmagic/pieces-framework").SecretTextProperty<true>>;
package/src/index.js ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loops = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const shared_1 = require("@taskmagic/shared");
7
+ const pieces_common_1 = require("@taskmagic/pieces-common");
8
+ const auth_1 = require("./lib/auth");
9
+ const create_contact_1 = require("./lib/actions/create-contact");
10
+ const send_event_1 = require("./lib/actions/send-event");
11
+ const send_transactional_email_1 = require("./lib/actions/send-transactional-email");
12
+ const find_contact_1 = require("./lib/actions/find-contact");
13
+ const delete_contact_1 = require("./lib/actions/delete-contact");
14
+ exports.loops = (0, pieces_framework_1.createPiece)({
15
+ displayName: 'Loops',
16
+ description: 'Loops is an email platform for sending beautiful transactional and marketing emails. Manage contacts, trigger automations with events, and send transactional emails from your workflows.',
17
+ minimumSupportedRelease: '0.30.0',
18
+ logoUrl: 'https://cdn.activepieces.com/pieces/loops.png',
19
+ authors: ['Harmatta'],
20
+ categories: [shared_1.PieceCategory.COMMUNICATION, shared_1.PieceCategory.MARKETING],
21
+ auth: auth_1.loopsAuth,
22
+ actions: [
23
+ create_contact_1.createContact,
24
+ send_event_1.sendEvent,
25
+ send_transactional_email_1.sendTransactionalEmail,
26
+ find_contact_1.findContact,
27
+ delete_contact_1.deleteContact,
28
+ (0, pieces_common_1.createCustomApiCallAction)({
29
+ baseUrl: () => auth_1.LOOPS_BASE_URL,
30
+ auth: auth_1.loopsAuth,
31
+ authMapping: (auth) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
32
+ return ({
33
+ Authorization: `Bearer ${auth}`,
34
+ });
35
+ }),
36
+ }),
37
+ ],
38
+ triggers: [],
39
+ });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/pieces/community/loops/src/index.ts"],"names":[],"mappings":";;;;AAAA,kEAA0D;AAC1D,8CAAkD;AAClD,4DAAqE;AAErE,qCAAuD;AACvD,iEAA6D;AAC7D,yDAAqD;AACrD,qFAAgF;AAChF,6DAAyD;AACzD,iEAA6D;AAEhD,QAAA,KAAK,GAAG,IAAA,8BAAW,EAAC;IAC/B,WAAW,EAAE,OAAO;IACpB,WAAW,EACT,2LAA2L;IAC7L,uBAAuB,EAAE,QAAQ;IACjC,OAAO,EAAE,+CAA+C;IACxD,OAAO,EAAE,CAAC,UAAU,CAAC;IACrB,UAAU,EAAE,CAAC,sBAAa,CAAC,aAAa,EAAE,sBAAa,CAAC,SAAS,CAAC;IAClE,IAAI,EAAE,gBAAS;IACf,OAAO,EAAE;QACP,8BAAa;QACb,sBAAS;QACT,iDAAsB;QACtB,0BAAW;QACX,8BAAa;QACb,IAAA,yCAAyB,EAAC;YACxB,OAAO,EAAE,GAAG,EAAE,CAAC,qBAAc;YAC7B,IAAI,EAAE,gBAAS;YACf,WAAW,EAAE,CAAO,IAAI,EAAE,EAAE;gBAAC,OAAA,CAAC;oBAC5B,aAAa,EAAE,UAAU,IAAc,EAAE;iBAC1C,CAAC,CAAA;cAAA;SACH,CAAC;KACH;IACD,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const createContact: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ email: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
3
+ firstName: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
4
+ lastName: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
5
+ userId: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
6
+ subscribed: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, false>;
7
+ userGroup: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
8
+ source: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
9
+ mailingLists: import("@taskmagic/pieces-framework").ObjectProperty<false>;
10
+ customProperties: import("@taskmagic/pieces-framework").ObjectProperty<false>;
11
+ }>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createContact = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const auth_1 = require("../auth");
8
+ const RESERVED_FIELDS = new Set([
9
+ 'email',
10
+ 'firstName',
11
+ 'lastName',
12
+ 'userId',
13
+ 'subscribed',
14
+ 'userGroup',
15
+ 'source',
16
+ ]);
17
+ exports.createContact = (0, pieces_framework_1.createAction)({
18
+ name: 'create_contact',
19
+ displayName: 'Create Contact',
20
+ description: 'Creates a new contact in Loops. Returns an error if a contact with the given email already exists.',
21
+ auth: auth_1.loopsAuth,
22
+ props: {
23
+ email: pieces_framework_1.Property.ShortText({
24
+ displayName: 'Email',
25
+ description: 'The email address of the contact.',
26
+ required: true,
27
+ }),
28
+ firstName: pieces_framework_1.Property.ShortText({
29
+ displayName: 'First Name',
30
+ description: "The contact's first name.",
31
+ required: false,
32
+ }),
33
+ lastName: pieces_framework_1.Property.ShortText({
34
+ displayName: 'Last Name',
35
+ description: "The contact's last name.",
36
+ required: false,
37
+ }),
38
+ userId: pieces_framework_1.Property.ShortText({
39
+ displayName: 'User ID',
40
+ description: 'Your internal user ID for this contact.',
41
+ required: false,
42
+ }),
43
+ subscribed: pieces_framework_1.Property.StaticDropdown({
44
+ displayName: 'Subscribed to Marketing',
45
+ description: 'Set subscription status. Leave as "No Change" to preserve existing status on update.',
46
+ required: false,
47
+ options: {
48
+ disabled: false,
49
+ options: [
50
+ { label: 'No Change', value: 'no_change' },
51
+ { label: 'Subscribe', value: 'true' },
52
+ { label: 'Unsubscribe', value: 'false' },
53
+ ],
54
+ },
55
+ }),
56
+ userGroup: pieces_framework_1.Property.ShortText({
57
+ displayName: 'User Group',
58
+ description: 'A group/segment to assign to this contact.',
59
+ required: false,
60
+ }),
61
+ source: pieces_framework_1.Property.ShortText({
62
+ displayName: 'Source',
63
+ description: 'Where this contact came from (e.g. "signup-form", "import").',
64
+ required: false,
65
+ }),
66
+ mailingLists: pieces_framework_1.Property.Object({
67
+ displayName: 'Mailing Lists',
68
+ description: 'Subscribe or unsubscribe this contact from mailing lists. Provide list IDs as keys with `true` (subscribe) or `false` (unsubscribe) as values.',
69
+ required: false,
70
+ }),
71
+ customProperties: pieces_framework_1.Property.Object({
72
+ displayName: 'Custom Properties',
73
+ description: 'Additional custom contact properties as key-value pairs. Reserved fields (email, firstName, lastName, userId, subscribed, userGroup, source) are ignored here.',
74
+ required: false,
75
+ }),
76
+ },
77
+ run(context) {
78
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
79
+ const { email, firstName, lastName, userId, subscribed, userGroup, source, mailingLists, customProperties, } = context.propsValue;
80
+ const body = { email };
81
+ if (firstName)
82
+ body['firstName'] = firstName;
83
+ if (lastName)
84
+ body['lastName'] = lastName;
85
+ if (userId)
86
+ body['userId'] = userId;
87
+ if (subscribed === 'true')
88
+ body['subscribed'] = true;
89
+ if (subscribed === 'false')
90
+ body['subscribed'] = false;
91
+ if (userGroup)
92
+ body['userGroup'] = userGroup;
93
+ if (source)
94
+ body['source'] = source;
95
+ if (mailingLists && typeof mailingLists === 'object') {
96
+ body['mailingLists'] = mailingLists;
97
+ }
98
+ if (customProperties && typeof customProperties === 'object') {
99
+ for (const [key, value] of Object.entries(customProperties)) {
100
+ if (!RESERVED_FIELDS.has(key)) {
101
+ body[key] = value;
102
+ }
103
+ }
104
+ }
105
+ const response = yield pieces_common_1.httpClient.sendRequest({
106
+ method: pieces_common_1.HttpMethod.POST,
107
+ url: `${auth_1.LOOPS_BASE_URL}/contacts/create`,
108
+ headers: {
109
+ Authorization: `Bearer ${context.auth}`,
110
+ 'Content-Type': 'application/json',
111
+ Accept: 'application/json',
112
+ },
113
+ body,
114
+ });
115
+ return response.body;
116
+ });
117
+ },
118
+ });
119
+ //# sourceMappingURL=create-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-contact.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/loops/src/lib/actions/create-contact.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAkE;AAClE,kCAAoD;AAEpD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,OAAO;IACP,WAAW;IACX,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,QAAQ;CACT,CAAC,CAAC;AAEU,QAAA,aAAa,GAAG,IAAA,+BAAY,EAAC;IACxC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EACT,oGAAoG;IACtG,IAAI,EAAE,gBAAS;IACf,KAAK,EAAE;QACL,KAAK,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACxB,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,SAAS,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,2BAA2B;YACxC,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,QAAQ,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC3B,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,yCAAyC;YACtD,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,UAAU,EAAE,2BAAQ,CAAC,cAAc,CAAC;YAClC,WAAW,EAAE,yBAAyB;YACtC,WAAW,EACT,sFAAsF;YACxF,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE;gBACP,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC1C,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;oBACrC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE;iBACzC;aACF;SACF,CAAC;QACF,SAAS,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,QAAQ;YACrB,WAAW,EACT,8DAA8D;YAChE,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,YAAY,EAAE,2BAAQ,CAAC,MAAM,CAAC;YAC5B,WAAW,EAAE,eAAe;YAC5B,WAAW,EACT,gJAAgJ;YAClJ,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,gBAAgB,EAAE,2BAAQ,CAAC,MAAM,CAAC;YAChC,WAAW,EAAE,mBAAmB;YAChC,WAAW,EACT,gKAAgK;YAClK,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,MAAM,EACN,UAAU,EACV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,gBAAgB,GACjB,GAAG,OAAO,CAAC,UAAU,CAAC;YAEvB,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,CAAC;YAEhD,IAAI,SAAS;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;YAC7C,IAAI,QAAQ;gBAAE,IAAI,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;YAC1C,IAAI,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YACpC,IAAI,UAAU,KAAK,MAAM;gBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;YACrD,IAAI,UAAU,KAAK,OAAO;gBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;YACvD,IAAI,SAAS;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;YAC7C,IAAI,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YACpC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrD,IAAI,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;YACtC,CAAC;YAED,IAAI,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBAC7D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACpB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAA0B;gBACrE,MAAM,EAAE,0BAAU,CAAC,IAAI;gBACvB,GAAG,EAAE,GAAG,qBAAc,kBAAkB;gBACxC,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,IAAc,EAAE;oBACjD,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const deleteContact: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ email: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
3
+ userId: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
4
+ }>;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteContact = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const auth_1 = require("../auth");
8
+ exports.deleteContact = (0, pieces_framework_1.createAction)({
9
+ name: 'delete_contact',
10
+ displayName: 'Delete Contact',
11
+ description: 'Permanently deletes a contact from Loops by their email address or user ID.',
12
+ auth: auth_1.loopsAuth,
13
+ props: {
14
+ email: pieces_framework_1.Property.ShortText({
15
+ displayName: 'Email',
16
+ description: 'The email address of the contact to delete.',
17
+ required: false,
18
+ }),
19
+ userId: pieces_framework_1.Property.ShortText({
20
+ displayName: 'User ID',
21
+ description: 'Your internal user ID of the contact to delete.',
22
+ required: false,
23
+ }),
24
+ },
25
+ run(context) {
26
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
27
+ const { email, userId } = context.propsValue;
28
+ if (!email && !userId) {
29
+ throw new Error('At least one of "Email" or "User ID" must be provided.');
30
+ }
31
+ const body = {};
32
+ if (email)
33
+ body['email'] = email;
34
+ if (userId)
35
+ body['userId'] = userId;
36
+ const response = yield pieces_common_1.httpClient.sendRequest({
37
+ method: pieces_common_1.HttpMethod.DELETE,
38
+ url: `${auth_1.LOOPS_BASE_URL}/contacts/delete`,
39
+ headers: {
40
+ Authorization: `Bearer ${context.auth}`,
41
+ 'Content-Type': 'application/json',
42
+ Accept: 'application/json',
43
+ },
44
+ body,
45
+ });
46
+ return response.body;
47
+ });
48
+ },
49
+ });
50
+ //# sourceMappingURL=delete-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-contact.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/loops/src/lib/actions/delete-contact.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAkE;AAClE,kCAAoD;AAEvC,QAAA,aAAa,GAAG,IAAA,+BAAY,EAAC;IACxC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EACT,6EAA6E;IAC/E,IAAI,EAAE,gBAAS;IACf,KAAK,EAAE;QACL,KAAK,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACxB,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,6CAA6C;YAC1D,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,iDAAiD;YAC9D,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAE7C,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,IAAI,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YACjC,IAAI,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YAEpC,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAA0B;gBACrE,MAAM,EAAE,0BAAU,CAAC,MAAM;gBACzB,GAAG,EAAE,GAAG,qBAAc,kBAAkB;gBACxC,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,IAAc,EAAE;oBACjD,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const findContact: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ searchBy: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, true>;
3
+ searchValue: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
4
+ }>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findContact = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const auth_1 = require("../auth");
8
+ exports.findContact = (0, pieces_framework_1.createAction)({
9
+ name: 'find_contact',
10
+ displayName: 'Find Contact',
11
+ description: 'Finds a contact in Loops by their email address or user ID.',
12
+ auth: auth_1.loopsAuth,
13
+ props: {
14
+ searchBy: pieces_framework_1.Property.StaticDropdown({
15
+ displayName: 'Search By',
16
+ description: 'The field to search by. The Loops API only allows one search parameter.',
17
+ required: true,
18
+ options: {
19
+ disabled: false,
20
+ options: [
21
+ { label: 'Email', value: 'email' },
22
+ { label: 'User ID', value: 'userId' },
23
+ ],
24
+ },
25
+ }),
26
+ searchValue: pieces_framework_1.Property.ShortText({
27
+ displayName: 'Value',
28
+ description: 'The email address or user ID to search for.',
29
+ required: true,
30
+ }),
31
+ },
32
+ run(context) {
33
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
34
+ const { searchBy, searchValue } = context.propsValue;
35
+ const params = new URLSearchParams();
36
+ params.set(searchBy, searchValue);
37
+ const response = yield pieces_common_1.httpClient.sendRequest({
38
+ method: pieces_common_1.HttpMethod.GET,
39
+ url: `${auth_1.LOOPS_BASE_URL}/contacts/find?${params.toString()}`,
40
+ headers: {
41
+ Authorization: `Bearer ${context.auth}`,
42
+ Accept: 'application/json',
43
+ },
44
+ });
45
+ const data = response.body;
46
+ return {
47
+ contacts: data,
48
+ count: Array.isArray(data) ? data.length : 0,
49
+ };
50
+ });
51
+ },
52
+ });
53
+ //# sourceMappingURL=find-contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-contact.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/loops/src/lib/actions/find-contact.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAkE;AAClE,kCAAoD;AAEvC,QAAA,WAAW,GAAG,IAAA,+BAAY,EAAC;IACtC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,6DAA6D;IAC1E,IAAI,EAAE,gBAAS;IACf,KAAK,EAAE;QACL,QAAQ,EAAE,2BAAQ,CAAC,cAAc,CAAC;YAChC,WAAW,EAAE,WAAW;YACxB,WAAW,EACT,yEAAyE;YAC3E,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE;gBACP,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE;oBACP,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBAClC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;iBACtC;aACF;SACF,CAAC;QACF,WAAW,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC9B,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,6CAA6C;YAC1D,QAAQ,EAAE,IAAI;SACf,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;YAErD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAY;gBACvD,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,GAAG,EAAE,GAAG,qBAAc,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE;gBAC3D,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,IAAc,EAAE;oBACjD,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3B,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aAC7C,CAAC;QACJ,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const sendEvent: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ email: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
3
+ userId: import("@taskmagic/pieces-framework").ShortTextProperty<false>;
4
+ eventName: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
5
+ eventProperties: import("@taskmagic/pieces-framework").ObjectProperty<false>;
6
+ mailingLists: import("@taskmagic/pieces-framework").ObjectProperty<false>;
7
+ contactProperties: import("@taskmagic/pieces-framework").ObjectProperty<false>;
8
+ }>;
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendEvent = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const auth_1 = require("../auth");
8
+ exports.sendEvent = (0, pieces_framework_1.createAction)({
9
+ name: 'send_event',
10
+ displayName: 'Send Event',
11
+ description: 'Sends an event to Loops for a contact. Events can trigger email automations configured in your Loops dashboard.',
12
+ auth: auth_1.loopsAuth,
13
+ props: {
14
+ email: pieces_framework_1.Property.ShortText({
15
+ displayName: 'Email',
16
+ description: 'The email address of the contact to send the event for.',
17
+ required: false,
18
+ }),
19
+ userId: pieces_framework_1.Property.ShortText({
20
+ displayName: 'User ID',
21
+ description: 'Your internal user ID of the contact (used if email is not provided).',
22
+ required: false,
23
+ }),
24
+ eventName: pieces_framework_1.Property.ShortText({
25
+ displayName: 'Event Name',
26
+ description: 'The name of the event to send (e.g. "signup", "purchase", "password-reset"). Must match an event set up in Loops.',
27
+ required: true,
28
+ }),
29
+ eventProperties: pieces_framework_1.Property.Object({
30
+ displayName: 'Event Properties',
31
+ description: 'Optional key-value pairs to attach to the event (used in email templates).',
32
+ required: false,
33
+ }),
34
+ mailingLists: pieces_framework_1.Property.Object({
35
+ displayName: 'Mailing Lists',
36
+ description: 'Subscribe or unsubscribe this contact from mailing lists. Provide list IDs as keys with `true` (subscribe) or `false` (unsubscribe) as values.',
37
+ required: false,
38
+ }),
39
+ contactProperties: pieces_framework_1.Property.Object({
40
+ displayName: 'Contact Properties',
41
+ description: 'Optional contact property updates to apply when the event is sent.',
42
+ required: false,
43
+ }),
44
+ },
45
+ run(context) {
46
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
47
+ const { email, userId, eventName, eventProperties, mailingLists, contactProperties, } = context.propsValue;
48
+ if (!email && !userId) {
49
+ throw new Error('Either "Email" or "User ID" must be provided.');
50
+ }
51
+ const body = { eventName };
52
+ if (email)
53
+ body['email'] = email;
54
+ if (userId)
55
+ body['userId'] = userId;
56
+ if (eventProperties && typeof eventProperties === 'object') {
57
+ body['eventProperties'] = eventProperties;
58
+ }
59
+ if (mailingLists && typeof mailingLists === 'object') {
60
+ body['mailingLists'] = mailingLists;
61
+ }
62
+ if (contactProperties && typeof contactProperties === 'object') {
63
+ Object.assign(body, contactProperties);
64
+ }
65
+ const response = yield pieces_common_1.httpClient.sendRequest({
66
+ method: pieces_common_1.HttpMethod.POST,
67
+ url: `${auth_1.LOOPS_BASE_URL}/events/send`,
68
+ headers: {
69
+ Authorization: `Bearer ${context.auth}`,
70
+ 'Content-Type': 'application/json',
71
+ Accept: 'application/json',
72
+ },
73
+ body,
74
+ });
75
+ return response.body;
76
+ });
77
+ },
78
+ });
79
+ //# sourceMappingURL=send-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-event.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/loops/src/lib/actions/send-event.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAkE;AAClE,kCAAoD;AAEvC,QAAA,SAAS,GAAG,IAAA,+BAAY,EAAC;IACpC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,WAAW,EACT,iHAAiH;IACnH,IAAI,EAAE,gBAAS;IACf,KAAK,EAAE;QACL,KAAK,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACxB,WAAW,EAAE,OAAO;YACpB,WAAW,EAAE,yDAAyD;YACtE,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,MAAM,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACzB,WAAW,EAAE,SAAS;YACtB,WAAW,EACT,uEAAuE;YACzE,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,SAAS,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC5B,WAAW,EAAE,YAAY;YACzB,WAAW,EACT,mHAAmH;YACrH,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,eAAe,EAAE,2BAAQ,CAAC,MAAM,CAAC;YAC/B,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EACT,4EAA4E;YAC9E,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,YAAY,EAAE,2BAAQ,CAAC,MAAM,CAAC;YAC5B,WAAW,EAAE,eAAe;YAC5B,WAAW,EACT,gJAAgJ;YAClJ,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,iBAAiB,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACjC,WAAW,EAAE,oBAAoB;YACjC,WAAW,EACT,oEAAoE;YACtE,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,eAAe,EACf,YAAY,EACZ,iBAAiB,GAClB,GAAG,OAAO,CAAC,UAAU,CAAC;YAEvB,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,GAA4B,EAAE,SAAS,EAAE,CAAC;YAEpD,IAAI,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YACjC,IAAI,MAAM;gBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;YAEpC,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;gBAC3D,IAAI,CAAC,iBAAiB,CAAC,GAAG,eAAe,CAAC;YAC5C,CAAC;YAED,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrD,IAAI,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;YACtC,CAAC;YAED,IAAI,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;gBAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAA0B;gBACrE,MAAM,EAAE,0BAAU,CAAC,IAAI;gBACvB,GAAG,EAAE,GAAG,qBAAc,cAAc;gBACpC,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,IAAc,EAAE;oBACjD,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const sendTransactionalEmail: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ email: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
3
+ transactionalId: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
4
+ addToAudience: import("@taskmagic/pieces-framework").CheckboxProperty<false>;
5
+ dataVariables: import("@taskmagic/pieces-framework").ObjectProperty<false>;
6
+ }>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendTransactionalEmail = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const auth_1 = require("../auth");
8
+ exports.sendTransactionalEmail = (0, pieces_framework_1.createAction)({
9
+ name: 'send_transactional_email',
10
+ displayName: 'Send Transactional Email',
11
+ description: 'Sends a transactional email to a contact using a pre-built template in Loops.',
12
+ auth: auth_1.loopsAuth,
13
+ props: {
14
+ email: pieces_framework_1.Property.ShortText({
15
+ displayName: 'To Email',
16
+ description: "The recipient's email address.",
17
+ required: true,
18
+ }),
19
+ transactionalId: pieces_framework_1.Property.ShortText({
20
+ displayName: 'Transactional Email ID',
21
+ description: 'The ID of the transactional email template in Loops (find it in your Loops dashboard).',
22
+ required: true,
23
+ }),
24
+ addToAudience: pieces_framework_1.Property.Checkbox({
25
+ displayName: 'Add to Audience',
26
+ description: 'If true, the recipient will be added to your Loops audience if they are not already a contact.',
27
+ required: false,
28
+ defaultValue: false,
29
+ }),
30
+ dataVariables: pieces_framework_1.Property.Object({
31
+ displayName: 'Data Variables',
32
+ description: 'Key-value pairs to populate dynamic variables in your email template (e.g. { "name": "Alice", "resetUrl": "https://..." }).',
33
+ required: false,
34
+ }),
35
+ },
36
+ run(context) {
37
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
38
+ const { email, transactionalId, addToAudience, dataVariables } = context.propsValue;
39
+ const body = {
40
+ email,
41
+ transactionalId,
42
+ };
43
+ if (typeof addToAudience === 'boolean') {
44
+ body['addToAudience'] = addToAudience;
45
+ }
46
+ if (dataVariables && typeof dataVariables === 'object') {
47
+ body['dataVariables'] = dataVariables;
48
+ }
49
+ const response = yield pieces_common_1.httpClient.sendRequest({
50
+ method: pieces_common_1.HttpMethod.POST,
51
+ url: `${auth_1.LOOPS_BASE_URL}/transactional`,
52
+ headers: {
53
+ Authorization: `Bearer ${context.auth}`,
54
+ 'Content-Type': 'application/json',
55
+ Accept: 'application/json',
56
+ },
57
+ body,
58
+ });
59
+ return response.body;
60
+ });
61
+ },
62
+ });
63
+ //# sourceMappingURL=send-transactional-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-transactional-email.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/loops/src/lib/actions/send-transactional-email.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAkE;AAClE,kCAAoD;AAEvC,QAAA,sBAAsB,GAAG,IAAA,+BAAY,EAAC;IACjD,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,0BAA0B;IACvC,WAAW,EACT,+EAA+E;IACjF,IAAI,EAAE,gBAAS;IACf,KAAK,EAAE;QACL,KAAK,EAAE,2BAAQ,CAAC,SAAS,CAAC;YACxB,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,eAAe,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAClC,WAAW,EAAE,wBAAwB;YACrC,WAAW,EACT,wFAAwF;YAC1F,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,aAAa,EAAE,2BAAQ,CAAC,QAAQ,CAAC;YAC/B,WAAW,EAAE,iBAAiB;YAC9B,WAAW,EACT,gGAAgG;YAClG,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;SACpB,CAAC;QACF,aAAa,EAAE,2BAAQ,CAAC,MAAM,CAAC;YAC7B,WAAW,EAAE,gBAAgB;YAC7B,WAAW,EACT,6HAA6H;YAC/H,QAAQ,EAAE,KAAK;SAChB,CAAC;KACH;IACK,GAAG,CAAC,OAAO;;YACf,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,GAC5D,OAAO,CAAC,UAAU,CAAC;YAErB,MAAM,IAAI,GAA4B;gBACpC,KAAK;gBACL,eAAe;aAChB,CAAC;YAEF,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC;YACxC,CAAC;YAED,IAAI,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACvD,IAAI,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC;YACxC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAA0B;gBACrE,MAAM,EAAE,0BAAU,CAAC,IAAI;gBACvB,GAAG,EAAE,GAAG,qBAAc,gBAAgB;gBACtC,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,IAAc,EAAE;oBACjD,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const LOOPS_BASE_URL = "https://app.loops.so/api/v1";
2
+ export declare const loopsAuth: import("@taskmagic/pieces-framework").SecretTextProperty<true>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loopsAuth = exports.LOOPS_BASE_URL = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ exports.LOOPS_BASE_URL = 'https://app.loops.so/api/v1';
8
+ exports.loopsAuth = pieces_framework_1.PieceAuth.SecretText({
9
+ displayName: 'API Key',
10
+ description: 'Your Loops API key. Generate one at [Settings → API](https://app.loops.so/settings?page=api) in your Loops dashboard.',
11
+ required: true,
12
+ validate: (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ auth }) {
13
+ var _b;
14
+ try {
15
+ const response = yield pieces_common_1.httpClient.sendRequest({
16
+ method: pieces_common_1.HttpMethod.GET,
17
+ url: `${exports.LOOPS_BASE_URL}/api-key`,
18
+ headers: {
19
+ Authorization: `Bearer ${auth}`,
20
+ Accept: 'application/json',
21
+ },
22
+ });
23
+ if (!response.body.success) {
24
+ return { valid: false, error: 'API key validation failed.' };
25
+ }
26
+ return { valid: true };
27
+ }
28
+ catch (e) {
29
+ const err = e;
30
+ if (((_b = err === null || err === void 0 ? void 0 : err.response) === null || _b === void 0 ? void 0 : _b.status) === 401) {
31
+ return {
32
+ valid: false,
33
+ error: 'Invalid API key. Please check your Loops API key.',
34
+ };
35
+ }
36
+ return {
37
+ valid: false,
38
+ error: 'Could not reach Loops API. Check your network.',
39
+ };
40
+ }
41
+ }),
42
+ });
43
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../../../packages/pieces/community/loops/src/lib/auth.ts"],"names":[],"mappings":";;;;AAAA,kEAAwD;AACxD,4DAAkE;AAErD,QAAA,cAAc,GAAG,6BAA6B,CAAC;AAE/C,QAAA,SAAS,GAAG,4BAAS,CAAC,UAAU,CAAC;IAC5C,WAAW,EAAE,SAAS;IACtB,WAAW,EACT,uHAAuH;IACzH,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,KAAiB,EAAE,oDAAZ,EAAE,IAAI,EAAE;;QACvB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAuB;gBAClE,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,GAAG,EAAE,GAAG,sBAAc,UAAU;gBAChC,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,EAAE;oBAC/B,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;YAC/D,CAAC;YAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAuC,CAAC;YACpD,IAAI,CAAA,MAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE,CAAC;gBAClC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,mDAAmD;iBAC3D,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,gDAAgD;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAA;CACF,CAAC,CAAC"}