@knocklabs/client 0.8.18 → 0.8.19
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/api.d.ts +25 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +84 -0
- package/dist/cjs/api.js +2 -133
- package/dist/cjs/api.js.map +1 -1
- package/dist/cjs/clients/feed/feed.js +2 -939
- package/dist/cjs/clients/feed/feed.js.map +1 -1
- package/dist/cjs/clients/feed/index.js +2 -34
- package/dist/cjs/clients/feed/index.js.map +1 -1
- package/dist/cjs/clients/feed/store.js +2 -111
- package/dist/cjs/clients/feed/store.js.map +1 -1
- package/dist/cjs/clients/feed/utils.js +2 -26
- package/dist/cjs/clients/feed/utils.js.map +1 -1
- package/dist/cjs/clients/preferences/index.js +2 -373
- package/dist/cjs/clients/preferences/index.js.map +1 -1
- package/dist/cjs/clients/users/index.js +2 -185
- package/dist/cjs/clients/users/index.js.map +1 -1
- package/dist/cjs/index.js +2 -102
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/knock.js +6 -89
- package/dist/cjs/knock.js.map +1 -1
- package/dist/cjs/networkStatus.js +2 -18
- package/dist/cjs/networkStatus.js.map +1 -1
- package/dist/clients/feed/feed.d.ts +64 -0
- package/dist/clients/feed/feed.d.ts.map +1 -0
- package/dist/clients/feed/feed.js +572 -0
- package/dist/clients/feed/index.d.ts +15 -0
- package/dist/clients/feed/index.d.ts.map +1 -0
- package/dist/clients/feed/index.js +34 -0
- package/dist/clients/feed/interfaces.d.ts +60 -0
- package/dist/clients/feed/interfaces.d.ts.map +1 -0
- package/dist/clients/feed/interfaces.js +2 -0
- package/dist/clients/feed/store.d.ts +3 -0
- package/dist/clients/feed/store.d.ts.map +1 -0
- package/dist/clients/feed/store.js +72 -0
- package/dist/clients/feed/types.d.ts +34 -0
- package/dist/clients/feed/types.d.ts.map +1 -0
- package/dist/clients/feed/types.js +2 -0
- package/dist/clients/feed/utils.d.ts +4 -0
- package/dist/clients/feed/utils.d.ts.map +1 -0
- package/dist/clients/feed/utils.js +21 -0
- package/dist/clients/preferences/index.d.ts +46 -0
- package/dist/clients/preferences/index.d.ts.map +1 -0
- package/dist/clients/preferences/index.js +129 -0
- package/dist/clients/preferences/interfaces.d.ts +26 -0
- package/dist/clients/preferences/interfaces.d.ts.map +1 -0
- package/dist/clients/preferences/interfaces.js +2 -0
- package/dist/clients/users/index.d.ts +16 -0
- package/dist/clients/users/index.d.ts.map +1 -0
- package/dist/clients/users/index.js +56 -0
- package/dist/clients/users/interfaces.d.ts +8 -0
- package/dist/clients/users/interfaces.d.ts.map +1 -0
- package/dist/clients/users/interfaces.js +2 -0
- package/dist/esm/api.js +44 -84
- package/dist/esm/api.js.map +1 -1
- package/dist/esm/clients/feed/feed.js +296 -603
- package/dist/esm/clients/feed/feed.js.map +1 -1
- package/dist/esm/clients/feed/index.js +28 -12
- package/dist/esm/clients/feed/index.js.map +1 -1
- package/dist/esm/clients/feed/store.js +37 -71
- package/dist/esm/clients/feed/store.js.map +1 -1
- package/dist/esm/clients/feed/utils.js +10 -15
- package/dist/esm/clients/feed/utils.js.map +1 -1
- package/dist/esm/clients/preferences/index.js +79 -146
- package/dist/esm/clients/preferences/index.js.map +1 -1
- package/dist/esm/clients/users/index.js +52 -76
- package/dist/esm/clients/users/index.js.map +1 -1
- package/dist/esm/index.js +12 -11
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/knock.js +72 -51
- package/dist/esm/knock.js.map +1 -1
- package/dist/esm/networkStatus.js +14 -10
- package/dist/esm/networkStatus.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/interfaces.d.ts +41 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +2 -0
- package/dist/knock.d.ts +30 -0
- package/dist/knock.d.ts.map +1 -0
- package/dist/knock.js +135 -0
- package/dist/networkStatus.d.ts +8 -0
- package/dist/networkStatus.d.ts.map +1 -0
- package/dist/networkStatus.js +18 -0
- package/dist/types/api.d.ts +0 -2
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/clients/feed/feed.d.ts +12 -4
- package/dist/types/clients/feed/feed.d.ts.map +1 -1
- package/dist/types/clients/feed/index.d.ts +4 -0
- package/dist/types/clients/feed/index.d.ts.map +1 -1
- package/dist/types/clients/feed/store.d.ts.map +1 -1
- package/dist/types/clients/feed/types.d.ts +0 -1
- package/dist/types/clients/feed/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces.d.ts +7 -0
- package/dist/types/interfaces.d.ts.map +1 -1
- package/dist/types/knock.d.ts +12 -4
- package/dist/types/knock.d.ts.map +1 -1
- package/package.json +12 -8
- package/dist/cjs/clients/feed/interfaces.js +0 -6
- package/dist/cjs/clients/feed/interfaces.js.map +0 -1
- package/dist/cjs/clients/feed/types.js +0 -6
- package/dist/cjs/clients/feed/types.js.map +0 -1
- package/dist/cjs/clients/preferences/interfaces.js +0 -6
- package/dist/cjs/clients/preferences/interfaces.js.map +0 -1
- package/dist/cjs/clients/users/interfaces.js +0 -6
- package/dist/cjs/clients/users/interfaces.js.map +0 -1
- package/dist/cjs/interfaces.js +0 -6
- package/dist/cjs/interfaces.js.map +0 -1
- package/dist/esm/clients/feed/interfaces.js +0 -2
- package/dist/esm/clients/feed/interfaces.js.map +0 -1
- package/dist/esm/clients/feed/types.js +0 -2
- package/dist/esm/clients/feed/types.js.map +0 -1
- package/dist/esm/clients/preferences/interfaces.js +0 -2
- package/dist/esm/clients/preferences/interfaces.js.map +0 -1
- package/dist/esm/clients/users/interfaces.js +0 -2
- package/dist/esm/clients/users/interfaces.js.map +0 -1
- package/dist/esm/interfaces.js +0 -2
- package/dist/esm/interfaces.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/clients/users/index.ts"],"sourcesContent":["import { ApiResponse } from \"../../api\";\nimport { ChannelData } from \"../../interfaces\";\nimport Knock from \"../../knock\";\nimport {\n GetPreferencesOptions,\n PreferenceOptions,\n PreferenceSet,\n SetPreferencesProperties,\n} from \"../preferences/interfaces\";\nimport { GetChannelDataInput, SetChannelDataInput } from \"./interfaces\";\n\nconst DEFAULT_PREFERENCE_SET_ID = \"default\";\n\nclass UserClient {\n private instance: Knock;\n\n constructor(instance: Knock) {\n this.instance = instance;\n }\n\n async getAllPreferences() {\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences`,\n });\n\n return this.handleResponse<PreferenceSet[]>(result);\n }\n\n async getPreferences(\n options: GetPreferencesOptions = {},\n ): Promise<PreferenceSet> {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n params: { tenant: options.tenant },\n });\n\n return this.handleResponse<PreferenceSet>(result);\n }\n\n async setPreferences(\n preferenceSet: SetPreferencesProperties,\n options: PreferenceOptions = {},\n ): Promise<PreferenceSet> {\n const preferenceSetId = options.preferenceSet || DEFAULT_PREFERENCE_SET_ID;\n\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/preferences/${preferenceSetId}`,\n data: preferenceSet,\n });\n\n return this.handleResponse<PreferenceSet>(result);\n }\n\n async getChannelData<T = any>(params: GetChannelDataInput) {\n const result = await this.instance.client().makeRequest({\n method: \"GET\",\n url: `/v1/users/${this.instance.userId}/channel_data/${params.channelId}`,\n });\n\n return this.handleResponse<ChannelData<T>>(result);\n }\n\n async setChannelData<T = any>({\n channelId,\n channelData,\n }: SetChannelDataInput) {\n const result = await this.instance.client().makeRequest({\n method: \"PUT\",\n url: `/v1/users/${this.instance.userId}/channel_data/${channelId}`,\n data: { data: channelData },\n });\n\n return this.handleResponse<ChannelData<T>>(result);\n }\n\n private handleResponse<T>(response: ApiResponse) {\n if (response.statusCode === \"error\") {\n throw new Error(response.error || response.body);\n }\n\n return response.body as T;\n }\n}\n\nexport default UserClient;\n"],"names":["DEFAULT_PREFERENCE_SET_ID","UserClient","instance","__publicField","result","options","preferenceSetId","preferenceSet","params","channelId","channelData","response"],"mappings":"oRAWA,MAAMA,EAA4B,UAElC,MAAMC,CAAW,CAGf,YAAYC,EAAiB,CAFrBC,EAAA,iBAGN,KAAK,SAAWD,CAClB,CAEA,MAAM,mBAAoB,CACxB,MAAME,EAAS,MAAM,KAAK,SAAS,OAAA,EAAS,YAAY,CACtD,OAAQ,MACR,IAAK,aAAa,KAAK,SAAS,MAAM,cAAA,CACvC,EAEM,OAAA,KAAK,eAAgCA,CAAM,CACpD,CAEA,MAAM,eACJC,EAAiC,GACT,CAClB,MAAAC,EAAkBD,EAAQ,eAAiBL,EAE3CI,EAAS,MAAM,KAAK,SAAS,OAAA,EAAS,YAAY,CACtD,OAAQ,MACR,IAAK,aAAa,KAAK,SAAS,MAAM,gBAAgBE,CAAe,GACrE,OAAQ,CAAE,OAAQD,EAAQ,MAAO,CAAA,CAClC,EAEM,OAAA,KAAK,eAA8BD,CAAM,CAClD,CAEA,MAAM,eACJG,EACAF,EAA6B,GACL,CAClB,MAAAC,EAAkBD,EAAQ,eAAiBL,EAE3CI,EAAS,MAAM,KAAK,SAAS,OAAA,EAAS,YAAY,CACtD,OAAQ,MACR,IAAK,aAAa,KAAK,SAAS,MAAM,gBAAgBE,CAAe,GACrE,KAAMC,CAAA,CACP,EAEM,OAAA,KAAK,eAA8BH,CAAM,CAClD,CAEA,MAAM,eAAwBI,EAA6B,CACzD,MAAMJ,EAAS,MAAM,KAAK,SAAS,OAAA,EAAS,YAAY,CACtD,OAAQ,MACR,IAAK,aAAa,KAAK,SAAS,MAAM,iBAAiBI,EAAO,SAAS,EAAA,CACxE,EAEM,OAAA,KAAK,eAA+BJ,CAAM,CACnD,CAEA,MAAM,eAAwB,CAC5B,UAAAK,EACA,YAAAC,CAAA,EACsB,CACtB,MAAMN,EAAS,MAAM,KAAK,SAAS,OAAA,EAAS,YAAY,CACtD,OAAQ,MACR,IAAK,aAAa,KAAK,SAAS,MAAM,iBAAiBK,CAAS,GAChE,KAAM,CAAE,KAAMC,CAAY,CAAA,CAC3B,EAEM,OAAA,KAAK,eAA+BN,CAAM,CACnD,CAEQ,eAAkBO,EAAuB,CAC3C,GAAAA,EAAS,aAAe,QAC1B,MAAM,IAAI,MAAMA,EAAS,OAASA,EAAS,IAAI,EAGjD,OAAOA,EAAS,IAClB,CACF"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,102 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
var _exportNames = {
|
|
9
|
-
FeedClient: true,
|
|
10
|
-
Feed: true
|
|
11
|
-
};
|
|
12
|
-
Object.defineProperty(exports, "Feed", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function get() {
|
|
15
|
-
return _feed.Feed;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "FeedClient", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function get() {
|
|
21
|
-
return _feed["default"];
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
exports["default"] = void 0;
|
|
25
|
-
var _knock = _interopRequireDefault(require("./knock"));
|
|
26
|
-
var _feed = _interopRequireWildcard(require("./clients/feed"));
|
|
27
|
-
var _interfaces = require("./interfaces");
|
|
28
|
-
Object.keys(_interfaces).forEach(function (key) {
|
|
29
|
-
if (key === "default" || key === "__esModule") return;
|
|
30
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
31
|
-
if (key in exports && exports[key] === _interfaces[key]) return;
|
|
32
|
-
Object.defineProperty(exports, key, {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
get: function get() {
|
|
35
|
-
return _interfaces[key];
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
var _types = require("./clients/feed/types");
|
|
40
|
-
Object.keys(_types).forEach(function (key) {
|
|
41
|
-
if (key === "default" || key === "__esModule") return;
|
|
42
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
43
|
-
if (key in exports && exports[key] === _types[key]) return;
|
|
44
|
-
Object.defineProperty(exports, key, {
|
|
45
|
-
enumerable: true,
|
|
46
|
-
get: function get() {
|
|
47
|
-
return _types[key];
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
var _interfaces2 = require("./clients/feed/interfaces");
|
|
52
|
-
Object.keys(_interfaces2).forEach(function (key) {
|
|
53
|
-
if (key === "default" || key === "__esModule") return;
|
|
54
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
55
|
-
if (key in exports && exports[key] === _interfaces2[key]) return;
|
|
56
|
-
Object.defineProperty(exports, key, {
|
|
57
|
-
enumerable: true,
|
|
58
|
-
get: function get() {
|
|
59
|
-
return _interfaces2[key];
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
var _interfaces3 = require("./clients/preferences/interfaces");
|
|
64
|
-
Object.keys(_interfaces3).forEach(function (key) {
|
|
65
|
-
if (key === "default" || key === "__esModule") return;
|
|
66
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
67
|
-
if (key in exports && exports[key] === _interfaces3[key]) return;
|
|
68
|
-
Object.defineProperty(exports, key, {
|
|
69
|
-
enumerable: true,
|
|
70
|
-
get: function get() {
|
|
71
|
-
return _interfaces3[key];
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
var _users = require("./clients/users");
|
|
76
|
-
Object.keys(_users).forEach(function (key) {
|
|
77
|
-
if (key === "default" || key === "__esModule") return;
|
|
78
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
79
|
-
if (key in exports && exports[key] === _users[key]) return;
|
|
80
|
-
Object.defineProperty(exports, key, {
|
|
81
|
-
enumerable: true,
|
|
82
|
-
get: function get() {
|
|
83
|
-
return _users[key];
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
var _networkStatus = require("./networkStatus");
|
|
88
|
-
Object.keys(_networkStatus).forEach(function (key) {
|
|
89
|
-
if (key === "default" || key === "__esModule") return;
|
|
90
|
-
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
91
|
-
if (key in exports && exports[key] === _networkStatus[key]) return;
|
|
92
|
-
Object.defineProperty(exports, key, {
|
|
93
|
-
enumerable: true,
|
|
94
|
-
get: function get() {
|
|
95
|
-
return _networkStatus[key];
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
100
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
101
|
-
var _default = exports["default"] = _knock["default"];
|
|
102
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t=require("./clients/feed/index.js"),u=require("./knock.js"),e=require("./networkStatus.js"),r=require("./clients/feed/feed.js");exports.FeedClient=t.default;exports.default=u.default;exports.NetworkStatus=e.NetworkStatus;exports.isRequestInFlight=e.isRequestInFlight;exports.Feed=r.default;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/cjs/knock.js
CHANGED
|
@@ -1,89 +1,6 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports["default"] = void 0;
|
|
8
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
-
var _api = _interopRequireDefault(require("./api"));
|
|
12
|
-
var _feed = _interopRequireDefault(require("./clients/feed"));
|
|
13
|
-
var _preferences = _interopRequireDefault(require("./clients/preferences"));
|
|
14
|
-
var _users = _interopRequireDefault(require("./clients/users"));
|
|
15
|
-
var DEFAULT_HOST = "https://api.knock.app";
|
|
16
|
-
var Knock = /*#__PURE__*/function () {
|
|
17
|
-
function Knock(apiKey) {
|
|
18
|
-
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
19
|
-
(0, _classCallCheck2["default"])(this, Knock);
|
|
20
|
-
this.apiKey = apiKey;
|
|
21
|
-
(0, _defineProperty2["default"])(this, "host", void 0);
|
|
22
|
-
(0, _defineProperty2["default"])(this, "apiClient", null);
|
|
23
|
-
(0, _defineProperty2["default"])(this, "userId", void 0);
|
|
24
|
-
(0, _defineProperty2["default"])(this, "userToken", void 0);
|
|
25
|
-
(0, _defineProperty2["default"])(this, "feeds", new _feed["default"](this));
|
|
26
|
-
(0, _defineProperty2["default"])(this, "preferences", new _preferences["default"](this));
|
|
27
|
-
(0, _defineProperty2["default"])(this, "user", new _users["default"](this));
|
|
28
|
-
this.host = options.host || DEFAULT_HOST;
|
|
29
|
-
|
|
30
|
-
// Fail loudly if we're using the wrong API key
|
|
31
|
-
if (this.apiKey && this.apiKey.startsWith("sk_")) {
|
|
32
|
-
throw new Error("[Knock] You are using your secret API key on the client. Please use the public key.");
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
(0, _createClass2["default"])(Knock, [{
|
|
36
|
-
key: "client",
|
|
37
|
-
value: function client() {
|
|
38
|
-
if (!this.userId) {
|
|
39
|
-
console.warn("[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n ");
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Initiate a new API client if we don't have one yet
|
|
43
|
-
if (!this.apiClient) {
|
|
44
|
-
this.apiClient = new _api["default"]({
|
|
45
|
-
apiKey: this.apiKey,
|
|
46
|
-
host: this.host,
|
|
47
|
-
userToken: this.userToken
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
return this.apiClient;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/*
|
|
54
|
-
Authenticates the current user. In non-sandbox environments
|
|
55
|
-
the userToken must be specified.
|
|
56
|
-
*/
|
|
57
|
-
}, {
|
|
58
|
-
key: "authenticate",
|
|
59
|
-
value: function authenticate(userId, userToken) {
|
|
60
|
-
this.userId = userId;
|
|
61
|
-
this.userToken = userToken;
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/*
|
|
66
|
-
Returns whether or this Knock instance is authenticated. Passing `true` will check the presence
|
|
67
|
-
of the userToken as well.
|
|
68
|
-
*/
|
|
69
|
-
}, {
|
|
70
|
-
key: "isAuthenticated",
|
|
71
|
-
value: function isAuthenticated() {
|
|
72
|
-
var checkUserToken = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
73
|
-
return checkUserToken ? this.userId && this.userToken : this.userId;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Used to teardown any connected instances
|
|
77
|
-
}, {
|
|
78
|
-
key: "teardown",
|
|
79
|
-
value: function teardown() {
|
|
80
|
-
if (!this.apiClient) return;
|
|
81
|
-
if (this.apiClient.socket) {
|
|
82
|
-
this.apiClient.socket.disconnect();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}]);
|
|
86
|
-
return Knock;
|
|
87
|
-
}();
|
|
88
|
-
var _default = exports["default"] = Knock;
|
|
89
|
-
//# sourceMappingURL=knock.js.map
|
|
1
|
+
"use strict";var u=Object.defineProperty;var c=(s,e,t)=>e in s?u(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t;var i=(s,e,t)=>(c(s,typeof e!="symbol"?e+"":e,t),t);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const l=require("jwt-decode"),d=require("./api.js"),k=require("./clients/feed/index.js"),p=require("./clients/preferences/index.js"),f=require("./clients/users/index.js"),T="https://api.knock.app";class g{constructor(e,t={}){i(this,"host");i(this,"apiClient",null);i(this,"userId");i(this,"userToken");i(this,"logLevel");i(this,"tokenExpirationTimer",null);i(this,"feeds",new k.default(this));i(this,"preferences",new p.default(this));i(this,"user",new f.default(this));if(this.apiKey=e,this.host=t.host||T,this.logLevel=t.logLevel,this.log("Initialized Knock instance"),this.apiKey&&this.apiKey.startsWith("sk_"))throw new Error("[Knock] You are using your secret API key on the client. Please use the public key.")}client(){return this.userId||console.warn(`[Knock] You must call authenticate(userId, userToken) first before trying to make a request.
|
|
2
|
+
Typically you'll see this message when you're creating a feed instance before having called
|
|
3
|
+
authenticate with a user Id and token. That means we won't know who to issue the request
|
|
4
|
+
to Knock on behalf of.
|
|
5
|
+
`),this.apiClient||(this.apiClient=this.createApiClient()),this.apiClient}authenticate(e,t,n){let r=!1;this.apiClient&&(this.userId!==e||this.userToken!==t)&&(this.log("userId or userToken changed; reinitializing connections"),this.feeds.teardownInstances(),this.teardown(),r=!0),this.userId=e,this.userToken=t,this.log(`Authenticated with userId ${e}`),this.userToken&&(n==null?void 0:n.onUserTokenExpiring)instanceof Function&&this.maybeScheduleUserTokenExpiration(n.onUserTokenExpiring,n.timeBeforeExpirationInMs),r&&(this.apiClient=this.createApiClient(),this.feeds.reinitializeInstances(),this.log("Reinitialized real-time connections"))}isAuthenticated(e=!1){return e?!!(this.userId&&this.userToken):!!this.userId}teardown(){var e;this.tokenExpirationTimer&&clearTimeout(this.tokenExpirationTimer),(e=this.apiClient)!=null&&e.socket&&this.apiClient.socket.isConnected()&&this.apiClient.socket.disconnect()}log(e){this.logLevel==="debug"&&console.log(`[Knock] ${e}`)}createApiClient(){return new d.default({apiKey:this.apiKey,host:this.host,userToken:this.userToken})}async maybeScheduleUserTokenExpiration(e,t=3e4){if(!this.userToken)return;const n=l.jwtDecode(this.userToken),r=(n.exp??0)*1e3,o=Date.now();if(r&&r>o){const h=r-t-o;this.tokenExpirationTimer=setTimeout(async()=>{const a=await e(this.userToken,n);typeof a=="string"&&this.authenticate(this.userId,a,{onUserTokenExpiring:e,timeBeforeExpirationInMs:t})},h)}}}exports.default=g;
|
|
6
|
+
//# sourceMappingURL=knock.js.map
|
package/dist/cjs/knock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knock.js","
|
|
1
|
+
{"version":3,"file":"knock.js","sources":["../../src/knock.ts"],"sourcesContent":["import { jwtDecode } from \"jwt-decode\";\n\nimport ApiClient from \"./api\";\nimport FeedClient from \"./clients/feed\";\nimport Preferences from \"./clients/preferences\";\nimport UserClient from \"./clients/users\";\nimport {\n AuthenticateOptions,\n KnockOptions,\n LogLevel,\n UserTokenExpiringCallback,\n} from \"./interfaces\";\n\nconst DEFAULT_HOST = \"https://api.knock.app\";\n\nclass Knock {\n private host: string;\n private apiClient: ApiClient | null = null;\n public userId: string | undefined;\n public userToken?: string;\n public logLevel?: LogLevel;\n private tokenExpirationTimer: ReturnType<typeof setTimeout> | null = null;\n readonly feeds = new FeedClient(this);\n readonly preferences = new Preferences(this);\n readonly user = new UserClient(this);\n\n constructor(\n readonly apiKey: string,\n options: KnockOptions = {},\n ) {\n this.host = options.host || DEFAULT_HOST;\n this.logLevel = options.logLevel;\n\n this.log(\"Initialized Knock instance\");\n\n // Fail loudly if we're using the wrong API key\n if (this.apiKey && this.apiKey.startsWith(\"sk_\")) {\n throw new Error(\n \"[Knock] You are using your secret API key on the client. Please use the public key.\",\n );\n }\n }\n\n client() {\n if (!this.userId) {\n console.warn(\n `[Knock] You must call authenticate(userId, userToken) first before trying to make a request.\n Typically you'll see this message when you're creating a feed instance before having called\n authenticate with a user Id and token. That means we won't know who to issue the request\n to Knock on behalf of.\n `,\n );\n }\n\n // Initiate a new API client if we don't have one yet\n if (!this.apiClient) {\n this.apiClient = this.createApiClient();\n }\n\n return this.apiClient;\n }\n\n /*\n Authenticates the current user. In non-sandbox environments\n the userToken must be specified.\n */\n authenticate(\n userId: string,\n userToken?: string,\n options?: AuthenticateOptions,\n ) {\n let reinitializeApi = false;\n const currentApiClient = this.apiClient;\n\n // If we've previously been initialized and the values have now changed, then we\n // need to reinitialize any stateful connections we have\n if (\n currentApiClient &&\n (this.userId !== userId || this.userToken !== userToken)\n ) {\n this.log(\"userId or userToken changed; reinitializing connections\");\n this.feeds.teardownInstances();\n this.teardown();\n reinitializeApi = true;\n }\n\n this.userId = userId;\n this.userToken = userToken;\n\n this.log(`Authenticated with userId ${userId}`);\n\n if (this.userToken && options?.onUserTokenExpiring instanceof Function) {\n this.maybeScheduleUserTokenExpiration(\n options.onUserTokenExpiring,\n options.timeBeforeExpirationInMs,\n );\n }\n\n // If we get the signal to reinitialize the api client, then we want to create a new client\n // and the reinitialize any existing feed real-time connections we have so everything continues\n // to work with the new credentials we've been given\n if (reinitializeApi) {\n this.apiClient = this.createApiClient();\n this.feeds.reinitializeInstances();\n this.log(\"Reinitialized real-time connections\");\n }\n\n return;\n }\n\n /*\n Returns whether or this Knock instance is authenticated. Passing `true` will check the presence\n of the userToken as well.\n */\n isAuthenticated(checkUserToken = false) {\n return checkUserToken ? !!(this.userId && this.userToken) : !!this.userId;\n }\n\n // Used to teardown any connected instances\n teardown() {\n if (this.tokenExpirationTimer) {\n clearTimeout(this.tokenExpirationTimer);\n }\n if (this.apiClient?.socket && this.apiClient.socket.isConnected()) {\n this.apiClient.socket.disconnect();\n }\n }\n\n log(message: string) {\n if (this.logLevel === \"debug\") {\n console.log(`[Knock] ${message}`);\n }\n }\n\n /**\n * Initiates an API client\n */\n private createApiClient() {\n return new ApiClient({\n apiKey: this.apiKey,\n host: this.host,\n userToken: this.userToken,\n });\n }\n\n private async maybeScheduleUserTokenExpiration(\n callbackFn: UserTokenExpiringCallback,\n timeBeforeExpirationInMs: number = 30_000,\n ) {\n if (!this.userToken) return;\n\n const decoded = jwtDecode(this.userToken);\n const expiresAtMs = (decoded.exp ?? 0) * 1000;\n const nowMs = Date.now();\n\n // Expiration is in the future\n if (expiresAtMs && expiresAtMs > nowMs) {\n // Check how long until the token should be regenerated\n // | ----------------- | ----------------------- |\n // ^ now ^ expiration offset ^ expires at\n const msInFuture = expiresAtMs - timeBeforeExpirationInMs - nowMs;\n\n this.tokenExpirationTimer = setTimeout(async () => {\n const newToken = await callbackFn(this.userToken as string, decoded);\n\n // Reauthenticate which will handle reinitializing sockets\n if (typeof newToken === \"string\") {\n this.authenticate(this.userId!, newToken, {\n onUserTokenExpiring: callbackFn,\n timeBeforeExpirationInMs: timeBeforeExpirationInMs,\n });\n }\n }, msInFuture);\n }\n }\n}\n\nexport default Knock;\n"],"names":["DEFAULT_HOST","Knock","apiKey","options","__publicField","FeedClient","Preferences","UserClient","userId","userToken","reinitializeApi","checkUserToken","_a","message","ApiClient","callbackFn","timeBeforeExpirationInMs","decoded","jwtDecode","expiresAtMs","nowMs","msInFuture","newToken"],"mappings":"+bAaMA,EAAe,wBAErB,MAAMC,CAAM,CAWV,YACWC,EACTC,EAAwB,GACxB,CAbMC,EAAA,aACAA,EAAA,iBAA8B,MAC/BA,EAAA,eACAA,EAAA,kBACAA,EAAA,iBACCA,EAAA,4BAA6D,MAC5DA,EAAA,aAAQ,IAAIC,UAAW,IAAI,GAC3BD,EAAA,mBAAc,IAAIE,UAAY,IAAI,GAClCF,EAAA,YAAO,IAAIG,UAAW,IAAI,GAYjC,GATS,KAAA,OAAAL,EAGJ,KAAA,KAAOC,EAAQ,MAAQH,EAC5B,KAAK,SAAWG,EAAQ,SAExB,KAAK,IAAI,4BAA4B,EAGjC,KAAK,QAAU,KAAK,OAAO,WAAW,KAAK,EAC7C,MAAM,IAAI,MACR,qFAAA,CAGN,CAEA,QAAS,CACH,OAAC,KAAK,QACA,QAAA,KACN;AAAA;AAAA;AAAA;AAAA,SAAA,EASC,KAAK,YACH,KAAA,UAAY,KAAK,mBAGjB,KAAK,SACd,CAMA,aACEK,EACAC,EACAN,EACA,CACA,IAAIO,EAAkB,GACG,KAAK,YAM3B,KAAK,SAAWF,GAAU,KAAK,YAAcC,KAE9C,KAAK,IAAI,yDAAyD,EAClE,KAAK,MAAM,oBACX,KAAK,SAAS,EACIC,EAAA,IAGpB,KAAK,OAASF,EACd,KAAK,UAAYC,EAEZ,KAAA,IAAI,6BAA6BD,CAAM,EAAE,EAE1C,KAAK,YAAaL,GAAA,YAAAA,EAAS,+BAA+B,UACvD,KAAA,iCACHA,EAAQ,oBACRA,EAAQ,wBAAA,EAORO,IACG,KAAA,UAAY,KAAK,kBACtB,KAAK,MAAM,wBACX,KAAK,IAAI,qCAAqC,EAIlD,CAMA,gBAAgBC,EAAiB,GAAO,CAC/B,OAAAA,EAAiB,CAAC,EAAE,KAAK,QAAU,KAAK,WAAa,CAAC,CAAC,KAAK,MACrE,CAGA,UAAW,OACL,KAAK,sBACP,aAAa,KAAK,oBAAoB,GAEpCC,EAAA,KAAK,YAAL,MAAAA,EAAgB,QAAU,KAAK,UAAU,OAAO,eAC7C,KAAA,UAAU,OAAO,YAE1B,CAEA,IAAIC,EAAiB,CACf,KAAK,WAAa,SACZ,QAAA,IAAI,WAAWA,CAAO,EAAE,CAEpC,CAKQ,iBAAkB,CACxB,OAAO,IAAIC,EAAAA,QAAU,CACnB,OAAQ,KAAK,OACb,KAAM,KAAK,KACX,UAAW,KAAK,SAAA,CACjB,CACH,CAEA,MAAc,iCACZC,EACAC,EAAmC,IACnC,CACA,GAAI,CAAC,KAAK,UAAW,OAEf,MAAAC,EAAUC,EAAAA,UAAU,KAAK,SAAS,EAClCC,GAAeF,EAAQ,KAAO,GAAK,IACnCG,EAAQ,KAAK,MAGf,GAAAD,GAAeA,EAAcC,EAAO,CAIhC,MAAAC,EAAaF,EAAcH,EAA2BI,EAEvD,KAAA,qBAAuB,WAAW,SAAY,CACjD,MAAME,EAAW,MAAMP,EAAW,KAAK,UAAqBE,CAAO,EAG/D,OAAOK,GAAa,UACjB,KAAA,aAAa,KAAK,OAASA,EAAU,CACxC,oBAAqBP,EACrB,yBAAAC,CAAA,CACD,GAEFK,CAAU,CACf,CACF,CACF"}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.NetworkStatus = void 0;
|
|
7
|
-
exports.isRequestInFlight = isRequestInFlight;
|
|
8
|
-
var NetworkStatus = exports.NetworkStatus = /*#__PURE__*/function (NetworkStatus) {
|
|
9
|
-
NetworkStatus["loading"] = "loading";
|
|
10
|
-
NetworkStatus["fetchMore"] = "fetchMore";
|
|
11
|
-
NetworkStatus["ready"] = "ready";
|
|
12
|
-
NetworkStatus["error"] = "error";
|
|
13
|
-
return NetworkStatus;
|
|
14
|
-
}({});
|
|
15
|
-
function isRequestInFlight(networkStatus) {
|
|
16
|
-
return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(networkStatus);
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=networkStatus.js.map
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var r=(e=>(e.loading="loading",e.fetchMore="fetchMore",e.ready="ready",e.error="error",e))(r||{});function i(e){return["loading","fetchMore"].includes(e)}exports.NetworkStatus=r;exports.isRequestInFlight=i;
|
|
2
|
+
//# sourceMappingURL=networkStatus.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"networkStatus.js","
|
|
1
|
+
{"version":3,"file":"networkStatus.js","sources":["../../src/networkStatus.ts"],"sourcesContent":["export enum NetworkStatus {\n // Performing a top level loading operation\n loading = \"loading\",\n\n // Performing a fetch more on some already loaded data\n fetchMore = \"fetchMore\",\n\n // No operation is currently in progress\n ready = \"ready\",\n\n // The last operation failed with an error\n error = \"error\",\n}\n\nexport function isRequestInFlight(networkStatus: NetworkStatus): boolean {\n return [NetworkStatus.loading, NetworkStatus.fetchMore].includes(\n networkStatus,\n );\n}\n"],"names":["NetworkStatus","isRequestInFlight","networkStatus"],"mappings":"gFAAY,IAAAA,GAAAA,IAEVA,EAAA,QAAU,UAGVA,EAAA,UAAY,YAGZA,EAAA,MAAQ,QAGRA,EAAA,MAAQ,QAXEA,IAAAA,GAAA,CAAA,CAAA,EAcL,SAASC,EAAkBC,EAAuC,CAChE,MAAA,CAAC,UAAuB,WAAA,EAAyB,SACtDA,CAAA,CAEJ"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { StoreApi } from "zustand";
|
|
2
|
+
import Knock from "../../knock";
|
|
3
|
+
import { FeedClientOptions, FetchFeedOptions } from "./interfaces";
|
|
4
|
+
import { BindableFeedEvent, FeedEventCallback, FeedItemOrItems, FeedRealTimeCallback, FeedStoreState } from "./types";
|
|
5
|
+
export type Status = "seen" | "read" | "interacted" | "archived" | "unseen" | "unread" | "unarchived";
|
|
6
|
+
declare class Feed {
|
|
7
|
+
readonly knock: Knock;
|
|
8
|
+
readonly feedId: string;
|
|
9
|
+
private userFeedId;
|
|
10
|
+
private channel?;
|
|
11
|
+
private broadcaster;
|
|
12
|
+
private defaultOptions;
|
|
13
|
+
private broadcastChannel;
|
|
14
|
+
private disconnectTimer;
|
|
15
|
+
private hasSubscribedToRealTimeUpdates;
|
|
16
|
+
store: StoreApi<FeedStoreState>;
|
|
17
|
+
constructor(knock: Knock, feedId: string, options: FeedClientOptions);
|
|
18
|
+
/**
|
|
19
|
+
* Used to reinitialize a current feed instance, which is useful when reauthenticating users
|
|
20
|
+
*/
|
|
21
|
+
reinitialize(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Cleans up a feed instance by destroying the store and disconnecting
|
|
24
|
+
* an open socket connection.
|
|
25
|
+
*/
|
|
26
|
+
teardown(): void;
|
|
27
|
+
/** Tears down an instance and removes it entirely from the feed manager */
|
|
28
|
+
dispose(): void;
|
|
29
|
+
listenForUpdates(): void;
|
|
30
|
+
on(eventName: BindableFeedEvent, callback: FeedEventCallback | FeedRealTimeCallback): void;
|
|
31
|
+
off(eventName: BindableFeedEvent, callback: FeedEventCallback | FeedRealTimeCallback): void;
|
|
32
|
+
getState(): FeedStoreState;
|
|
33
|
+
markAsSeen(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
34
|
+
markAllAsSeen(): Promise<import("../../api").ApiResponse>;
|
|
35
|
+
markAsUnseen(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
36
|
+
markAsRead(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
37
|
+
markAllAsRead(): Promise<import("../../api").ApiResponse>;
|
|
38
|
+
markAsUnread(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
39
|
+
markAsInteracted(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
40
|
+
markAsArchived(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
41
|
+
markAllAsArchived(): Promise<import("../../api").ApiResponse>;
|
|
42
|
+
markAsUnarchived(itemOrItems: FeedItemOrItems): Promise<import("../../api").ApiResponse>;
|
|
43
|
+
fetch(options?: FetchFeedOptions): Promise<{
|
|
44
|
+
status: "ok" | "error";
|
|
45
|
+
data: any;
|
|
46
|
+
} | undefined>;
|
|
47
|
+
fetchNextPage(): Promise<void>;
|
|
48
|
+
private broadcast;
|
|
49
|
+
private onNewMessageReceived;
|
|
50
|
+
private buildUserFeedId;
|
|
51
|
+
private optimisticallyPerformStatusUpdate;
|
|
52
|
+
private makeStatusUpdate;
|
|
53
|
+
private makeBulkStatusUpdate;
|
|
54
|
+
private setupBroadcastChannel;
|
|
55
|
+
private broadcastOverChannel;
|
|
56
|
+
private initializeRealtimeConnection;
|
|
57
|
+
/**
|
|
58
|
+
* Listen for changes to document visibility and automatically disconnect
|
|
59
|
+
* or reconnect the socket after a delay
|
|
60
|
+
*/
|
|
61
|
+
private setupAutoSocketManager;
|
|
62
|
+
}
|
|
63
|
+
export default Feed;
|
|
64
|
+
//# sourceMappingURL=feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/clients/feed/feed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,MAAM,aAAa,CAAC;AAGhC,OAAO,EACL,iBAAiB,EAIjB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EAEjB,iBAAiB,EAEjB,eAAe,EAEf,oBAAoB,EACpB,cAAc,EACf,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,MAAM,GACd,MAAM,GACN,MAAM,GACN,YAAY,GACZ,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,YAAY,CAAC;AASjB,cAAM,IAAI;IAaN,QAAQ,CAAC,KAAK,EAAE,KAAK;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAbzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAC,CAAU;IAC1B,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,gBAAgB,CAA2B;IACnD,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,8BAA8B,CAAkB;IAGjD,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;gBAG5B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,iBAAiB;IAgB5B;;OAEG;IACH,YAAY;IAWZ;;;OAGG;IACH,QAAQ;IAkBR,2EAA2E;IAC3E,OAAO;IAWP,gBAAgB;IAmBhB,EAAE,CACA,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;IAKpD,GAAG,CACD,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;IAKpD,QAAQ;IAIF,UAAU,CAAC,WAAW,EAAE,eAAe;IAYvC,aAAa;IA+Cb,YAAY,CAAC,WAAW,EAAE,eAAe;IAWzC,UAAU,CAAC,WAAW,EAAE,eAAe;IAYvC,aAAa;IA+Cb,YAAY,CAAC,WAAW,EAAE,eAAe;IAWzC,gBAAgB,CAAC,WAAW,EAAE,eAAe;IAuB7C,cAAc,CAAC,WAAW,EAAE,eAAe;IA0E3C,iBAAiB;IAgCjB,gBAAgB,CAAC,WAAW,EAAE,eAAe;IAS7C,KAAK,CAAC,OAAO,GAAE,gBAAqB;;;;IA6EpC,aAAa;IAgBnB,OAAO,CAAC,SAAS;YAQH,oBAAoB;IAelC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iCAAiC;YAmD3B,gBAAgB;YAmBhB,oBAAoB;IAyBlC,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,4BAA4B;IA4BpC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;CA4B/B;AAED,eAAe,IAAI,CAAC"}
|