@boxyhq/saml-jackson 1.9.2 → 1.9.5
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/controller/admin.d.ts +10 -4
- package/dist/controller/admin.js +6 -6
- package/dist/controller/admin.js.map +1 -1
- package/dist/controller/api.d.ts +3 -1
- package/dist/controller/api.js +19 -12
- package/dist/controller/api.js.map +1 -1
- package/dist/controller/connection/saml.js +2 -2
- package/dist/controller/connection/saml.js.map +1 -1
- package/dist/controller/logout.js +4 -4
- package/dist/controller/logout.js.map +1 -1
- package/dist/controller/oauth.js +4 -3
- package/dist/controller/oauth.js.map +1 -1
- package/dist/controller/saml-handler.js +4 -4
- package/dist/controller/saml-handler.js.map +1 -1
- package/dist/controller/setup-link.d.ts +4 -1
- package/dist/controller/setup-link.js +8 -8
- package/dist/controller/setup-link.js.map +1 -1
- package/dist/controller/utils.d.ts +16 -2
- package/dist/controller/utils.js +11 -8
- package/dist/controller/utils.js.map +1 -1
- package/dist/db/db.d.ts +4 -3
- package/dist/db/db.js +24 -10
- package/dist/db/db.js.map +1 -1
- package/dist/db/defaultDb.js +4 -0
- package/dist/db/defaultDb.js.map +1 -1
- package/dist/db/dynamoDb.d.ts +18 -0
- package/dist/db/dynamoDb.js +336 -0
- package/dist/db/dynamoDb.js.map +1 -0
- package/dist/db/mem.d.ts +4 -3
- package/dist/db/mem.js +15 -5
- package/dist/db/mem.js.map +1 -1
- package/dist/db/mongo.d.ts +4 -3
- package/dist/db/mongo.js +16 -5
- package/dist/db/mongo.js.map +1 -1
- package/dist/db/planetscale/entity/JacksonIndex.js.map +1 -1
- package/dist/db/planetscale/entity/JacksonStore.js.map +1 -1
- package/dist/db/planetscale/entity/JacksonTTL.js.map +1 -1
- package/dist/db/redis.d.ts +4 -3
- package/dist/db/redis.js +26 -5
- package/dist/db/redis.js.map +1 -1
- package/dist/db/sql/entity/JacksonIndex.js.map +1 -1
- package/dist/db/sql/entity/JacksonStore.js.map +1 -1
- package/dist/db/sql/entity/JacksonTTL.js.map +1 -1
- package/dist/db/sql/mariadb/entity/JacksonIndex.js.map +1 -1
- package/dist/db/sql/mariadb/entity/JacksonStore.js.map +1 -1
- package/dist/db/sql/mariadb/entity/JacksonTTL.js.map +1 -1
- package/dist/db/sql/mssql/entity/JacksonIndex.js.map +1 -1
- package/dist/db/sql/mssql/entity/JacksonStore.js.map +1 -1
- package/dist/db/sql/mssql/entity/JacksonTTL.js.map +1 -1
- package/dist/db/sql/sql.d.ts +4 -3
- package/dist/db/sql/sql.js +33 -4
- package/dist/db/sql/sql.js.map +1 -1
- package/dist/db/store.js +9 -4
- package/dist/db/store.js.map +1 -1
- package/dist/directory-sync/Base.d.ts +1 -0
- package/dist/directory-sync/Base.js +1 -0
- package/dist/directory-sync/Base.js.map +1 -1
- package/dist/directory-sync/DirectoryConfig.d.ts +22 -8
- package/dist/directory-sync/DirectoryConfig.js +38 -15
- package/dist/directory-sync/DirectoryConfig.js.map +1 -1
- package/dist/directory-sync/DirectoryGroups.d.ts +4 -5
- package/dist/directory-sync/DirectoryGroups.js +55 -77
- package/dist/directory-sync/DirectoryGroups.js.map +1 -1
- package/dist/directory-sync/DirectoryUsers.js +6 -6
- package/dist/directory-sync/DirectoryUsers.js.map +1 -1
- package/dist/directory-sync/Groups.d.ts +3 -2
- package/dist/directory-sync/Groups.js +48 -18
- package/dist/directory-sync/Groups.js.map +1 -1
- package/dist/directory-sync/Users.d.ts +1 -1
- package/dist/directory-sync/Users.js +18 -14
- package/dist/directory-sync/Users.js.map +1 -1
- package/dist/directory-sync/WebhookEventsLogger.d.ts +7 -6
- package/dist/directory-sync/WebhookEventsLogger.js +26 -18
- package/dist/directory-sync/WebhookEventsLogger.js.map +1 -1
- package/dist/directory-sync/events.js +7 -18
- package/dist/directory-sync/events.js.map +1 -1
- package/dist/directory-sync/index.d.ts +3 -2
- package/dist/directory-sync/index.js +6 -5
- package/dist/directory-sync/index.js.map +1 -1
- package/dist/directory-sync/transform.d.ts +9 -5
- package/dist/directory-sync/transform.js +26 -2
- package/dist/directory-sync/transform.js.map +1 -1
- package/dist/directory-sync/types.d.ts +24 -4
- package/dist/directory-sync/utils.d.ts +23 -26
- package/dist/directory-sync/utils.js +50 -86
- package/dist/directory-sync/utils.js.map +1 -1
- package/dist/ee/federated-saml/app.d.ts +4 -3
- package/dist/ee/federated-saml/app.js +4 -4
- package/dist/ee/federated-saml/app.js.map +1 -1
- package/dist/event/axios.d.ts +2 -0
- package/dist/event/axios.js +32 -0
- package/dist/event/axios.js.map +1 -0
- package/dist/event/index.d.ts +10 -0
- package/dist/event/index.js +54 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/types.d.ts +21 -0
- package/dist/event/types.js +3 -0
- package/dist/event/types.js.map +1 -0
- package/dist/event/utils.d.ts +4 -0
- package/dist/event/utils.js +39 -0
- package/dist/event/utils.js.map +1 -0
- package/dist/event/webhook.d.ts +3 -0
- package/dist/event/webhook.js +39 -0
- package/dist/event/webhook.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/loadConnection.js +1 -2
- package/dist/loadConnection.js.map +1 -1
- package/dist/saml-tracer/index.d.ts +2 -2
- package/dist/saml-tracer/index.js +5 -4
- package/dist/saml-tracer/index.js.map +1 -1
- package/dist/typings.d.ts +25 -7
- package/dist/typings.js +1 -0
- package/dist/typings.js.map +1 -1
- package/package.json +13 -10
@@ -1,36 +1,33 @@
|
|
1
|
-
import type {
|
2
|
-
import { UserPatchOperation } from '../typings';
|
3
|
-
declare const
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
1
|
+
import type { User } from '../typings';
|
2
|
+
import { UserPatchOperation, GroupPatchOperation } from '../typings';
|
3
|
+
declare const parseGroupOperation: (operation: GroupPatchOperation) => {
|
4
|
+
action: string;
|
5
|
+
members: {
|
6
|
+
value: string;
|
7
|
+
display?: string | undefined;
|
8
|
+
}[];
|
9
|
+
displayName?: undefined;
|
10
10
|
} | {
|
11
|
-
action:
|
12
|
-
displayName:
|
11
|
+
action: string;
|
12
|
+
displayName: unknown;
|
13
|
+
members?: undefined;
|
13
14
|
} | {
|
14
|
-
action:
|
15
|
+
action: string;
|
16
|
+
members?: undefined;
|
17
|
+
displayName?: undefined;
|
15
18
|
};
|
16
|
-
declare const toGroupMembers: (users: {
|
17
|
-
user_id: string;
|
18
|
-
}[]) => DirectorySyncGroupMember[];
|
19
19
|
declare const getDirectorySyncProviders: () => {
|
20
20
|
[K: string]: string;
|
21
21
|
};
|
22
|
-
declare const transformEventPayload: (event: DirectorySyncEventType, payload: {
|
23
|
-
directory: Directory;
|
24
|
-
group?: Group | null;
|
25
|
-
user?: User | null;
|
26
|
-
}) => DirectorySyncEvent;
|
27
|
-
declare const createHeader: (secret: string, event: DirectorySyncEvent) => Promise<{
|
28
|
-
'Content-Type': string;
|
29
|
-
'BoxyHQ-Signature': string;
|
30
|
-
}>;
|
31
|
-
declare const createSignatureString: (secret: string, event: DirectorySyncEvent) => Promise<string>;
|
32
22
|
declare const parseUserPatchRequest: (operation: UserPatchOperation) => {
|
33
23
|
attributes: Partial<User>;
|
34
24
|
rawAttributes: {};
|
35
25
|
};
|
36
|
-
|
26
|
+
declare const extractStandardUserAttributes: (body: any) => {
|
27
|
+
first_name: string;
|
28
|
+
last_name: string;
|
29
|
+
email: string;
|
30
|
+
active: true;
|
31
|
+
};
|
32
|
+
declare const updateRawUserAttributes: (raw: any, attributes: any) => any;
|
33
|
+
export { parseGroupOperation, getDirectorySyncProviders, parseUserPatchRequest, extractStandardUserAttributes, updateRawUserAttributes, };
|
@@ -1,46 +1,37 @@
|
|
1
1
|
"use strict";
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
-
});
|
10
|
-
};
|
11
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
4
|
};
|
14
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
-
exports.
|
6
|
+
exports.updateRawUserAttributes = exports.extractStandardUserAttributes = exports.parseUserPatchRequest = exports.getDirectorySyncProviders = exports.parseGroupOperation = void 0;
|
16
7
|
const typings_1 = require("../typings");
|
17
|
-
const
|
18
|
-
const
|
19
|
-
const
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
}
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
};
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
9
|
+
const parseGroupOperation = (operation) => {
|
10
|
+
const { op, path, value } = operation;
|
11
|
+
if (path === 'members') {
|
12
|
+
if (op === 'add') {
|
13
|
+
return {
|
14
|
+
action: 'addGroupMember',
|
15
|
+
members: value,
|
16
|
+
};
|
17
|
+
}
|
18
|
+
if (op === 'remove') {
|
19
|
+
return {
|
20
|
+
action: 'removeGroupMember',
|
21
|
+
members: value,
|
22
|
+
};
|
23
|
+
}
|
34
24
|
}
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
25
|
+
if (path && path.startsWith('members[value eq')) {
|
26
|
+
if (op === 'remove') {
|
27
|
+
return {
|
28
|
+
action: 'removeGroupMember',
|
29
|
+
members: [{ value: path.split('"')[1] }],
|
30
|
+
};
|
31
|
+
}
|
41
32
|
}
|
42
33
|
// Update group name
|
43
|
-
if (op === 'replace') {
|
34
|
+
if (op === 'replace' && 'displayName' in value) {
|
44
35
|
return {
|
45
36
|
action: 'updateGroupName',
|
46
37
|
displayName: value.displayName,
|
@@ -50,13 +41,7 @@ const parseGroupOperations = (operations) => {
|
|
50
41
|
action: 'unknown',
|
51
42
|
};
|
52
43
|
};
|
53
|
-
exports.
|
54
|
-
const toGroupMembers = (users) => {
|
55
|
-
return users.map((user) => ({
|
56
|
-
value: user.user_id,
|
57
|
-
}));
|
58
|
-
};
|
59
|
-
exports.toGroupMembers = toGroupMembers;
|
44
|
+
exports.parseGroupOperation = parseGroupOperation;
|
60
45
|
// List of directory sync providers
|
61
46
|
// TODO: Fix the return type
|
62
47
|
const getDirectorySyncProviders = () => {
|
@@ -66,51 +51,6 @@ const getDirectorySyncProviders = () => {
|
|
66
51
|
}, {});
|
67
52
|
};
|
68
53
|
exports.getDirectorySyncProviders = getDirectorySyncProviders;
|
69
|
-
const transformEventPayload = (event, payload) => {
|
70
|
-
const { directory, group, user } = payload;
|
71
|
-
const { tenant, product, id: directory_id } = directory;
|
72
|
-
const eventPayload = {
|
73
|
-
event,
|
74
|
-
tenant,
|
75
|
-
product,
|
76
|
-
directory_id,
|
77
|
-
};
|
78
|
-
// User events
|
79
|
-
if (['user.created', 'user.updated', 'user.deleted'].includes(event) && user) {
|
80
|
-
eventPayload['data'] = (0, transform_1.transformUser)(user);
|
81
|
-
}
|
82
|
-
// Group events
|
83
|
-
if (['group.created', 'group.updated', 'group.deleted'].includes(event) && group) {
|
84
|
-
eventPayload['data'] = (0, transform_1.transformGroup)(group);
|
85
|
-
}
|
86
|
-
// Group membership events
|
87
|
-
if (['group.user_added', 'group.user_removed'].includes(event) && user && group) {
|
88
|
-
eventPayload['data'] = (0, transform_1.transformUserGroup)(user, group);
|
89
|
-
}
|
90
|
-
return eventPayload;
|
91
|
-
};
|
92
|
-
exports.transformEventPayload = transformEventPayload;
|
93
|
-
// Create request headers
|
94
|
-
const createHeader = (secret, event) => __awaiter(void 0, void 0, void 0, function* () {
|
95
|
-
return {
|
96
|
-
'Content-Type': 'application/json',
|
97
|
-
'BoxyHQ-Signature': yield createSignatureString(secret, event),
|
98
|
-
};
|
99
|
-
});
|
100
|
-
exports.createHeader = createHeader;
|
101
|
-
// Create a signature string
|
102
|
-
const createSignatureString = (secret, event) => __awaiter(void 0, void 0, void 0, function* () {
|
103
|
-
if (!secret) {
|
104
|
-
return '';
|
105
|
-
}
|
106
|
-
const timestamp = new Date().getTime();
|
107
|
-
const signature = crypto_1.default
|
108
|
-
.createHmac('sha256', secret)
|
109
|
-
.update(`${timestamp}.${JSON.stringify(event)}`)
|
110
|
-
.digest('hex');
|
111
|
-
return `t=${timestamp},s=${signature}`;
|
112
|
-
});
|
113
|
-
exports.createSignatureString = createSignatureString;
|
114
54
|
// Parse the PATCH request body and return the user attributes (both standard and custom)
|
115
55
|
const parseUserPatchRequest = (operation) => {
|
116
56
|
const { value, path } = operation;
|
@@ -120,6 +60,7 @@ const parseUserPatchRequest = (operation) => {
|
|
120
60
|
active: 'active',
|
121
61
|
'name.givenName': 'first_name',
|
122
62
|
'name.familyName': 'last_name',
|
63
|
+
'emails[type eq "work"].value': 'email',
|
123
64
|
};
|
124
65
|
// If there is a path, then the value is the value
|
125
66
|
// For example { path: "active", value: true }
|
@@ -145,4 +86,27 @@ const parseUserPatchRequest = (operation) => {
|
|
145
86
|
};
|
146
87
|
};
|
147
88
|
exports.parseUserPatchRequest = parseUserPatchRequest;
|
89
|
+
// Extract standard attributes from the user body
|
90
|
+
const extractStandardUserAttributes = (body) => {
|
91
|
+
const { name, emails, userName, active } = body;
|
92
|
+
return {
|
93
|
+
first_name: name && 'givenName' in name ? name.givenName : '',
|
94
|
+
last_name: name && 'familyName' in name ? name.familyName : '',
|
95
|
+
email: emails && emails.length > 0 ? emails[0].value : userName,
|
96
|
+
active: active || true,
|
97
|
+
};
|
98
|
+
};
|
99
|
+
exports.extractStandardUserAttributes = extractStandardUserAttributes;
|
100
|
+
// Update raw user attributes
|
101
|
+
const updateRawUserAttributes = (raw, attributes) => {
|
102
|
+
const keys = Object.keys(attributes);
|
103
|
+
if (keys.length === 0) {
|
104
|
+
return raw;
|
105
|
+
}
|
106
|
+
for (const key of keys) {
|
107
|
+
lodash_1.default.set(raw, key, attributes[key]);
|
108
|
+
}
|
109
|
+
return raw;
|
110
|
+
};
|
111
|
+
exports.updateRawUserAttributes = updateRawUserAttributes;
|
148
112
|
//# sourceMappingURL=utils.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/directory-sync/utils.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/directory-sync/utils.ts"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import type { Storable, JacksonOption, SAMLFederationApp } from '../../typings';
|
1
|
+
import type { Storable, JacksonOption, SAMLFederationApp, Records } from '../../typings';
|
2
2
|
type NewAppParams = Pick<SAMLFederationApp, 'name' | 'tenant' | 'product' | 'acsUrl' | 'entityId'>;
|
3
3
|
export declare class App {
|
4
4
|
protected store: Storable;
|
@@ -11,10 +11,11 @@ export declare class App {
|
|
11
11
|
get(id: string): Promise<SAMLFederationApp>;
|
12
12
|
getByEntityId(entityId: string): Promise<SAMLFederationApp>;
|
13
13
|
update(id: string, params: Partial<Omit<SAMLFederationApp, 'id'>>): Promise<SAMLFederationApp>;
|
14
|
-
getAll({ pageOffset, pageLimit }: {
|
14
|
+
getAll({ pageOffset, pageLimit, pageToken, }: {
|
15
15
|
pageOffset?: number;
|
16
16
|
pageLimit?: number;
|
17
|
-
|
17
|
+
pageToken?: string;
|
18
|
+
}): Promise<Records<SAMLFederationApp>>;
|
18
19
|
delete(id: string): Promise<void>;
|
19
20
|
getMetadata(): Promise<{
|
20
21
|
xml: string;
|
@@ -65,10 +65,10 @@ class App {
|
|
65
65
|
if (!entityId) {
|
66
66
|
throw new error_1.JacksonError('Missing required parameters. Required parameters are: entityId', 400);
|
67
67
|
}
|
68
|
-
const apps = yield this.store.getByIndex({
|
68
|
+
const apps = (yield this.store.getByIndex({
|
69
69
|
name: utils_2.IndexNames.EntityID,
|
70
70
|
value: entityId,
|
71
|
-
});
|
71
|
+
})).data;
|
72
72
|
if (!apps || apps.length === 0) {
|
73
73
|
throw new error_1.JacksonError('SAML Federation app not found', 404);
|
74
74
|
}
|
@@ -92,9 +92,9 @@ class App {
|
|
92
92
|
});
|
93
93
|
}
|
94
94
|
// Get all apps
|
95
|
-
getAll({ pageOffset, pageLimit }) {
|
95
|
+
getAll({ pageOffset, pageLimit, pageToken, }) {
|
96
96
|
return __awaiter(this, void 0, void 0, function* () {
|
97
|
-
const apps = yield this.store.getAll(pageOffset, pageLimit);
|
97
|
+
const apps = (yield this.store.getAll(pageOffset, pageLimit, pageToken));
|
98
98
|
return apps;
|
99
99
|
});
|
100
100
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/ee/federated-saml/app.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,kDAA+C;AAC/C,wCAAmD;AACnD,kDAAsD;AACtD,0CAAwD;AACxD,kDAA8E;AAI9E,MAAa,GAAG;IAId,YAAY,EAAE,KAAK,EAAE,IAAI,EAA4C;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,8DAA8D;IACjD,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAgB;;YAC3E,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE;gBACxD,MAAM,IAAI,oBAAY,CACpB,+FAA+F,EAC/F,GAAG,CACJ,CAAC;aACH;YAED,IAAA,gCAAwB,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAE1C,MAAM,EAAE,GAAG,IAAA,aAAK,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAElC,MAAM,GAAG,GAAsB;gBAC7B,EAAE;gBACF,IAAI;gBACJ,MAAM;gBACN,OAAO;gBACP,MAAM;gBACN,QAAQ;gBACR,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;aACnB,CAAC;YAEF,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE;gBAC5B,IAAI,EAAE,kBAAU,CAAC,QAAQ;gBACzB,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YAEH,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,mCAAmC;IACtB,GAAG,CAAC,EAAU;;YACzB,IAAI,CAAC,EAAE,EAAE;gBACP,MAAM,IAAI,oBAAY,CAAC,0DAA0D,EAAE,GAAG,CAAC,CAAC;aACzF;YAED,MAAM,GAAG,GAAsB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAExD,IAAI,CAAC,GAAG,EAAE;gBACR,MAAM,IAAI,oBAAY,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;aAC9D;YAED,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,6BAA6B;IAChB,aAAa,CAAC,QAAgB;;YACzC,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,oBAAY,CAAC,gEAAgE,EAAE,GAAG,CAAC,CAAC;aAC/F;YAED,MAAM,IAAI,GAAwB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/ee/federated-saml/app.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,32 @@
|
|
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 axios_1 = __importDefault(require("axios"));
|
7
|
+
const retry = 3;
|
8
|
+
const retryDelay = 3000;
|
9
|
+
const axiosInstance = axios_1.default.create();
|
10
|
+
// Axios interceptors to handle the Webhook retries
|
11
|
+
axiosInstance.interceptors.response.use(undefined, (err) => {
|
12
|
+
const config = err.config;
|
13
|
+
if (!config) {
|
14
|
+
return Promise.reject(err);
|
15
|
+
}
|
16
|
+
config.__retryCount = config.__retryCount || 0;
|
17
|
+
if (config.__retryCount >= retry) {
|
18
|
+
return Promise.reject(err);
|
19
|
+
}
|
20
|
+
config.__retryCount += 1;
|
21
|
+
const backoff = new Promise(function (resolve) {
|
22
|
+
setTimeout(function () {
|
23
|
+
resolve(1);
|
24
|
+
}, retryDelay);
|
25
|
+
});
|
26
|
+
return backoff.then(function () {
|
27
|
+
console.info(`Retrying sending webhook event to ${config.url}... Attempt ${config.__retryCount}`);
|
28
|
+
return axiosInstance(config);
|
29
|
+
});
|
30
|
+
});
|
31
|
+
exports.default = axiosInstance;
|
32
|
+
//# sourceMappingURL=axios.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"axios.js","sourceRoot":"","sources":["../../src/event/axios.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAE1B,MAAM,KAAK,GAAG,CAAC,CAAC;AAChB,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,aAAa,GAAG,eAAK,CAAC,MAAM,EAAE,CAAC;AAErC,mDAAmD;AACnD,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAQ,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAE1B,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAC5B;IAED,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,YAAY,IAAI,KAAK,EAAE;QAChC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;KAC5B;IAED,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,UAAU,OAAO;QAC3C,UAAU,CAAC;YACT,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,GAAG,eAAe,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAClG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,kBAAe,aAAa,CAAC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import type { Directory, JacksonOption, SAMLSSORecord, EventType, SSOConnectionEventType, Webhook, EventPayloadSchema, OIDCSSORecord } from '../typings';
|
2
|
+
export default class Event {
|
3
|
+
private webhook;
|
4
|
+
constructor({ opts }: {
|
5
|
+
opts: JacksonOption;
|
6
|
+
});
|
7
|
+
notify<T extends EventType>(event: T, data: T extends SSOConnectionEventType ? SAMLSSORecord | OIDCSSORecord : Directory): Promise<import("axios").AxiosResponse<any, any> | undefined>;
|
8
|
+
private constructPayload;
|
9
|
+
sendWebhookEvent(webhook: Webhook | undefined, payload: EventPayloadSchema): Promise<import("axios").AxiosResponse<any, any> | undefined>;
|
10
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
const webhook_1 = require("./webhook");
|
13
|
+
const utils_1 = require("./utils");
|
14
|
+
class Event {
|
15
|
+
constructor({ opts }) {
|
16
|
+
this.webhook = opts.webhook;
|
17
|
+
}
|
18
|
+
notify(event, data) {
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
20
|
+
const payload = this.constructPayload(event, data);
|
21
|
+
return this.sendWebhookEvent(this.webhook, payload);
|
22
|
+
});
|
23
|
+
}
|
24
|
+
constructPayload(event, data) {
|
25
|
+
let transformedData;
|
26
|
+
if ('idpMetadata' in data) {
|
27
|
+
transformedData = (0, utils_1.transformSAMLSSOConnection)(data);
|
28
|
+
}
|
29
|
+
else if ('oidcProvider' in data) {
|
30
|
+
transformedData = (0, utils_1.transformOIDCSSOConnection)(data);
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
transformedData = (0, utils_1.transformDirectoryConnection)(data);
|
34
|
+
}
|
35
|
+
const { tenant, product } = data;
|
36
|
+
const payload = {
|
37
|
+
event,
|
38
|
+
tenant,
|
39
|
+
product,
|
40
|
+
data: transformedData,
|
41
|
+
};
|
42
|
+
return payload;
|
43
|
+
}
|
44
|
+
sendWebhookEvent(webhook, payload) {
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
46
|
+
if (!(webhook === null || webhook === void 0 ? void 0 : webhook.endpoint) || !webhook.secret) {
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
return yield (0, webhook_1.sendPayloadToWebhook)(webhook, payload);
|
50
|
+
});
|
51
|
+
}
|
52
|
+
}
|
53
|
+
exports.default = Event;
|
54
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAWA,uCAAiD;AACjD,mCAIiB;AAEjB,MAAqB,KAAK;IAGxB,YAAY,EAAE,IAAI,EAA2B;QAC3C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;IAEK,MAAM,CACV,KAAQ,EACR,IAAkF;;YAElF,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAEnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;KAAA;IAEO,gBAAgB,CAAC,KAAgB,EAAE,IAA+C;QACxF,IAAI,eAA0B,CAAC;QAE/B,IAAI,aAAa,IAAI,IAAI,EAAE;YACzB,eAAe,GAAG,IAAA,kCAA0B,EAAC,IAAI,CAAC,CAAC;SACpD;aAAM,IAAI,cAAc,IAAI,IAAI,EAAE;YACjC,eAAe,GAAG,IAAA,kCAA0B,EAAC,IAAI,CAAC,CAAC;SACpD;aAAM;YACL,eAAe,GAAG,IAAA,oCAA4B,EAAC,IAAI,CAAC,CAAC;SACtD;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEjC,MAAM,OAAO,GAAuB;YAClC,KAAK;YACL,MAAM;YACN,OAAO;YACP,IAAI,EAAE,eAAe;SACtB,CAAC;QAEF,OAAO,OAAO,CAAC;IACjB,CAAC;IAEK,gBAAgB,CAAC,OAA4B,EAAE,OAA2B;;YAC9E,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACzC,OAAO;aACR;YAED,OAAO,MAAM,IAAA,8BAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;KAAA;CACF;AA9CD,wBA8CC"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import EventController from '../event';
|
2
|
+
import type { Directory, DirectorySyncEventType, SAMLSSORecord, OIDCSSORecord, DirectorySyncEventData } from '../typings';
|
3
|
+
export type IEventController = InstanceType<typeof EventController>;
|
4
|
+
export type SSOConnectionEventType = 'sso.created' | 'sso.deleted' | 'sso.activated' | 'sso.deactivated';
|
5
|
+
export type DsyncConnectionEventType = 'dsync.created' | 'dsync.deleted' | 'dsync.activated' | 'dsync.deactivated';
|
6
|
+
export type EventType = SSOConnectionEventType | DsyncConnectionEventType | DirectorySyncEventType;
|
7
|
+
export type SAMLSSOConnectionEventData = Pick<SAMLSSORecord, 'name' | 'description' | 'clientID' | 'clientSecret'> & {
|
8
|
+
provider: string;
|
9
|
+
friendlyProviderName: string;
|
10
|
+
};
|
11
|
+
export type OIDCSSOConnectionEventData = Pick<OIDCSSORecord, 'name' | 'description' | 'clientID' | 'clientSecret'> & {
|
12
|
+
provider: string | undefined;
|
13
|
+
};
|
14
|
+
export type DsyncConnectionEventData = Pick<Directory, 'id' | 'name' | 'type'>;
|
15
|
+
export type EventData = SAMLSSOConnectionEventData | OIDCSSOConnectionEventData | DsyncConnectionEventData | DirectorySyncEventData;
|
16
|
+
export type EventPayloadSchema = {
|
17
|
+
tenant: string;
|
18
|
+
product: string;
|
19
|
+
event: EventType;
|
20
|
+
data: EventData;
|
21
|
+
};
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/event/types.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
import type { Directory, DsyncConnectionEventData, SAMLSSOConnectionEventData, OIDCSSOConnectionEventData, SAMLSSORecord, OIDCSSORecord } from '../typings';
|
2
|
+
export declare const transformSAMLSSOConnection: (data: SAMLSSORecord) => SAMLSSOConnectionEventData;
|
3
|
+
export declare const transformOIDCSSOConnection: (data: OIDCSSORecord) => OIDCSSOConnectionEventData;
|
4
|
+
export declare const transformDirectoryConnection: (data: Directory) => DsyncConnectionEventData;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.transformDirectoryConnection = exports.transformOIDCSSOConnection = exports.transformSAMLSSOConnection = void 0;
|
4
|
+
const utils_1 = require("../controller/utils");
|
5
|
+
const transformSAMLSSOConnection = (data) => {
|
6
|
+
const { name, description, clientID, clientSecret, idpMetadata } = data;
|
7
|
+
const { provider } = idpMetadata;
|
8
|
+
return {
|
9
|
+
name,
|
10
|
+
description,
|
11
|
+
clientID,
|
12
|
+
clientSecret,
|
13
|
+
provider,
|
14
|
+
friendlyProviderName: (0, utils_1.findFriendlyProviderName)(provider),
|
15
|
+
};
|
16
|
+
};
|
17
|
+
exports.transformSAMLSSOConnection = transformSAMLSSOConnection;
|
18
|
+
const transformOIDCSSOConnection = (data) => {
|
19
|
+
const { name, description, clientID, clientSecret, oidcProvider } = data;
|
20
|
+
const { provider } = oidcProvider;
|
21
|
+
return {
|
22
|
+
name,
|
23
|
+
description,
|
24
|
+
clientID,
|
25
|
+
clientSecret,
|
26
|
+
provider,
|
27
|
+
};
|
28
|
+
};
|
29
|
+
exports.transformOIDCSSOConnection = transformOIDCSSOConnection;
|
30
|
+
const transformDirectoryConnection = (data) => {
|
31
|
+
const { id, name, type } = data;
|
32
|
+
return {
|
33
|
+
id,
|
34
|
+
name,
|
35
|
+
type,
|
36
|
+
};
|
37
|
+
};
|
38
|
+
exports.transformDirectoryConnection = transformDirectoryConnection;
|
39
|
+
//# sourceMappingURL=utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/event/utils.ts"],"names":[],"mappings":";;;AAQA,+CAA+D;AAExD,MAAM,0BAA0B,GAAG,CAAC,IAAmB,EAA8B,EAAE;IAC5F,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACxE,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAEjC,OAAO;QACL,IAAI;QACJ,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,oBAAoB,EAAE,IAAA,gCAAwB,EAAC,QAAQ,CAAC;KACzD,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,0BAA0B,8BAYrC;AAEK,MAAM,0BAA0B,GAAG,CAAC,IAAmB,EAA8B,EAAE;IAC5F,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC;IAElC,OAAO;QACL,IAAI;QACJ,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,0BAA0B,8BAWrC;AAEK,MAAM,4BAA4B,GAAG,CAAC,IAAe,EAA4B,EAAE;IACxF,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEhC,OAAO;QACL,EAAE;QACF,IAAI;QACJ,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,4BAA4B,gCAQvC"}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
import type { EventPayloadSchema, Webhook } from '../typings';
|
2
|
+
export declare const createSignatureString: (secret: string, payload: EventPayloadSchema) => string;
|
3
|
+
export declare const sendPayloadToWebhook: (webhook: Webhook, payload: EventPayloadSchema) => Promise<import("axios").AxiosResponse<any, any>>;
|
@@ -0,0 +1,39 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.sendPayloadToWebhook = exports.createSignatureString = void 0;
|
16
|
+
const crypto_1 = __importDefault(require("crypto"));
|
17
|
+
const axios_1 = __importDefault(require("./axios"));
|
18
|
+
const createSignatureString = (secret, payload) => {
|
19
|
+
if (!secret) {
|
20
|
+
return '';
|
21
|
+
}
|
22
|
+
const timestamp = new Date().getTime();
|
23
|
+
const signature = crypto_1.default
|
24
|
+
.createHmac('sha256', secret)
|
25
|
+
.update(`${timestamp}.${JSON.stringify(payload)}`)
|
26
|
+
.digest('hex');
|
27
|
+
return `t=${timestamp},s=${signature}`;
|
28
|
+
};
|
29
|
+
exports.createSignatureString = createSignatureString;
|
30
|
+
const sendPayloadToWebhook = (webhook, payload) => __awaiter(void 0, void 0, void 0, function* () {
|
31
|
+
return yield axios_1.default.post(webhook.endpoint, payload, {
|
32
|
+
headers: {
|
33
|
+
'Content-Type': 'application/json',
|
34
|
+
'BoxyHQ-Signature': (0, exports.createSignatureString)(webhook.secret, payload),
|
35
|
+
},
|
36
|
+
});
|
37
|
+
});
|
38
|
+
exports.sendPayloadToWebhook = sendPayloadToWebhook;
|
39
|
+
//# sourceMappingURL=webhook.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/event/webhook.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,oDAA4B;AAC5B,oDAA4B;AAErB,MAAM,qBAAqB,GAAG,CAAC,MAAc,EAAE,OAA2B,EAAE,EAAE;IACnF,IAAI,CAAC,MAAM,EAAE;QACX,OAAO,EAAE,CAAC;KACX;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IAEvC,MAAM,SAAS,GAAG,gBAAM;SACrB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;SACjD,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjB,OAAO,KAAK,SAAS,MAAM,SAAS,EAAE,CAAC;AACzC,CAAC,CAAC;AAbW,QAAA,qBAAqB,yBAahC;AAEK,MAAM,oBAAoB,GAAG,CAAO,OAAgB,EAAE,OAA2B,EAAE,EAAE;IAC1F,OAAO,MAAM,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE;QACjD,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,kBAAkB,EAAE,IAAA,6BAAqB,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;SACnE;KACF,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AAPW,QAAA,oBAAoB,wBAO/B"}
|
package/dist/index.js
CHANGED
@@ -58,6 +58,7 @@ const federated_saml_1 = __importDefault(require("./ee/federated-saml"));
|
|
58
58
|
const checkLicense_1 = __importDefault(require("./ee/common/checkLicense"));
|
59
59
|
const branding_1 = require("./ee/branding");
|
60
60
|
const saml_tracer_1 = __importDefault(require("./saml-tracer"));
|
61
|
+
const event_1 = __importDefault(require("./event"));
|
61
62
|
const defaultOpts = (opts) => {
|
62
63
|
const newOpts = Object.assign({}, opts);
|
63
64
|
if (!newOpts.externalUrl) {
|
@@ -93,7 +94,8 @@ const controllers = (opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
94
|
const certificateStore = db.store('x509:certificates');
|
94
95
|
const settingsStore = db.store('portal:settings');
|
95
96
|
const samlTracer = new saml_tracer_1.default({ db });
|
96
|
-
const
|
97
|
+
const eventController = new event_1.default({ opts });
|
98
|
+
const connectionAPIController = new api_1.ConnectionAPIController({ connectionStore, opts, eventController });
|
97
99
|
const adminController = new admin_1.AdminController({ connectionStore, samlTracer });
|
98
100
|
const healthCheckController = new health_check_1.HealthCheckController({ healthCheckStore });
|
99
101
|
yield healthCheckController.init();
|
@@ -121,7 +123,7 @@ const controllers = (opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
121
123
|
});
|
122
124
|
const oidcDiscoveryController = new oidc_discovery_1.OidcDiscoveryController({ opts });
|
123
125
|
const spConfig = new sp_config_1.SPSAMLConfig(opts);
|
124
|
-
const directorySyncController = yield (0, directory_sync_1.default)({ db, opts });
|
126
|
+
const directorySyncController = yield (0, directory_sync_1.default)({ db, opts, eventController });
|
125
127
|
// Enterprise Features
|
126
128
|
const samlFederatedController = yield (0, federated_saml_1.default)({ db, opts, samlTracer });
|
127
129
|
const brandingController = (yield (0, checkLicense_1.default)(opts.boxyhqLicenseKey))
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,iDAAyB;AACzB,+DAAuC;AACvC,sEAA8C;AAC9C,qDAA8D;AAC9D,8CAAqD;AACrD,0CAA2D;AAC3D,8CAAqD;AACrD,4DAAkE;AAClE,gDAAuD;AACvD,sEAAiD;AACjD,gEAAsE;AACtE,sDAAsD;AACtD,wDAA8D;AAC9D,sDAA6D;AAC7D,kDAAoC;AACpC,yEAAwF;AACxF,4EAAoD;AACpD,4CAAmD;AACnD,gEAAuC;
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|