@ztimson/momentum 0.50.5 → 0.50.7

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/auth.d.ts CHANGED
@@ -1,13 +1,41 @@
1
1
  import { Api } from './api';
2
2
  import { PathEvent, PathEventEmitter } from '@ztimson/utils';
3
+ import { Meta } from './core';
3
4
  import { User } from './users';
4
5
  export type AuthOptions = {
5
6
  /** Path to login page */
6
7
  loginUrl?: string;
7
8
  };
9
+ export type UserToken = Meta & {
10
+ name: string;
11
+ owner: string;
12
+ token: string;
13
+ expire: null | Date;
14
+ };
15
+ export declare class Token extends PathEventEmitter {
16
+ private api;
17
+ constructor(api: Api);
18
+ all(username: string): Promise<UserToken[]>;
19
+ create(token: {
20
+ name: string;
21
+ owner: string;
22
+ expire: null | Date;
23
+ }): Promise<UserToken>;
24
+ delete(id: string): Promise<void>;
25
+ }
26
+ export declare class Totp {
27
+ private api;
28
+ constructor(api: Api);
29
+ disable(username: string): import('@ztimson/utils').PromiseProgress<void>;
30
+ enable: (username: string) => import('@ztimson/utils').PromiseProgress<void>;
31
+ reset(username: string): import('@ztimson/utils').PromiseProgress<void>;
32
+ setup(username: string, method?: string, totp?: string): import('@ztimson/utils').PromiseProgress<void>;
33
+ }
8
34
  export declare class Auth extends PathEventEmitter {
9
35
  private readonly opts;
10
36
  private readonly api;
37
+ token: Token;
38
+ totp: Totp;
11
39
  private _permissions;
12
40
  get permissions(): string[];
13
41
  set permissions(perms: string[]);
@@ -21,7 +49,10 @@ export declare class Auth extends PathEventEmitter {
21
49
  hasFatal: (...events: (string | PathEvent)[]) => void;
22
50
  hasAllFatal: (...events: (string | PathEvent)[]) => void;
23
51
  knownHost(host?: string): Promise<void>;
24
- login(username: string, password: string, totp?: string): Promise<User | null>;
52
+ login(username: string, password: string, opts?: {
53
+ totp?: string;
54
+ expire?: number | Date | null;
55
+ }): Promise<User | null>;
25
56
  loginRedirect(host?: string): Promise<string>;
26
57
  logout(): void;
27
58
  register(u: Partial<User> & {
@@ -36,9 +67,5 @@ export declare class Auth extends PathEventEmitter {
36
67
  permissions: string[];
37
68
  } | null>;
38
69
  updatePassword(username: string, password: string, oldPassword?: string): Promise<void>;
39
- disableTotp(username: string): import('@ztimson/utils').PromiseProgress<void>;
40
- enableTotp: (username: string) => import('@ztimson/utils').PromiseProgress<void>;
41
- resetTotp(username: string): import('@ztimson/utils').PromiseProgress<void>;
42
- setupTotp(username: string, method?: string, totp?: string): import('@ztimson/utils').PromiseProgress<void>;
43
70
  }
44
71
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAiB,SAAS,EAAE,gBAAgB,EAAM,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,WAAW,GAAG;IACzB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,CAAA;AAED,qBAAa,IAAK,SAAQ,gBAAgB;IAmBV,OAAO,CAAC,QAAQ,CAAC,IAAI;IAlBpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAO;IAE3B,OAAO,CAAC,YAAY,CAAgB;IACpC,IAAI,WAAW,IACQ,MAAM,EAAE,CADgB;IAC/C,IAAI,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAG9B;IAED,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,SAAS,CAAuB;IAC1D,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,EAKrC;gBAEW,GAAG,EAAE,GAAG,GAAG,MAAM,EAAmB,IAAI,GAAE,WAAgB;IA6BtE,MAAM,cAAe,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,iBAAmD;IAC9F,GAAG,cAAe,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,aAAgD;IACxF,MAAM,cAAe,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,aAAmD;IAC9F,QAAQ,cAAe,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,UAAqD;IAClG,WAAW,cAAe,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,UAAwD;IAExG,SAAS,CAAC,IAAI,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAmB9E,aAAa,CAAC,IAAI,GAAE,MAAwB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB9D,MAAM,IAAI,IAAI;IAMR,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACtD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7B,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAC,GAAG,IAAI,CAAC;IAiBxG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa7F,WAAW,CAAC,QAAQ,EAAE,MAAM;IAI5B,UAAU,aAEU,MAAM,oDAFE;IAE5B,SAAS,CAAC,QAAQ,EAAE,MAAM;IAI1B,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAQ,EAAE,IAAI,CAAC,EAAE,MAAM;CAMzD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,gBAAgB,EAAM,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEpC,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnF,qBAAa,MAAO,SAAQ,gBAAgB;IAqC/B,OAAO,CAAC,GAAG;IAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnCvD,IAAI,MAAM,YAAyD;IAEnE,OAAO,CAAC,cAAc,CAAS;IAC/B,IAAI,aAAa,IACkB,OAAO,CADS;IACnD,OAAO,KAAK,aAAa,QAGxB;IAED,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,IAAI,QAAQ,IAAI,QAAQ,CAWvB;IAED,IAAI,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGvD;IAED,OAAO,CAAC,IAAI,CAAC,CAAU;IACvB,IAAI,GAAG,IAAI,OAAO,CAIjB;gBAEmB,GAAG,EAAE,GAAG,EAAmB,QAAQ,EAAE,QAAQ;IAK3D,MAAM,CAAC,MAAM,UAAQ,EAAE,SAAS,UAAO;IAiF7C,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,KAAK;IAqIhC,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa7C,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,gBAAgB,EAAM,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAC,GAAG,EAAC,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEpC,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAEnF,qBAAa,MAAO,SAAQ,gBAAgB;IAqC/B,OAAO,CAAC,GAAG;IAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnCvD,IAAI,MAAM,YAAyD;IAEnE,OAAO,CAAC,cAAc,CAAS;IAC/B,IAAI,aAAa,IACkB,OAAO,CADS;IACnD,OAAO,KAAK,aAAa,QAGxB;IAED,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,IAAI,QAAQ,IAAI,QAAQ,CAWvB;IAED,IAAI,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAGvD;IAED,OAAO,CAAC,IAAI,CAAC,CAAU;IACvB,IAAI,GAAG,IAAI,OAAO,CAIjB;gBAEmB,GAAG,EAAE,GAAG,EAAmB,QAAQ,EAAE,QAAQ;IAK3D,MAAM,CAAC,MAAM,UAAQ,EAAE,SAAS,UAAO;IAiF7C,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,KAAK;IAoIhC,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAa7C,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAO3C"}
package/dist/index.cjs CHANGED
@@ -1128,10 +1128,51 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1128
1128
  });
1129
1129
  }
