Browse Source

Create @converse/log package

JC Brand 1 month ago
parent
commit
41405a0821
91 changed files with 471 additions and 237 deletions
  1. 15 1
      package-lock.json
  2. 3 1
      package.json
  3. 1 1
      src/headless/index.js
  4. 0 97
      src/headless/log.js
  5. 1 0
      src/headless/package.json
  6. 1 1
      src/headless/plugins/adhoc/api.js
  7. 1 1
      src/headless/plugins/blocklist/collection.js
  8. 1 1
      src/headless/plugins/blocklist/plugin.js
  9. 1 1
      src/headless/plugins/bookmarks/collection.js
  10. 1 1
      src/headless/plugins/bookmarks/plugin.js
  11. 1 1
      src/headless/plugins/bookmarks/utils.js
  12. 1 1
      src/headless/plugins/bosh/utils.js
  13. 1 1
      src/headless/plugins/chat/api.js
  14. 1 1
      src/headless/plugins/chat/model.js
  15. 1 1
      src/headless/plugins/chat/parsers.js
  16. 1 1
      src/headless/plugins/chat/utils.js
  17. 1 1
      src/headless/plugins/chatboxes/utils.js
  18. 1 1
      src/headless/plugins/disco/api.js
  19. 1 1
      src/headless/plugins/disco/entities.js
  20. 1 1
      src/headless/plugins/disco/entity.js
  21. 1 1
      src/headless/plugins/mam/api.js
  22. 1 1
      src/headless/plugins/mam/utils.js
  23. 1 1
      src/headless/plugins/muc/affiliations/utils.js
  24. 1 1
      src/headless/plugins/muc/api.js
  25. 1 1
      src/headless/plugins/muc/muc.js
  26. 1 1
      src/headless/plugins/muc/occupant.js
  27. 1 1
      src/headless/plugins/muc/occupants.js
  28. 1 1
      src/headless/plugins/muc/utils.js
  29. 1 1
      src/headless/plugins/ping/api.js
  30. 1 1
      src/headless/plugins/pubsub/api.js
  31. 1 1
      src/headless/plugins/roster/contacts.js
  32. 1 1
      src/headless/plugins/roster/utils.js
  33. 1 1
      src/headless/plugins/smacks/utils.js
  34. 1 1
      src/headless/plugins/vcard/api.js
  35. 1 1
      src/headless/plugins/vcard/utils.js
  36. 1 1
      src/headless/shared/_converse.js
  37. 1 1
      src/headless/shared/actions.js
  38. 1 1
      src/headless/shared/api/public.js
  39. 1 1
      src/headless/shared/api/send.js
  40. 1 1
      src/headless/shared/chatbox.js
  41. 1 1
      src/headless/shared/connection/index.js
  42. 1 1
      src/headless/shared/connection/utils.js
  43. 1 1
      src/headless/shared/message.js
  44. 1 1
      src/headless/shared/model-with-messages.js
  45. 1 1
      src/headless/shared/parsers.js
  46. 1 1
      src/headless/shared/settings/user/utils.js
  47. 3 0
      src/headless/tsconfig.json
  48. 1 1
      src/headless/types/index.d.ts
  49. 1 1
      src/headless/types/plugins/bookmarks/collection.d.ts
  50. 2 2
      src/headless/types/plugins/chat/model.d.ts
  51. 2 2
      src/headless/types/plugins/chat/utils.d.ts
  52. 3 3
      src/headless/types/plugins/muc/muc.d.ts
  53. 55 55
      src/headless/types/plugins/muc/occupant.d.ts
  54. 1 1
      src/headless/types/plugins/muc/utils.d.ts
  55. 1 1
      src/headless/types/shared/chatbox.d.ts
  56. 1 1
      src/headless/types/shared/connection/index.d.ts
  57. 1 1
      src/headless/types/shared/model-with-messages.d.ts
  58. 1 1
      src/headless/types/utils/index.d.ts
  59. 1 1
      src/headless/utils/index.js
  60. 1 1
      src/headless/utils/init.js
  61. 1 1
      src/headless/utils/promise.js
  62. 1 1
      src/headless/utils/session.js
  63. 1 1
      src/headless/utils/url.js
  64. 21 0
      src/log/LICENSE.txt
  65. 25 0
      src/log/README.md
  66. 135 0
      src/log/index.js
  67. 25 0
      src/log/package.json
  68. 46 0
      src/log/tsconfig.json
  69. 54 0
      src/log/types/index.d.ts
  70. 1 1
      src/types/plugins/chatview/bottom-panel.d.ts
  71. 1 1
      src/types/plugins/controlbox/controlbox.d.ts
  72. 1 1
      src/types/plugins/muc-views/chatarea.d.ts
  73. 1 1
      src/types/plugins/muc-views/heading.d.ts
  74. 1 1
      src/types/plugins/muc-views/modtools.d.ts
  75. 1 1
      src/types/plugins/muc-views/occupant.d.ts
  76. 1 1
      src/types/plugins/muc-views/sidebar-occupant.d.ts
  77. 1 1
      src/types/plugins/muc-views/templates/muc-bottom-panel.d.ts
  78. 1 1
      src/types/plugins/muc-views/templates/occupant-bottom-panel.d.ts
  79. 1 1
      src/types/plugins/omemo/fingerprints.d.ts
  80. 1 1
      src/types/shared/avatar/avatar.d.ts
  81. 1 1
      src/types/shared/avatar/templates/avatar.d.ts
  82. 1 1
      src/types/shared/chat/chat-content.d.ts
  83. 1 1
      src/types/shared/chat/message-limit.d.ts
  84. 2 2
      src/types/shared/chat/message.d.ts
  85. 1 1
      src/types/shared/chat/templates/unfurl.d.ts
  86. 1 1
      src/types/shared/chat/toolbar.d.ts
  87. 1 1
      src/types/shared/chat/unfurl.d.ts
  88. 1 1
      src/types/shared/chat/utils.d.ts
  89. 1 1
      src/types/shared/modals/templates/user-details.d.ts
  90. 1 1
      src/types/shared/modals/user-details.d.ts
  91. 5 0
      tsconfig.json

+ 15 - 1
package-lock.json

@@ -9,9 +9,11 @@
       "version": "11.0.0",
       "license": "MPL-2.0",
       "workspaces": [
-        "src/headless"
+        "src/headless",
+        "src/log"
       ],
       "dependencies": {
+        "@converse/log": "file:src/log",
         "bootstrap": "^5.3.3",
         "client-compress": "^2.2.2",
         "dayjs": "^1.11.8",
@@ -1818,6 +1820,10 @@
         "localforage": ">=1.4.0"
       }
     },
+    "node_modules/@converse/log": {
+      "resolved": "src/log",
+      "link": true
+    },
     "node_modules/@converse/openpromise": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/@converse/openpromise/-/openpromise-0.0.1.tgz",
@@ -10822,6 +10828,14 @@
         "urijs": "^1.19.10"
       },
       "devDependencies": {}
+    },
+    "src/log": {
+      "name": "@converse/log",
+      "version": "0.0.1",
+      "license": "MIT",
+      "devDependencies": {
+        "typescript": "^5.5.4"
+      }
     }
   }
 }

+ 3 - 1
package.json