1130
1130
  }
1131
+ class Token extends PathEventEmitter {
1132
+ constructor(api) {
1133
+ super();
1134
+ this.api = api;
1135
+ }
1136
+ all(username) {
1137
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${username}` }).then((resp) => {
1138
+ this.emit(PES`token/${username}:r`, resp);
1139
+ return resp;
1140
+ });
1141
+ }
1142
+ create(token) {
1143
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${token.owner}`, body: token }).then((resp) => {
1144
+ this.emit(PES`token/${token.owner}:c`, token);
1145
+ return resp;
1146
+ });
1147
+ }
1148
+ delete(id) {
1149
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${id}`, method: "DELETE" }).then(() => this.emit(PES`token/${id}:d`, id));
1150
+ }
1151
+ }
1152
+ class Totp {
1153
+ constructor(api) {
1154
+ __publicField(this, "enable", this.reset);
1155
+ this.api = api;
1156
+ }
1157
+ disable(username) {
1158
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, method: "DELETE" });
1159
+ }
1160
+ reset(username) {
1161
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, method: "POST" });
1162
+ }
1163
+ setup(username, method = "app", totp) {
1164
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, body: clean({
1165
+ method,
1166
+ totp
1167
+ }) });
1168
+ }
1169
+ }
1131
1170
  class Auth extends PathEventEmitter {
1132
1171
  constructor(api, opts = {}) {
1133
1172
  super();
1134
1173
  __publicField(this, "api");
1174
+ __publicField(this, "token");
1175
+ __publicField(this, "totp");
1135
1176
  __publicField(this, "_permissions", []);
1136
1177
  __publicField(this, "_user");
1137
1178
  // Permission helpers
@@ -1140,9 +1181,11 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1140
1181
  __publicField(this, "hasAll", (...events) => PathEvent.hasAll(this.permissions, ...events));
1141
1182
  __publicField(this, "hasFatal", (...events) => PathEvent.hasFatal(this.permissions, ...events));
1142
1183
  __publicField(this, "hasAllFatal", (...events) => PathEvent.hasAllFatal(this.permissions, ...events));
1143
- __publicField(this, "enableTotp", this.resetTotp);
1144
1184
  this.opts = opts;
1145
1185
  this.api = typeof api == "string" ? new Api(api) : api;
1186
+ this.token = new Token(this.api);
1187
+ this.totp = new Totp(this.api);
1188
+ this.relayEvents(this.token);
1146
1189
  this.opts = {
1147
1190
  loginUrl: this.api.url + "/ui/#/login",
1148
1191
  ...this.opts
@@ -1185,17 +1228,17 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1185
1228
  if (host.startsWith("/")) return Promise.resolve();
1186
1229
  return this.api.request({ url: `/api/auth/known-host?host=${encodeURI(new URL(host).origin)}` });
1187
1230
  }
1188
- login(username, password, totp) {
1231
+ login(username, password, opts) {
1189
1232
  if (!username || !password) throw new Error("Cannot login, missing username or password");
1190
1233
  return this.api.request({
1191
1234
  url: "/api/auth/login",
1192
1235
  headers: { Authorization: void 0 },
1193
1236
  method: "POST",
1194
- body: {
1237
+ body: clean({
1195
1238
  username: username.trim(),
1196
1239
  password: password.trim(),
1197
- totp
1198
- }
1240
+ ...opts
1241
+ }, true)
1199
1242
  }).then(async (resp) => {
1200
1243
  this.api.token = (resp == null ? void 0 : resp.token) || null;
1201
1244
  const user = await this.once("auth/user");
@@ -1271,19 +1314,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1271
1314
  if (resp == null ? void 0 : resp.token) this.api.token = resp.token;
1272
1315
  });
1273
1316
  }
1274
- // TOTP ============================================================================================================
1275
- disableTotp(username) {
1276
- return this.api.request({ url: `/api/auth/totp/${username}`, method: "DELETE" });
1277
- }
1278
- resetTotp(username) {
1279
- return this.api.request({ url: `/api/auth/totp/${username}`, method: "POST" });
1280
- }
1281
- setupTotp(username, method = "app", totp) {
1282
- return this.api.request({ url: `/api/auth/totp/${username}`, body: clean({
1283
- method,
1284
- totp
1285
- }) });
1286
- }
1287
1317
  }
1288
1318
  class Client extends PathEventEmitter {
1289
1319
  constructor(api, settings) {
@@ -1376,7 +1406,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1376
1406
  if (settings["theme"]) {
1377
1407
  document.body.style.setProperty("--theme-backdrop", (_c = settings["theme"]) == null ? void 0 : _c.background);
1378
1408
  document.body.style.setProperty("--theme-primary", (_d = settings["theme"]) == null ? void 0 : _d.primary);
1379
- document.body.style.setProperty("--theme-accent", (_e = settings["theme"]) == null ? void 0 : _e.secondary);
1409
+ document.body.style.setProperty("--theme-accent", (_e = settings["theme"]) == null ? void 0 : _e.accent);
1380
1410
  document.body.style.setProperty("--theme-contrast", blackOrWhite((_f = settings["theme"]) == null ? void 0 : _f.background));
1381
1411
  }
1382
1412
  if (settings["pwa"]) {
@@ -1395,7 +1425,6 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
1395
1425
  const url = this.settings.api.url;
1396
1426
  const settings = this.settings.cache;
1397
1427
  const android = (platform || this.platform) == "android";
1398
- console.log("prompt");
1399
1428
  let style = document.querySelector("style.momentum-pwa");
1400
1429
  if (!style) {
1401
1430
  style = document.createElement("style");
@@ -2261,6 +2290,8 @@ ${log}`;
2261
2290
  exports2.Socket = Socket;
2262
2291
  exports2.Static = Static;
2263
2292
  exports2.Storage = Storage$1;
2293
+ exports2.Token = Token;
2294
+ exports2.Totp = Totp;
2264
2295
  exports2.Users = Users;
2265
2296
  Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
2266
2297
  });
package/dist/index.mjs CHANGED
@@ -1124,10 +1124,51 @@ class Analytics extends PathEventEmitter {
1124
1124
  });
1125
1125
  }
1126
1126
  }
1127
+ class Token extends PathEventEmitter {
1128
+ constructor(api) {
1129
+ super();
1130
+ this.api = api;
1131
+ }
1132
+ all(username) {
1133
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${username}` }).then((resp) => {
1134
+ this.emit(PES`token/${username}:r`, resp);
1135
+ return resp;
1136
+ });
1137
+ }
1138
+ create(token) {
1139
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${token.owner}`, body: token }).then((resp) => {
1140
+ this.emit(PES`token/${token.owner}:c`, token);
1141
+ return resp;
1142
+ });
1143
+ }
1144
+ delete(id) {
1145
+ return this.api.request({ url: "/" + PES`api/auth/tokens/${id}`, method: "DELETE" }).then(() => this.emit(PES`token/${id}:d`, id));
1146
+ }
1147
+ }
1148
+ class Totp {
1149
+ constructor(api) {
1150
+ __publicField(this, "enable", this.reset);
1151
+ this.api = api;
1152
+ }
1153
+ disable(username) {
1154
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, method: "DELETE" });
1155
+ }
1156
+ reset(username) {
1157
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, method: "POST" });
1158
+ }
1159
+ setup(username, method = "app", totp) {
1160
+ return this.api.request({ url: "/" + PES`api/auth/totp/${username}`, body: clean({
1161
+ method,
1162
+ totp
1163
+ }) });
1164
+ }
1165
+ }
1127
1166
  class Auth extends PathEventEmitter {
1128
1167
  constructor(api, opts = {}) {
1129
1168
  super();
1130
1169
  __publicField(this, "api");
1170
+ __publicField(this, "token");
1171
+ __publicField(this, "totp");
1131
1172
  __publicField(this, "_permissions", []);
1132
1173
  __publicField(this, "_user");
1133
1174
  // Permission helpers
@@ -1136,9 +1177,11 @@ class Auth extends PathEventEmitter {
1136
1177
  __publicField(this, "hasAll", (...events) => PathEvent.hasAll(this.permissions, ...events));
1137
1178
  __publicField(this, "hasFatal", (...events) => PathEvent.hasFatal(this.permissions, ...events));
1138
1179
  __publicField(this, "hasAllFatal", (...events) => PathEvent.hasAllFatal(this.permissions, ...events));
1139
- __publicField(this, "enableTotp", this.resetTotp);
1140
1180
  this.opts = opts;
1141
1181
  this.api = typeof api == "string" ? new Api(api) : api;
1182
+ this.token = new Token(this.api);
1183
+ this.totp = new Totp(this.api);
1184
+ this.relayEvents(this.token);
1142
1185
  this.opts = {
1143
1186
  loginUrl: this.api.url + "/ui/#/login",
1144
1187
  ...this.opts
@@ -1181,17 +1224,17 @@ class Auth extends PathEventEmitter {
1181
1224
  if (host.startsWith("/")) return Promise.resolve();
1182
1225
  return this.api.request({ url: `/api/auth/known-host?host=${encodeURI(new URL(host).origin)}` });
1183
1226
  }
1184
- login(username, password, totp) {
1227
+ login(username, password, opts) {
1185
1228
  if (!username || !password) throw new Error("Cannot login, missing username or password");
1186
1229
  return this.api.request({
1187
1230
  url: "/api/auth/login",
1188
1231
  headers: { Authorization: void 0 },
1189
1232
  method: "POST",
1190
- body: {
1233
+ body: clean({
1191
1234
  username: username.trim(),
1192
1235
  password: password.trim(),
1193
- totp
1194
- }
1236
+ ...opts
1237
+ }, true)
1195
1238
  }).then(async (resp) => {
1196
1239
  this.api.token = (resp == null ? void 0 : resp.token) || null;
1197
1240
  const user = await this.once("auth/user");
@@ -1267,19 +1310,6 @@ class Auth extends PathEventEmitter {
1267
1310
  if (resp == null ? void 0 : resp.token) this.api.token = resp.token;
1268
1311
  });
1269
1312
  }
1270
- // TOTP ============================================================================================================
1271
- disableTotp(username) {
1272
- return this.api.request({ url: `/api/auth/totp/${username}`, method: "DELETE" });
1273
- }
1274
- resetTotp(username) {
1275
- return this.api.request({ url: `/api/auth/totp/${username}`, method: "POST" });
1276
- }
1277
- setupTotp(username, method = "app", totp) {
1278
- return this.api.request({ url: `/api/auth/totp/${username}`, body: clean({
1279
- method,
1280
- totp
1281
- }) });
1282
- }
1283
1313
  }
1284
1314
  class Client extends PathEventEmitter {
1285
1315
  constructor(api, settings) {
@@ -1372,7 +1402,7 @@ class Client extends PathEventEmitter {
1372
1402
  if (settings["theme"]) {
1373
1403
  document.body.style.setProperty("--theme-backdrop", (_c = settings["theme"]) == null ? void 0 : _c.background);
1374
1404
  document.body.style.setProperty("--theme-primary", (_d = settings["theme"]) == null ? void 0 : _d.primary);
1375
- document.body.style.setProperty("--theme-accent", (_e = settings["theme"]) == null ? void 0 : _e.secondary);
1405
+ document.body.style.setProperty("--theme-accent", (_e = settings["theme"]) == null ? void 0 : _e.accent);
1376
1406
  document.body.style.setProperty("--theme-contrast", blackOrWhite((_f = settings["theme"]) == null ? void 0 : _f.background));
1377
1407
  }
1378
1408
  if (settings["pwa"]) {
@@ -1391,7 +1421,6 @@ class Client extends PathEventEmitter {
1391
1421
  const url = this.settings.api.url;
1392
1422
  const settings = this.settings.cache;
1393
1423
  const android = (platform || this.platform) == "android";
1394
- console.log("prompt");
1395
1424
  let style = document.querySelector("style.momentum-pwa");
1396
1425
  if (!style) {
1397
1426
  style = document.createElement("style");
@@ -2258,5 +2287,7 @@ export {
2258
2287
  Socket,
2259
2288
  Static,
2260
2289
  Storage$1 as Storage,
2290
+ Token,
2291
+ Totp,
2261
2292
  Users
2262
2293
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ztimson/momentum",
3
- "version": "0.50.5",
3
+ "version": "0.50.7",
4
4
  "description": "Client library for momentum",
5
5
  "keywords": ["Momentum"],
6
6
  "author": "Zak Timson <zaktimson@gmail.com>",
@@ -24,7 +24,7 @@
24
24
  "postbuild": "node -e \"const fs=require('fs');fs.cpSync('dist/index.mjs','../server/public/momentum.mjs');fs.cpSync('dist/index.cjs','../server/public/momentum.js')\""
25
25
  },
26
26
  "dependencies": {
27
- "@ztimson/utils": "0.23.7",
27
+ "@ztimson/utils": "0.23.8",
28
28
  "var-persist": "^1.0.1"
29
29
  },
30
30
  "devDependencies": {