@@ -7,7 +7,8 @@
   "browser": "dist/converse.js",
   "module": "src/index.js",
   "workspaces": [
-    "src/headless"
+    "src/headless",
+    "src/log"
   ],
   "files": [
     "CHANGES.md",
@@ -119,6 +120,7 @@
     "webpack-merge": "^5.10.0"
   },
   "dependencies": {
+    "@converse/log": "file:src/log",
     "bootstrap": "^5.3.3",
     "client-compress": "^2.2.2",
     "dayjs": "^1.11.8",

+ 1 - 1
src/headless/index.js

@@ -1,6 +1,6 @@
 import dayjs from 'dayjs';
 import advancedFormat from 'dayjs/plugin/advancedFormat';
-import log from '@converse/log';
+import log from "@converse/log";
 
 dayjs.extend(advancedFormat);
 

+ 0 - 97
src/headless/log.js

@@ -1,97 +0,0 @@
-import { isElement } from './utils/html.js';
-
-export const LEVELS = {
-    'debug': 0,
-    'info': 1,
-    'warn': 2,
-    'error': 3,
-    'fatal': 4
-}
-
-/* eslint-disable @typescript-eslint/no-empty-function */
-const logger = Object.assign({
-    'debug': console?.log ? console.log.bind(console) : function noop () {},
-    'error': console?.log ? console.log.bind(console) : function noop () {},
-    'info': console?.log ? console.log.bind(console) : function noop () {},
-    'warn': console?.log ? console.log.bind(console) : function noop () {}
-}, console);
-/* eslint-enable @typescript-eslint/no-empty-function */
-
-
-/**
- * The log namespace
- * @namespace log
- */
-export default {
-
-    /**
-     * The the log-level, which determines how verbose the logging is.
-     * @method log#setLogLevel
-     * @param {keyof LEVELS} level - The loglevel which allows for filtering of log messages
-     */
-    setLogLevel (level) {
-        if (!['debug', 'info', 'warn', 'error', 'fatal'].includes(level)) {
-            throw new Error(`Invalid loglevel: ${level}`);
-        }
-        this.loglevel = level;
-    },
-
-    /**
-     * Logs messages to the browser's developer console.
-     * Available loglevels are 0 for 'debug', 1 for 'info', 2 for 'warn',
-     * 3 for 'error' and 4 for 'fatal'.
-     * When using the 'error' or 'warn' loglevels, a full stacktrace will be
-     * logged as well.
-     * @method log#log
-     * @param {string|Element|Error} message - The message to be logged
-     * @param {string} level - The loglevel which allows for filtering of log messages
-     */
-    log (message, level, style='') {
-        if (LEVELS[level] < LEVELS[this.loglevel]) {
-            return;
-        }
-        if (level === 'error' || level === 'fatal') {
-            style = style || 'color: maroon';
-        } else if (level === 'debug') {
-            style = style || 'color: green';
-        }
-
-        if (message instanceof Error) {
-            message = message.stack;
-        } else if (isElement(message)) {
-            message = /** @type {Element} */(message).outerHTML;
-        }
-        const prefix = style ? '%c' : '';
-        if (level === 'error') {
-            logger.error(`${prefix} ERROR: ${message}`, style);
-        } else if (level === 'warn') {
-            logger.warn(`${prefix} ${(new Date()).toISOString()} WARNING: ${message}`, style);
-        } else if (level === 'fatal') {
-            logger.error(`${prefix} FATAL: ${message}`, style);
-        } else if (level === 'debug') {
-            logger.debug(`${prefix} ${(new Date()).toISOString()} DEBUG: ${message}`, style);
-        } else {
-            logger.info(`${prefix} ${(new Date()).toISOString()} INFO: ${message}`, style);
-        }
-    },
-
-    debug (message, style) {
-        this.log(message, 'debug', style);
-    },
-
-    error (message, style) {
-        this.log(message, 'error', style);
-    },
-
-    info (message, style) {
-        this.log(message, 'info', style);
-    },
-
-    warn (message, style) {
-        this.log(message, 'warn', style);
-    },
-
-    fatal (message, style) {
-        this.log(message, 'fatal', style);
-    }
-}

+ 1 - 0
src/headless/package.json

@@ -32,6 +32,7 @@
     "url": "https://github.com/conversejs/converse.js/issues"
   },
   "dependencies": {
+    "@converse/log": "file:../log",
     "@converse/openpromise": "^0.0.1",
     "@converse/skeletor": "conversejs/skeletor#7e1cbeba0161bfe91d709a22deaa70e4daa0cd39",
     "dayjs": "^1.11.8",

+ 1 - 1
src/headless/plugins/adhoc/api.js

@@ -1,4 +1,4 @@
-import log from '../../log.js';
+import log from "@converse/log";
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';

+ 1 - 1
src/headless/plugins/blocklist/collection.js

@@ -1,6 +1,6 @@
 import { getOpenPromise } from '@converse/openpromise';
 import { Collection } from '@converse/skeletor';
-import log from '../../log.js';
+import log from "@converse/log";
 import _converse from '../../shared/_converse.js';
 import { initStorage } from '../../utils/storage.js';
 import api from '../../shared/api/index.js';

+ 1 - 1
src/headless/plugins/blocklist/plugin.js

@@ -6,7 +6,7 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import Blocklist from './collection.js';
 import BlockedEntity from './model.js';
 import blocklist_api from './api.js';

+ 1 - 1
src/headless/plugins/bookmarks/collection.js

@@ -9,7 +9,7 @@ import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import { parseErrorStanza } from '../../shared/parsers.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { initStorage } from '../../utils/storage.js';
 import { parseStanzaForBookmarks } from './parsers.js';
 import '../../plugins/muc/index.js';

+ 1 - 1
src/headless/plugins/bookmarks/plugin.js

@@ -9,7 +9,7 @@ import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import { initBookmarks, getNicknameFromBookmark, handleBookmarksPush } from './utils.js';
 import '../../plugins/muc/index.js';
-import log from '../../log';
+import log from "@converse/log";
 import bookmarks_api from './api.js';
 
 const { Strophe } = converse.env;

+ 1 - 1
src/headless/plugins/bookmarks/utils.js

@@ -1,6 +1,6 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import Bookmarks from './collection.js';
 
 export async function initBookmarks() {

+ 1 - 1
src/headless/plugins/bosh/utils.js

@@ -1,7 +1,7 @@
 /**
  * @typedef {module:shared.api.user} LoginHookPayload
  */
-import log from "../../log.js";
+import log from "@converse/log";
 import api from '../../shared/api/index.js';
 import _converse from "../../shared/_converse.js";
 import { Strophe } from "strophe.js";

+ 1 - 1
src/headless/plugins/chat/api.js

@@ -3,7 +3,7 @@
  */
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
-import log from "../../log.js";
+import log from "@converse/log";
 import { PRIVATE_CHAT_TYPE } from '../../shared/constants.js';
 
 

+ 1 - 1
src/headless/plugins/chat/model.js

@@ -3,7 +3,7 @@ import { PRIVATE_CHAT_TYPE, INACTIVE } from '../../shared/constants.js';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { isUniView } from '../../utils/session.js';
 import { sendChatState, sendMarker } from '../../shared/actions.js';
 import ModelWithMessages from "../../shared/model-with-messages.js";

+ 1 - 1
src/headless/plugins/chat/parsers.js

@@ -5,7 +5,7 @@ import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import dayjs from 'dayjs';
-import log from '../../log.js';
+import log from "@converse/log";
 import u from '../../utils/index.js';
 import { rejectMessage } from '../../shared/actions.js';
 import { StanzaParseError } from '../../shared/errors.js';

+ 1 - 1
src/headless/plugins/chat/utils.js

@@ -10,7 +10,7 @@ import { Model } from '@converse/skeletor';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from "../../shared/api/public.js";
-import log from '../../log.js';
+import log from "@converse/log";
 import { isArchived, isHeadline, isMUCPrivateMessage, isServerMessage, } from '../../shared/parsers';
 import { parseMessage } from './parsers.js';
 import { shouldClearCache } from '../../utils/session.js';

+ 1 - 1
src/headless/plugins/chatboxes/utils.js

@@ -2,7 +2,7 @@
  * @typedef {import('../chat/model.js').default} ChatBox
  */
 import _converse from '../../shared/_converse.js';
-import log from "../../log";
+import log from "@converse/log";
 import { Strophe } from 'strophe.js';
 
 

+ 1 - 1
src/headless/plugins/disco/api.js

@@ -2,7 +2,7 @@ import { getOpenPromise } from '@converse/openpromise';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 
 const { Strophe, $iq } = converse.env;
 

+ 1 - 1
src/headless/plugins/disco/entities.js

@@ -1,5 +1,5 @@
 import DiscoEntity from './entity.js';
-import log from "../../log.js";
+import log from "@converse/log";
 import { Collection } from "@converse/skeletor";
 
 

+ 1 - 1
src/headless/plugins/disco/entity.js

@@ -4,7 +4,7 @@ import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import { parseErrorStanza } from '../../shared/parsers.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import sizzle from 'sizzle';
 import { createStore } from '../../utils/storage.js';
 

+ 1 - 1
src/headless/plugins/mam/api.js

@@ -2,7 +2,7 @@ import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import dayjs from 'dayjs';
-import log from '../../log.js';
+import log from "@converse/log";
 import sizzle from "sizzle";
 import { RSM } from '../../shared/rsm.js';
 import { Strophe, Stanza } from 'strophe.js';

+ 1 - 1
src/headless/plugins/mam/utils.js

@@ -8,7 +8,7 @@ import { Strophe, $iq } from "strophe.js";
 import _converse from "../../shared/_converse.js";
 import api from "../../shared/api/index.js";
 import converse from "../../shared/api/public.js";
-import log from "../../log.js";
+import log from "@converse/log";
 import { parseMUCMessage } from "../../plugins/muc/parsers.js";
 import { parseMessage } from "../../plugins/chat/parsers.js";
 import { CHATROOMS_TYPE } from "../../shared/constants.js";

+ 1 - 1
src/headless/plugins/muc/affiliations/utils.js

@@ -10,7 +10,7 @@
 import _converse from '../../../shared/_converse.js';
 import api from '../../../shared/api/index.js';
 import converse from '../../../shared/api/public.js';
-import log from '../../../log.js';
+import log from "@converse/log";
 import { parseMemberListIQ } from '../parsers.js';
 
 const { Strophe, $iq, u, stx } = converse.env;

+ 1 - 1
src/headless/plugins/muc/api.js

@@ -3,7 +3,7 @@
  */
 import _converse from '../../shared/_converse.js';
 import chatboxes from '../../plugins/chatboxes/api.js';
-import log from '../../log';
+import log from "@converse/log";
 import promise_api from '../../shared/api/promise.js';
 import { CHATROOMS_TYPE } from '../../shared/constants.js';
 import { Strophe } from 'strophe.js';

+ 1 - 1
src/headless/plugins/muc/muc.js

@@ -6,7 +6,7 @@ import pick from 'lodash-es/pick';
 import sizzle from 'sizzle';
 import { getOpenPromise } from '@converse/openpromise';
 import { Model } from '@converse/skeletor';
-import log from '../../log';
+import log from "@converse/log";
 import p from '../../utils/parse-helpers';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';

+ 1 - 1
src/headless/plugins/muc/occupant.js

@@ -1,5 +1,5 @@
 import { Model } from "@converse/skeletor";
-import log from "../../log";
+import log from "@converse/log";
 import api from "../../shared/api/index.js";
 import _converse from "../../shared/_converse.js";
 import converse from "../../shared/api/public.js";

+ 1 - 1
src/headless/plugins/muc/occupants.js

@@ -6,7 +6,7 @@
  */
 import MUCOccupant from './occupant.js';
 import _converse from '../../shared/_converse.js';
-import log from '../../log';
+import log from "@converse/log";
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
 import { Collection, Model } from '@converse/skeletor';

+ 1 - 1
src/headless/plugins/muc/utils.js

@@ -1,7 +1,7 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { MUC_ROLE_WEIGHTS } from './constants.js';
 import { safeSave } from '../../utils/init.js';
 import { CHATROOMS_TYPE } from '../../shared/constants.js';

+ 1 - 1
src/headless/plugins/ping/api.js

@@ -1,7 +1,7 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { setLastStanzaDate } from './utils.js';
 
 const { Strophe, $iq, u } = converse.env;

+ 1 - 1
src/headless/plugins/pubsub/api.js

@@ -5,7 +5,7 @@
 import converse from '../../shared/api/public.js';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { parseErrorStanza } from '../../shared/parsers.js';
 import { parseStanzaForPubSubConfig } from './parsers.js';
 

+ 1 - 1
src/headless/plugins/roster/contacts.js

@@ -3,7 +3,7 @@ import RosterContact from './contact.js';
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from "../../log.js";
+import log from "@converse/log";
 import { initStorage } from '../../utils/storage.js';
 import { rejectPresenceSubscription } from './utils.js';
 

+ 1 - 1
src/headless/plugins/roster/utils.js

@@ -4,7 +4,7 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from "../../log.js";
+import log from "@converse/log";
 import { Model } from '@converse/skeletor';
 import { RosterFilter } from '../../plugins/roster/filter.js';
 import { PRIVATE_CHAT_TYPE } from "../../shared/constants";

+ 1 - 1
src/headless/plugins/smacks/utils.js

@@ -1,7 +1,7 @@
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from '../../shared/api/public.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { getOpenPromise } from '@converse/openpromise';
 import { isTestEnv } from '../../utils/session.js';
 

+ 1 - 1
src/headless/plugins/vcard/api.js

@@ -1,7 +1,7 @@
 /**
  * @typedef {import('@converse/skeletor').Model} Model
  */
-import log from "../../log.js";
+import log from "@converse/log";
 import _converse from '../../shared/_converse.js';
 import api from '../../shared/api/index.js';
 import converse from "../../shared/api/public.js";

+ 1 - 1
src/headless/plugins/vcard/utils.js

@@ -10,7 +10,7 @@
 import _converse from "../../shared/_converse.js";
 import api from "../../shared/api/index.js";
 import converse from "../../shared/api/public.js";
-import log from "../../log.js";
+import log from "@converse/log";
 import { shouldClearCache } from "../../utils/session.js";
 import { isElement } from "../../utils/html.js";
 import { parseErrorStanza } from "../../shared/parsers.js";

+ 1 - 1
src/headless/shared/_converse.js

@@ -6,7 +6,7 @@
  * @typedef {import('../plugins/status/status').default} XMPPStatus
  * @typedef {import('../plugins/vcard/vcard').default} VCards
  */
-import log from '../log.js';
+import log from "@converse/log";
 import i18n from './i18n.js';
 import pluggable from 'pluggable.js/src/pluggable.js';
 import { EventEmitter, Model } from '@converse/skeletor';

+ 1 - 1
src/headless/shared/actions.js

@@ -1,4 +1,4 @@
-import log from '../log';
+import log from "@converse/log";
 import { Strophe, $msg } from 'strophe.js';
 import api from './api/index.js';
 import converse from './api/public.js';

+ 1 - 1
src/headless/shared/api/public.js

@@ -13,7 +13,7 @@ import { html } from 'lit';
 import api from './index.js';
 import _converse from '../_converse.js';
 import i18n from '../i18n';
-import log from '../../log.js';
+import log from "@converse/log";
 import ConnectionFeedback from './../connection/feedback.js';
 import u, { setLogLevelFromRoute } from '../../utils/index.js';
 import { ANONYMOUS, CHAT_STATES, KEYCODES, VERSION_NAME } from '../constants.js';

+ 1 - 1
src/headless/shared/api/send.js

@@ -1,5 +1,5 @@
 import _converse from '../_converse.js';
-import log from '../../log.js';
+import log from "@converse/log";
 import { Strophe } from 'strophe.js';
 import { TimeoutError } from '../errors.js';
 

+ 1 - 1
src/headless/shared/chatbox.js

@@ -3,7 +3,7 @@ import api from './api/index.js';
 import { isUniView } from '../utils/session.js';
 import _converse from './_converse.js';
 import converse from './api/public.js';
-import log from '../log.js';
+import log from "@converse/log";
 import ModelWithMessages from './model-with-messages.js';
 
 const { u } = converse.env;

+ 1 - 1
src/headless/shared/connection/index.js

@@ -1,5 +1,5 @@
 import debounce from 'lodash-es/debounce';
-import log from "../../log.js";
+import log from "@converse/log";
 import sizzle from 'sizzle';
 import _converse from '../_converse.js';
 import { ANONYMOUS, BOSH_WAIT, LOGOUT } from '../../shared/constants.js';

+ 1 - 1
src/headless/shared/connection/utils.js

@@ -1,4 +1,4 @@
-import log from '../../log.js';
+import log from "@converse/log";
 import { Strophe } from 'strophe.js';
 import { settings_api } from '../settings/api.js';
 

+ 1 - 1
src/headless/shared/message.js

@@ -2,7 +2,7 @@ import dayjs from "dayjs";
 import sizzle from "sizzle";
 import { Strophe, $iq } from "strophe.js";
 import { Model } from "@converse/skeletor";
-import log from "../log.js";
+import log from "@converse/log";
 import _converse from "../shared/_converse.js";
 import api from "../shared/api/index.js";
 import { SUCCESS, FAILURE } from "../shared/constants.js";

+ 1 - 1
src/headless/shared/model-with-messages.js

@@ -3,7 +3,7 @@ import pick from 'lodash-es/pick';
 import debounce from 'lodash-es/debounce.js';
 import { getOpenPromise } from '@converse/openpromise';
 import { Model } from '@converse/skeletor';
-import log from '../log.js';
+import log from "@converse/log";
 import { initStorage } from '../utils/storage.js';
 import * as constants from './constants.js';
 import converse from './api/public.js';

+ 1 - 1
src/headless/shared/parsers.js

@@ -5,7 +5,7 @@ import sizzle from 'sizzle';
 import _converse from './_converse.js';
 import api from './api/index.js';
 import dayjs from 'dayjs';
-import log from '../log.js';
+import log from "@converse/log";
 import { Strophe } from 'strophe.js';
 import { decodeHTMLEntities } from '../utils/html.js';
 import { getAttributes } from '../utils/stanza.js';

+ 1 - 1
src/headless/shared/settings/user/utils.js

@@ -1,5 +1,5 @@
 import _converse from '../../_converse.js';
-import log from '../../../log.js';
+import log from "@converse/log";
 import { Model } from '@converse/skeletor';
 import { initStorage } from '../../../utils/storage.js';
 

+ 3 - 0
src/headless/tsconfig.json

@@ -31,6 +31,9 @@
     "rootDir": "./",
     "outDir": "./types/",
     "baseUrl": "./",
+    "paths": {
+      "@converse/log": ["../log/types/index.d.ts"]
+    },
 
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,

+ 1 - 1
src/headless/types/index.d.ts

@@ -8,7 +8,7 @@ import { api } from './shared/index.js';
 import converse from './shared/api/public.js';
 import { _converse } from './shared/index.js';
 import { i18n } from './shared/index.js';
-import log from '@converse/log';
+import log from "@converse/log";
 import u from './utils/index.js';
 export const constants: typeof shared_constants & typeof muc_constants;
 import { parsers } from './shared/index.js';

+ 1 - 1
src/headless/types/plugins/bookmarks/collection.d.ts

@@ -15,7 +15,7 @@ declare class Bookmarks extends Collection {
     /**
      * @param {import('./types').BookmarkAttrs} attrs
      */
-    setBookmark(attrs: import("./types").BookmarkAttrs, create?: boolean): any;
+    setBookmark(attrs: import("./types").BookmarkAttrs, create?: boolean): void;
     /**
      * @param {'urn:xmpp:bookmarks:1'|'storage:bookmarks'} node
      * @returns {Stanza|Stanza[]}

+ 2 - 2
src/headless/types/plugins/chat/model.d.ts

@@ -124,7 +124,7 @@ declare const ChatBox_base: {
         sendMarkerForMessage(msg: import("../../index.js").BaseMessage<any>, type?: ("received" | "displayed" | "acknowledged"), force?: boolean): Promise<void>;
         handleUnreadMessage(message: import("../../index.js").BaseMessage<any>): void;
         getErrorAttributesForMessage(message: import("../../index.js").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): Promise<any>;
-        handleErrorMessageStanza(stanza: Element): Promise<any>;
+        handleErrorMessageStanza(stanza: Element): Promise<void>;
         incrementUnreadMsgsCounter(message: import("../../index.js").BaseMessage<any>): void;
         clearUnreadMsgCounter(): void;
         handleRetraction(attrs: import("../../shared/types").MessageAttributes): Promise<boolean>;
@@ -360,7 +360,7 @@ declare class ChatBox extends ChatBox_base {
     /**
      * @param {MessageAttributes|StanzaParseError} attrs_or_error
      */
-    onMessage(attrs_or_error: import("../../shared/types").MessageAttributes | import("../../shared/errors").StanzaParseError): Promise<any>;
+    onMessage(attrs_or_error: import("../../shared/types").MessageAttributes | import("../../shared/errors").StanzaParseError): Promise<void>;
     /**
      * @param {import('../roster/presence').default} item
      */

+ 2 - 2
src/headless/types/plugins/chat/utils.d.ts

@@ -1,4 +1,4 @@
-export function routeToChat(event: any): any;
+export function routeToChat(event: any): void;
 export function onClearSession(): Promise<void>;
 /**
  * Given a stanza, determine whether it's a new
@@ -12,7 +12,7 @@ export function registerMessageHandlers(): void;
  * Handler method for all incoming single-user chat "message" stanzas.
  * @param {Element|Builder} stanza
  */
-export function handleMessageStanza(stanza: Element | Builder): Promise<any>;
+export function handleMessageStanza(stanza: Element | Builder): Promise<true | void>;
 /**
  * Ask the XMPP server to enable Message Carbons
  * See [XEP-0280](https://xmpp.org/extensions/xep-0280.html#enabling)

+ 3 - 3
src/headless/types/plugins/muc/muc.d.ts

@@ -124,7 +124,7 @@ declare const MUC_base: {
         sendMarkerForMessage(msg: import("../../shared/message.js").default<any>, type?: ("received" | "displayed" | "acknowledged"), force?: boolean): Promise<void>;
         handleUnreadMessage(message: import("../../shared/message.js").default<any>): void;
         getErrorAttributesForMessage(message: import("../../shared/message.js").default<any>, attrs: import("../../shared/types").MessageAttributes): Promise<any>;
-        handleErrorMessageStanza(stanza: Element): Promise<any>;
+        handleErrorMessageStanza(stanza: Element): Promise<void>;
         incrementUnreadMsgsCounter(message: import("../../shared/message.js").default<any>): void;
         clearUnreadMsgCounter(): void;
         handleRetraction(attrs: import("../../shared/types").MessageAttributes): Promise<boolean>;
@@ -394,7 +394,7 @@ declare class MUC extends MUC_base {
     /**
      * @param {Element} stanza
      */
-    handleErrorMessageStanza(stanza: Element): Promise<any>;
+    handleErrorMessageStanza(stanza: Element): Promise<void>;
     /**
      * Handles incoming message stanzas from the service that hosts this MUC
      * @param {Element} stanza
@@ -835,7 +835,7 @@ declare class MUC extends MUC_base {
      * should be called.
      * @param {MUCMessageAttributes|StanzaParseError} attrs_or_error - A promise which resolves to the message attributes.
      */
-    onMessage(attrs_or_error: import("./types").MUCMessageAttributes | import("../../shared/errors.js").StanzaParseError): Promise<any>;
+    onMessage(attrs_or_error: import("./types").MUCMessageAttributes | import("../../shared/errors.js").StanzaParseError): Promise<void>;
     /**
      * @param {Element} pres
      */

+ 55 - 55
src/headless/types/plugins/muc/occupant.d.ts

@@ -1,11 +1,11 @@
 export default MUCOccupant;
 declare const MUCOccupant_base: {
     new (...args: any[]): {
-        _vcard: import("../vcard").VCard;
+        _vcard: import("../vcard/vcard.js").default;
         lazy_load_vcard: boolean;
         initialize(): void;
-        readonly vcard: import("../vcard").VCard;
-        getVCard(): Promise<import("../vcard").VCard | null>;
+        readonly vcard: import("../vcard/vcard.js").default;
+        getVCard(): Promise<import("../vcard/vcard.js").default | null>;
         cid: any;
         attributes: {};
         validationError: string;
@@ -18,7 +18,7 @@ declare const MUCOccupant_base: {
         preinitialize(): void;
         validate(attrs: object, options?: object): string;
         toJSON(): any;
-        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model").Options): any;
+        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model.js").Options): any;
         get(attr: string): any;
         keys(): string[];
         values(): any[];
@@ -29,26 +29,26 @@ declare const MUCOccupant_base: {
         omit(...args: any[]): any;
         isEmpty(): any;
         has(attr: string): boolean;
-        matches(attrs: import("@converse/skeletor/src/types/model").Attributes): boolean;
-        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model").Options): false | any;
+        matches(attrs: import("@converse/skeletor/src/types/model.js").Attributes): boolean;
+        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
         _changing: boolean;
         _previousAttributes: any;
         id: any;
-        _pending: boolean | import("@converse/skeletor/src/types/model").Options;
-        unset(attr: string, options?: import("@converse/skeletor/src/types/model").Options): false | any;
-        clear(options: import("@converse/skeletor/src/types/model").Options): false | any;
+        _pending: boolean | import("@converse/skeletor/src/types/model.js").Options;
+        unset(attr: string, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
+        clear(options: import("@converse/skeletor/src/types/model.js").Options): false | any;
         hasChanged(attr?: string): any;
         changedAttributes(diff: any): any;
         previous(attr?: string): any;
         previousAttributes(): any;
-        fetch(options?: import("@converse/skeletor/src/types/model").Options): any;
-        save(key?: string | import("@converse/skeletor/src/types/model").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): any;
-        destroy(options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        fetch(options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        save(key?: string | import("@converse/skeletor/src/types/model.js").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        destroy(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         url(): any;
-        parse(resp: import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): import("@converse/skeletor/src/types/model").Options;
+        parse(resp: import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): import("@converse/skeletor/src/types/model.js").Options;
         isNew(): boolean;
-        isValid(options?: import("@converse/skeletor/src/types/model").Options): boolean;
-        _validate(attrs: import("@converse/skeletor/src/types/model").Attributes, options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        isValid(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
+        _validate(attrs: import("@converse/skeletor/src/types/model.js").Attributes, options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         on(name: string, callback: (event: any, model: Model, collection: import("@converse/skeletor").Collection, options: Record<string, any>) => any, context: any): any;
         _events: any;
         _listeners: {};
@@ -87,20 +87,20 @@ declare const MUCOccupant_base: {
         fetchMessages(): any;
         afterMessagesFetched(): void;
         onMessage(_attrs_or_error: import("../../shared/types").MessageAttributes | Error): Promise<void>;
-        getUpdatedMessageAttributes(message: import("../..").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): object;
-        updateMessage(message: import("../..").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): void;
-        handleCorrection(attrs: import("../../shared/types").MessageAttributes | import("./types").MUCMessageAttributes): Promise<import("../..").BaseMessage<any> | void>;
+        getUpdatedMessageAttributes(message: import("../../index.js").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): object;
+        updateMessage(message: import("../../index.js").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): void;
+        handleCorrection(attrs: import("../../shared/types").MessageAttributes | import("./types.js").MUCMessageAttributes): Promise<import("../../index.js").BaseMessage<any> | void>;
         queueMessage(attrs: import("../../shared/types").MessageAttributes): any;
         msg_chain: any;
         getOutgoingMessageAttributes(_attrs?: import("../../shared/types").MessageAttributes): Promise<import("../../shared/types").MessageAttributes>;
-        sendMessage(attrs?: any): Promise<import("../..").BaseMessage<any>>;
-        retractOwnMessage(message: import("../..").BaseMessage<any>): void;
+        sendMessage(attrs?: any): Promise<import("../../index.js").BaseMessage<any>>;
+        retractOwnMessage(message: import("../../index.js").BaseMessage<any>): void;
         sendFiles(files: File[]): Promise<void>;
         setEditable(attrs: any, send_time: string): void;
         setChatState(state: string, options?: object): any;
         chat_state_timeout: NodeJS.Timeout;
-        onMessageAdded(message: import("../..").BaseMessage<any>): void;
-        onMessageUploadChanged(message: import("../..").BaseMessage<any>): Promise<void>;
+        onMessageAdded(message: import("../../index.js").BaseMessage<any>): void;
+        onMessageUploadChanged(message: import("../../index.js").BaseMessage<any>): Promise<void>;
         onScrolledChanged(): void;
         pruneHistoryWhenScrolledDown(): void;
         shouldShowErrorMessage(attrs: import("../../shared/types").MessageAttributes): Promise<boolean>;
@@ -110,8 +110,8 @@ declare const MUCOccupant_base: {
         getOldestMessage(): any;
         getMostRecentMessage(): any;
         getMessageReferencedByError(attrs: object): any;
-        findDanglingRetraction(attrs: object): import("../..").BaseMessage<any> | null;
-        getDuplicateMessage(attrs: object): import("../..").BaseMessage<any>;
+        findDanglingRetraction(attrs: object): import("../../index.js").BaseMessage<any> | null;
+        getDuplicateMessage(attrs: object): import("../../index.js").BaseMessage<any>;
         getOriginIdQueryAttrs(attrs: object): {
             origin_id: any;
             from: any;
@@ -121,15 +121,15 @@ declare const MUCOccupant_base: {
             from: any;
             msgid: any;
         };
-        sendMarkerForMessage(msg: import("../..").BaseMessage<any>, type?: ("received" | "displayed" | "acknowledged"), force?: boolean): Promise<void>;
-        handleUnreadMessage(message: import("../..").BaseMessage<any>): void;
-        getErrorAttributesForMessage(message: import("../..").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): Promise<any>;
-        handleErrorMessageStanza(stanza: Element): Promise<any>;
-        incrementUnreadMsgsCounter(message: import("../..").BaseMessage<any>): void;
+        sendMarkerForMessage(msg: import("../../index.js").BaseMessage<any>, type?: ("received" | "displayed" | "acknowledged"), force?: boolean): Promise<void>;
+        handleUnreadMessage(message: import("../../index.js").BaseMessage<any>): void;
+        getErrorAttributesForMessage(message: import("../../index.js").BaseMessage<any>, attrs: import("../../shared/types").MessageAttributes): Promise<any>;
+        handleErrorMessageStanza(stanza: Element): Promise<void>;
+        incrementUnreadMsgsCounter(message: import("../../index.js").BaseMessage<any>): void;
         clearUnreadMsgCounter(): void;
         handleRetraction(attrs: import("../../shared/types").MessageAttributes): Promise<boolean>;
         handleReceipt(attrs: import("../../shared/types").MessageAttributes): boolean;
-        createMessageStanza(message: import("../..").BaseMessage<any>): Promise<any>;
+        createMessageStanza(message: import("../../index.js").BaseMessage<any>): Promise<any>;
         pruneHistory(): void;
         debouncedPruneHistory: import("lodash").DebouncedFunc<() => void>;
         isScrolledUp(): any;
@@ -146,7 +146,7 @@ declare const MUCOccupant_base: {
         preinitialize(): void;
         validate(attrs: object, options?: object): string;
         toJSON(): any;
-        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model").Options): any;
+        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model.js").Options): any;
         get(attr: string): any;
         keys(): string[];
         values(): any[];
@@ -157,26 +157,26 @@ declare const MUCOccupant_base: {
         omit(...args: any[]): any;
         isEmpty(): any;
         has(attr: string): boolean;
-        matches(attrs: import("@converse/skeletor/src/types/model").Attributes): boolean;
-        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model").Options): false | any;
+        matches(attrs: import("@converse/skeletor/src/types/model.js").Attributes): boolean;
+        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
         _changing: boolean;
         _previousAttributes: any;
         id: any;
-        _pending: boolean | import("@converse/skeletor/src/types/model").Options;
-        unset(attr: string, options?: import("@converse/skeletor/src/types/model").Options): false | any;
-        clear(options: import("@converse/skeletor/src/types/model").Options): false | any;
+        _pending: boolean | import("@converse/skeletor/src/types/model.js").Options;
+        unset(attr: string, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
+        clear(options: import("@converse/skeletor/src/types/model.js").Options): false | any;
         hasChanged(attr?: string): any;
         changedAttributes(diff: any): any;
         previous(attr?: string): any;
         previousAttributes(): any;
-        fetch(options?: import("@converse/skeletor/src/types/model").Options): any;
-        save(key?: string | import("@converse/skeletor/src/types/model").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): any;
-        destroy(options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        fetch(options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        save(key?: string | import("@converse/skeletor/src/types/model.js").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        destroy(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         url(): any;
-        parse(resp: import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): import("@converse/skeletor/src/types/model").Options;
+        parse(resp: import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): import("@converse/skeletor/src/types/model.js").Options;
         isNew(): boolean;
-        isValid(options?: import("@converse/skeletor/src/types/model").Options): boolean;
-        _validate(attrs: import("@converse/skeletor/src/types/model").Attributes, options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        isValid(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
+        _validate(attrs: import("@converse/skeletor/src/types/model.js").Attributes, options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         on(name: string, callback: (event: any, model: Model, collection: import("@converse/skeletor").Collection, options: Record<string, any>) => any, context: any): any;
         _events: any;
         _listeners: {};
@@ -215,7 +215,7 @@ declare const MUCOccupant_base: {
         initialize(): void;
         validate(attrs: object, options?: object): string;
         toJSON(): any;
-        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model").Options): any;
+        sync(method: "create" | "update" | "patch" | "delete" | "read", model: Model, options: import("@converse/skeletor/src/types/model.js").Options): any;
         get(attr: string): any;
         keys(): string[];
         values(): any[];
@@ -226,26 +226,26 @@ declare const MUCOccupant_base: {
         omit(...args: any[]): any;
         isEmpty(): any;
         has(attr: string): boolean;
-        matches(attrs: import("@converse/skeletor/src/types/model").Attributes): boolean;
-        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model").Options): false | any;
+        matches(attrs: import("@converse/skeletor/src/types/model.js").Attributes): boolean;
+        set(key: string | any, val?: string | any, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
         _changing: boolean;
         _previousAttributes: any;
         id: any;
-        _pending: boolean | import("@converse/skeletor/src/types/model").Options;
-        unset(attr: string, options?: import("@converse/skeletor/src/types/model").Options): false | any;
-        clear(options: import("@converse/skeletor/src/types/model").Options): false | any;
+        _pending: boolean | import("@converse/skeletor/src/types/model.js").Options;
+        unset(attr: string, options?: import("@converse/skeletor/src/types/model.js").Options): false | any;
+        clear(options: import("@converse/skeletor/src/types/model.js").Options): false | any;
         hasChanged(attr?: string): any;
         changedAttributes(diff: any): any;
         previous(attr?: string): any;
         previousAttributes(): any;
-        fetch(options?: import("@converse/skeletor/src/types/model").Options): any;
-        save(key?: string | import("@converse/skeletor/src/types/model").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): any;
-        destroy(options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        fetch(options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        save(key?: string | import("@converse/skeletor/src/types/model.js").Attributes, val?: boolean | number | string | import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): any;
+        destroy(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         url(): any;
-        parse(resp: import("@converse/skeletor/src/types/model").Options, options?: import("@converse/skeletor/src/types/model").Options): import("@converse/skeletor/src/types/model").Options;
+        parse(resp: import("@converse/skeletor/src/types/model.js").Options, options?: import("@converse/skeletor/src/types/model.js").Options): import("@converse/skeletor/src/types/model.js").Options;
         isNew(): boolean;
-        isValid(options?: import("@converse/skeletor/src/types/model").Options): boolean;
-        _validate(attrs: import("@converse/skeletor/src/types/model").Attributes, options?: import("@converse/skeletor/src/types/model").Options): boolean;
+        isValid(options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
+        _validate(attrs: import("@converse/skeletor/src/types/model.js").Attributes, options?: import("@converse/skeletor/src/types/model.js").Options): boolean;
         on(name: string, callback: (event: any, model: Model, collection: import("@converse/skeletor").Collection, options: Record<string, any>) => any, context: any): any;
         _events: any;
         _listeners: {};
@@ -290,7 +290,7 @@ declare class MUCOccupant extends MUCOccupant_base {
      * This method houldn't be called directly, instead {@link MUC#queueMessage} should be called.
      * @param {MessageAttributes|StanzaParseError} attrs_or_error
      */
-    onMessage(attrs_or_error: import("../../shared/types").MessageAttributes | import("../../shared/errors").StanzaParseError): Promise<any>;
+    onMessage(attrs_or_error: import("../../shared/types").MessageAttributes | import("../../shared/errors").StanzaParseError): Promise<void>;
     /**
      * Return roles which may be assigned to this occupant
      * @returns {typeof ROLES} - An array of assignable roles

+ 1 - 1
src/headless/types/plugins/muc/utils.d.ts

@@ -18,7 +18,7 @@ export function onWindowStateChanged(): Promise<void>;
 /**
  * @param {Event} [event]
  */
-export function routeToRoom(event?: Event): Promise<any>;
+export function routeToRoom(event?: Event): Promise<void>;
 /**
  * Opens a groupchat, making sure that certain attributes
  * are correct, for example that the "type" is set to

+ 1 - 1
src/headless/types/shared/chatbox.d.ts

@@ -54,7 +54,7 @@ declare const ChatBoxBase_base: {
         sendMarkerForMessage(msg: import("./message.js").default<any>, type?: ("received" | "displayed" | "acknowledged"), force?: boolean): Promise<void>;
         handleUnreadMessage(message: import("./message.js").default<any>): void;
         getErrorAttributesForMessage(message: import("./message.js").default<any>, attrs: import("./types.js").MessageAttributes): Promise<any>;
-        handleErrorMessageStanza(stanza: Element): Promise<any>;
+        handleErrorMessageStanza(stanza: Element): Promise<void>;
         incrementUnreadMsgsCounter(message: import("./message.js").default<any>): void;
         clearUnreadMsgCounter(): void;
         handleRetraction(attrs: import("./types.js").MessageAttributes): Promise<boolean>;

+ 1 - 1
src/headless/types/shared/connection/index.d.ts

@@ -11,7 +11,7 @@ export class Connection extends Connection_base {
     /** @param {Element} body */
     xmlInput(body: Element): void;
     bind(): Promise<void>;
-    onDomainDiscovered(response: any): Promise<any>;
+    onDomainDiscovered(response: any): Promise<void>;
     /**
      * Adds support for XEP-0156 by quering the XMPP server for alternate
      * connection methods. This allows users to use the websocket or BOSH

+ 1 - 1
src/headless/types/shared/model-with-messages.d.ts

@@ -195,7 +195,7 @@ export default function ModelWithMessages<T extends import("./types").ModelExten
         /**
          * @param {Element} stanza
          */
-        handleErrorMessageStanza(stanza: Element): Promise<any>;
+        handleErrorMessageStanza(stanza: Element): Promise<void>;
         /**
          * @param {BaseMessage} message
          */

+ 1 - 1
src/headless/types/utils/index.d.ts

@@ -23,7 +23,7 @@ declare const _default: {
     shouldCreateMessage: typeof shouldCreateMessage;
     triggerEvent: typeof triggerEvent;
     isValidURL(text: string): boolean;
-    getURI(url: string | log): any;
+    getURI(url: string | promise.getOpenPromise): any;
     checkFileTypes(types: string[], url: string): boolean;
     filterQueryParamsFromURL(url: any): any;
     isURLWithImageExtension(url: any): boolean;

+ 1 - 1
src/headless/utils/index.js

@@ -4,7 +4,7 @@
  * @description This is the core utilities module.
  */
 import { Model } from '@converse/skeletor';
-import log, { LEVELS } from '../log.js';
+import log, { LEVELS } from '@converse/log';
 import * as array from './array.js';
 import * as arraybuffer from './arraybuffer.js';
 import * as color from './color.js';

+ 1 - 1
src/headless/utils/init.js

@@ -5,7 +5,7 @@ import Storage from "@converse/skeletor/src/storage.js";
 import _converse from "../shared/_converse";
 import debounce from "lodash-es/debounce";
 import localDriver from "localforage-webextensionstorage-driver/local";
-import log from "../log.js";
+import log from "@converse/log";
 import syncDriver from "localforage-webextensionstorage-driver/sync";
 import { ANONYMOUS, CORE_PLUGINS, EXTERNAL, LOGIN } from "../shared/constants.js";
 import { Model } from "@converse/skeletor";

+ 1 - 1
src/headless/utils/promise.js

@@ -1,4 +1,4 @@
-import log from '../log.js';
+import log from "@converse/log";
 import { getOpenPromise } from '@converse/openpromise';
 
 export { getOpenPromise };

+ 1 - 1
src/headless/utils/session.js

@@ -1,7 +1,7 @@
 /**
  * @typedef {module:shared-api-public.ConversePrivateGlobal} ConversePrivateGlobal
  */
-import log from '../log.js';
+import log from "@converse/log";
 import { getOpenPromise } from '@converse/openpromise';
 import { settings_api } from '../shared/settings/api.js';
 import { getInitSettings } from '../shared/settings/utils.js';

+ 1 - 1
src/headless/utils/url.js

@@ -1,5 +1,5 @@
 import URI from 'urijs';
-import log from '../log.js';
+import log from "@converse/log";
 import { settings_api } from '../shared/settings/api.js';
 import { URL_PARSE_OPTIONS } from '../shared/constants.js';
 

+ 21 - 0
src/log/LICENSE.txt

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 JC Brand
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 25 - 0
src/log/README.md

@@ -0,0 +1,25 @@
+# @converse/log
+
+A helper module which lets you log messages to the console, with different log levels.
+
+Use `log.setLogLevel` to set the log level. All messages with a log level equal
+to or higher than what's set, will be logged to the console.
+
+## Installation
+
+```bash
+npm install @converse/log
+```
+
+## Usage
+
+```javascript
+import log from '@converse/log';
+
+log.setLogLevel('warn');
+log.debug('Debug message'); // This message will NOT be logged
+log.info('Info message'); // This message will NOT be logged
+log.warn('Warning message'); // This message will be logged
+log.error('Error message'); // This message will be logged
+log.fatal('Fatal error'); // This message will be logged
+```

+ 135 - 0
src/log/index.js

@@ -0,0 +1,135 @@
+/**
+ * @type {Object.<string, number>}
+ */
+export const LEVELS = {
+    debug: 0,
+    info: 1,
+    warn: 2,
+    error: 3,
+    fatal: 4,
+};
+
+/* eslint-disable @typescript-eslint/no-empty-function */
+const logger = Object.assign(
+    {
+        debug: console?.log ? console.log.bind(console) : function noop() {},
+        error: console?.log ? console.log.bind(console) : function noop() {},
+        info: console?.log ? console.log.bind(console) : function noop() {},
+        warn: console?.log ? console.log.bind(console) : function noop() {},
+    },
+    console
+);
+/* eslint-enable @typescript-eslint/no-empty-function */
+
+/**
+ * Logs messages to the console.
+ * Available loglevels are:
+ *      - 0: 'debug'
+ *      - 1: 'info'
+ *      - 2: 'warn',
+ *      - 3: 'error'
+ *      - 4: 'fatal'.
+ * When using the 'error' or 'warn' loglevels, a full stacktrace will be logged as well.
+ * @namespace log
+ */
+const log = {
+    /** @type {keyof LEVELS} The current log level */
+    loglevel: "info",
+
+    /**
+     * Sets the current log level which determines which messages are logged
+     * @param {keyof LEVELS} level - The log level to set
+     * @throws {Error} If an invalid log level is provided
+     */
+    setLogLevel(level) {
+        if (!["debug", "info", "warn", "error", "fatal"].includes(/** @type {string} */ (level))) {
+            throw new Error(`Invalid loglevel: ${level}`);
+        }
+        this.loglevel = level;
+    },
+
+    /**
+     * Logs a message at the specified level with optional CSS styling
+     * @param {any} message - The message to log
+     * @param {keyof LEVELS} level - The log level to use
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    log(message, level, style = "") {
+        if (LEVELS[level] < LEVELS[this.loglevel]) {
+            return;
+        }
+        if (level === "error" || level === "fatal") {
+            style = style || "color: maroon";
+        } else if (level === "debug") {
+            style = style || "color: green";
+        }
+
+        if (message instanceof Error) {
+            message = message.stack;
+        } else if (isElement(message)) {
+            message = /** @type {Element} */ (message).outerHTML;
+        }
+        const prefix = style ? "%c" : "";
+        if (level === "error") {
+            logger.error(`${prefix} ERROR: ${message}`, style);
+        } else if (level === "warn") {
+            logger.warn(`${prefix} ${new Date().toISOString()} WARNING: ${message}`, style);
+        } else if (level === "fatal") {
+            logger.error(`${prefix} FATAL: ${message}`, style);
+        } else if (level === "debug") {
+            logger.debug(`${prefix} ${new Date().toISOString()} DEBUG: ${message}`, style);
+        } else {
+            logger.info(`${prefix} ${new Date().toISOString()} INFO: ${message}`, style);
+        }
+    },
+
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    debug(message, style) {
+        this.log(message, "debug", style);
+    },
+
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    error(message, style) {
+        this.log(message, "error", style);
+    },
+
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    info(message, style) {
+        this.log(message, "info", style);
+    },
+
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    warn(message, style) {
+        this.log(message, "warn", style);
+    },
+
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    fatal(message, style) {
+        this.log(message, "fatal", style);
+    },
+};
+
+/**
+ * @param {unknown} el - The value to check
+ * @returns {boolean} True if the value is an Element or Document
+ */
+export function isElement(el) {
+    return el instanceof Element || el instanceof Document;
+}
+
+export default log;

+ 25 - 0
src/log/package.json

@@ -0,0 +1,25 @@
+{
+  "name": "@converse/log",
+  "version": "0.0.1",
+  "description": "Logging utilities for Converse.js",
+  "author": "JC Brand <jc@opkode.com>",
+  "license": "MIT",
+  "main": "index.js",
+  "types": "types/index.d.ts",
+  "module": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no tests yet\" && exit 1",
+    "types": "tsc"
+  },
+  "keywords": [
+    "converse.js",
+    "logging"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/conversejs/converse.js.git"
+  },
+  "devDependencies": {
+    "typescript": "^5.5.4"
+  }
+}

+ 46 - 0
src/log/tsconfig.json

@@ -0,0 +1,46 @@
+{
+  "include": [
+      "**/*"
+  ],
+  "exclude": [
+      "**/tests/*",
+      "dist/",
+      "types/"
+  ],
+  "compilerOptions": {
+    "target": "es2016",
+    "module": "esnext",
+
+    "types": [
+      "@types/webappsec-credential-management"
+    ],
+
+    "lib": [
+      "ES2020",
+      "dom"
+    ],
+
+    "allowJs": true,
+    "checkJs": true,
+
+    // Generate d.ts files
+    "declaration": true,
+    "emitDeclarationOnly": true,
+    "declarationMap": true,
+
+    "rootDir": "./",
+    "outDir": "./types/",
+    "baseUrl": "./",
+
+    "esModuleInterop": true,
+    "forceConsistentCasingInFileNames": true,
+
+    "strict": false,
+    "noImplicitAny": false,
+
+    "skipLibCheck": true,
+
+    "moduleResolution": "node",
+    "resolveJsonModule": true
+  }
+}

+ 54 - 0
src/log/types/index.d.ts

@@ -0,0 +1,54 @@
+/**
+ * @param {unknown} el - The value to check
+ * @returns {boolean} True if the value is an Element or Document
+ */
+export function isElement(el: unknown): boolean;
+/**
+ * @type {Object.<string, number>}
+ */
+export const LEVELS: {
+    [x: string]: number;
+};
+export default log;
+declare namespace log {
+    let loglevel: string | number;
+    /**
+     * Sets the current log level which determines which messages are logged
+     * @param {keyof LEVELS} level - The log level to set
+     * @throws {Error} If an invalid log level is provided
+     */
+    function setLogLevel(level: string | number): void;
+    /**
+     * Logs a message at the specified level with optional CSS styling
+     * @param {any} message - The message to log
+     * @param {keyof LEVELS} level - The log level to use
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function log(message: any, level: string | number, style?: string): void;
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function debug(message: any, style?: string): void;
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function error(message: any, style?: string): void;
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function info(message: any, style?: string): void;
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function warn(message: any, style?: string): void;
+    /**
+     * @param {any} message - The message to log
+     * @param {string} [style=""] - Optional CSS styles to apply to the log message
+     */
+    function fatal(message: any, style?: string): void;
+}
+//# sourceMappingURL=index.d.ts.map

+ 1 - 1
src/types/plugins/chatview/bottom-panel.d.ts

@@ -7,7 +7,7 @@ export default class ChatBottomPanel extends CustomElement {
     model: any;
     connectedCallback(): Promise<void>;
     initialize(): Promise<void>;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     sendButtonClicked(ev: any): void;
     viewUnreadMessages(ev: any): void;
     onDragOver(ev: any): void;

+ 1 - 1
src/types/plugins/controlbox/controlbox.d.ts

@@ -10,7 +10,7 @@ declare class ControlBoxView extends CustomElement {
     initialize(): void;
     setModel(): void;
     model: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     close(ev: any): this;
     afterShown(): this;
 }

+ 1 - 1
src/types/plugins/muc-views/chatarea.d.ts

@@ -15,7 +15,7 @@ export default class MUCChatArea extends CustomElement {
     split: any;
     initialize(): Promise<void>;
     model: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     shouldShowSidebar(): boolean;
     getHelpMessages(): string[];
 }

+ 1 - 1
src/types/plugins/muc-views/heading.d.ts

@@ -5,7 +5,7 @@ export default class MUCHeading extends CustomElement {
     initialize(): Promise<void>;
     model: any;
     user_settings: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     /**
      * @param {MUCOccupant} occupant
      */

+ 1 - 1
src/types/plugins/muc-views/modtools.d.ts

@@ -50,7 +50,7 @@ export default class ModeratorTools extends CustomElement {
     initialize(): Promise<void>;
     initialized: any;
     muc: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     switchTab(ev: any): void;
     onSearchAffiliationChange(): Promise<void>;
     loading_users_with_affiliation: boolean;

+ 1 - 1
src/types/plugins/muc-views/occupant.d.ts

@@ -12,7 +12,7 @@ export default class MUCOccupant extends CustomElement {
     initialize(): Promise<void>;
     muc: any;
     model: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     /**
      * @param {string} jid
      */

+ 1 - 1
src/types/plugins/muc-views/sidebar-occupant.d.ts

@@ -15,7 +15,7 @@ export default class MUCOccupantListItem extends ObservableElement {
     };
     muc: any;
     initialize(): Promise<void>;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     /**
      * @param {MouseEvent} ev
      * @param {import('@converse/headless/types/plugins/muc/occupant.js').default} occupant

+ 1 - 1
src/types/plugins/muc-views/templates/muc-bottom-panel.d.ts

@@ -1,3 +1,3 @@
-declare function _default(el: import("../bottom-panel").default): import("lit").TemplateResult<1> | "";
+declare function _default(el: import("../bottom-panel").default): "" | import("lit").TemplateResult<1>;
 export default _default;
 //# sourceMappingURL=muc-bottom-panel.d.ts.map

+ 1 - 1
src/types/plugins/muc-views/templates/occupant-bottom-panel.d.ts

@@ -1,3 +1,3 @@
-declare function _default(el: import("../occupant-bottom-panel").default): import("lit").TemplateResult<1> | "";
+declare function _default(el: import("../occupant-bottom-panel").default): "" | import("lit").TemplateResult<1>;
 export default _default;
 //# sourceMappingURL=occupant-bottom-panel.d.ts.map

+ 1 - 1
src/types/plugins/omemo/fingerprints.d.ts

@@ -7,7 +7,7 @@ export class Fingerprints extends CustomElement {
     jid: any;
     initialize(): Promise<void>;
     devicelist: any;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     toggleDeviceTrust(ev: any): void;
 }
 import { CustomElement } from "shared/components/element.js";

+ 1 - 1
src/types/shared/avatar/avatar.d.ts

@@ -24,7 +24,7 @@ export default class Avatar extends CustomElement {
     width: number;
     height: number;
     name: string;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     /**
      * @param {string} name
      * @returns {string}

+ 1 - 1
src/types/shared/avatar/templates/avatar.d.ts

@@ -1,3 +1,3 @@
-declare function _default(o: any): import("lit").TemplateResult<1> | "";
+declare function _default(o: any): "" | import("lit").TemplateResult<1>;
 export default _default;
 //# sourceMappingURL=avatar.d.ts.map

+ 1 - 1
src/types/shared/chat/chat-content.d.ts

@@ -22,7 +22,7 @@ export default class ChatContent extends CustomElement {
     scrollHandler: (ev: Event) => void;
     mark_scrolled_debounce: NodeJS.Timeout;
     initialize(): Promise<void>;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     scrollDown(): void;
     #private;
 }

+ 1 - 1
src/types/shared/chat/message-limit.d.ts

@@ -6,7 +6,7 @@ export default class MessageLimitIndicator extends CustomElement {
     };
     model: any;
     connectedCallback(): void;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
 }
 import { CustomElement } from 'shared/components/element.js';
 //# sourceMappingURL=message-limit.d.ts.map

+ 2 - 2
src/types/shared/chat/message.d.ts

@@ -15,12 +15,12 @@ export default class Message extends ObservableElement {
     };
     model_with_messages: any;
     initialize(): Promise<void>;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     renderRetraction(): import("lit").TemplateResult<1>;
     renderMessageText(): import("lit").TemplateResult<1>;
     renderMEPMessage(): import("lit").TemplateResult<1>;
     renderInfoMessage(): import("lit").TemplateResult<1>;
-    renderFileProgress(): import("lit").TemplateResult<1> | "";
+    renderFileProgress(): "" | import("lit").TemplateResult<1>;
     renderChatMessage(): import("lit").TemplateResult<1>;
     shouldShowAvatar(): boolean;
     onImgClick(ev: any): void;

+ 1 - 1
src/types/shared/chat/templates/unfurl.d.ts

@@ -1,3 +1,3 @@
-declare function _default(o: any): import("lit").TemplateResult<1> | "";
+declare function _default(o: any): "" | import("lit").TemplateResult<1>;
 export default _default;
 //# sourceMappingURL=unfurl.d.ts.map

+ 1 - 1
src/types/shared/chat/toolbar.d.ts

@@ -39,7 +39,7 @@ export class ChatToolbar extends CustomElement {
     /**
      * @param {boolean} is_supported
      */
-    getHTTPUploadButton(is_supported: boolean): import("lit").TemplateResult<1> | "";
+    getHTTPUploadButton(is_supported: boolean): "" | import("lit").TemplateResult<1>;
     getSpoilerButton(): import("lit").TemplateResult<1>;
     /** @param {MouseEvent} ev */
     toggleFileUpload(ev: MouseEvent): void;

+ 1 - 1
src/types/shared/chat/unfurl.d.ts

@@ -22,7 +22,7 @@ export default class MessageUnfurl extends CustomElement {
     image: any;
     description: any;
     initialize(): void;
-    render(): import("lit").TemplateResult<1> | "";
+    render(): "" | import("lit").TemplateResult<1>;
     onImageLoad(): void;
 }
 import { CustomElement } from 'shared/components/element.js';

+ 1 - 1
src/types/shared/chat/utils.d.ts

@@ -19,7 +19,7 @@ export function getStandaloneButtons(promise: Promise<Array<HeadingButtonAttribu
 /**
  * @param {Promise<Array<object>>} promise
  */
-export function getDropdownButtons(promise: Promise<Array<object>>): Promise<import("lit").TemplateResult<1> | "">;
+export function getDropdownButtons(promise: Promise<Array<object>>): Promise<"" | import("lit").TemplateResult<1>>;
 export function onScrolledDown(model: any): void;
 /**
  * Given a message object, returns a TemplateResult indicating a new day if

+ 1 - 1
src/types/shared/modals/templates/user-details.d.ts

@@ -1,5 +1,5 @@
 /**
  * @param {import('../user-details').default} el
  */
-export function tplUserDetailsModal(el: import("../user-details").default): import("lit").TemplateResult<1> | "";
+export function tplUserDetailsModal(el: import("../user-details").default): "" | import("lit").TemplateResult<1>;
 //# sourceMappingURL=user-details.d.ts.map

+ 1 - 1
src/types/shared/modals/user-details.d.ts

@@ -5,7 +5,7 @@ export default class UserDetailsModal extends BaseModal {
      * @param {Map<string, any>} changed
      */
     shouldUpdate(changed: Map<string, any>): boolean;
-    renderModal(): import("lit").TemplateResult<1> | "";
+    renderModal(): "" | import("lit").TemplateResult<1>;
     getModalTitle(): any;
     registerContactEventHandlers(): void;
     /**

+ 5 - 0
tsconfig.json

@@ -6,6 +6,7 @@
       "src/types/*",
       "src/**/tests/*",
       "src/headless/",
+      "src/log/",
       "src/website.js"
   ],
   "compilerOptions": {
@@ -32,6 +33,10 @@
     "rootDir": "./src",
     "outDir": "./src/types/",
     "baseUrl": "./src/",
+    "paths": {
+      "@converse/log": ["log/types/index.d.ts"],
+      "@converse/headless": ["headless/types/index.d.ts"]
+    },
 
     "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,