From e1dd99b69383836c3f4d07c1ed8f246758505fee Mon Sep 17 00:00:00 2001 From: babayaga Date: Tue, 30 Dec 2025 20:36:17 +0100 Subject: [PATCH] discourse 3/3 --- packages/discourse/dist/src/_cli.d.ts | 1 + packages/discourse/dist/src/_cli.js | 13 + packages/discourse/dist/src/_cli.js.map | 1 + packages/discourse/dist/src/cli.d.ts | 2 + packages/discourse/dist/src/cli.js | 4 + packages/discourse/dist/src/cli.js.map | 1 + packages/discourse/dist/src/constants.d.ts | 1 + packages/discourse/dist/src/constants.js | 2 + packages/discourse/dist/src/constants.js.map | 1 + packages/discourse/dist/src/index.d.ts | 6 + packages/discourse/dist/src/index.js | 7 + packages/discourse/dist/src/index.js.map | 1 + .../dist/src/lib/discourse/cache.d.ts | 11 + .../discourse/dist/src/lib/discourse/cache.js | 110 + .../dist/src/lib/discourse/cache.js.map | 1 + .../dist/src/lib/discourse/constants.d.ts | 70 + .../dist/src/lib/discourse/constants.js | 94 + .../dist/src/lib/discourse/constants.js.map | 1 + .../dist/src/lib/discourse/index.d.ts | 180 ++ .../discourse/dist/src/lib/discourse/index.js | 831 +++++++ .../dist/src/lib/discourse/index.js.map | 1 + .../dist/src/lib/discourse/types.d.ts | 697 ++++++ .../discourse/dist/src/lib/discourse/types.js | 4 + .../dist/src/lib/discourse/types.js.map | 1 + packages/discourse/dist/src/lib/index.d.ts | 2 + packages/discourse/dist/src/lib/index.js | 3 + packages/discourse/dist/src/lib/index.js.map | 1 + .../dist/src/lib/markdown/Pattern.d.ts | 7 + .../dist/src/lib/markdown/Pattern.js | 12 + .../dist/src/lib/markdown/Pattern.js.map | 1 + .../discourse/dist/src/lib/markdown/Rule.d.ts | 7 + .../discourse/dist/src/lib/markdown/Rule.js | 12 + .../dist/src/lib/markdown/Rule.js.map | 1 + .../dist/src/lib/markdown/index.d.ts | 14 + .../discourse/dist/src/lib/markdown/index.js | 98 + .../dist/src/lib/markdown/index.js.map | 1 + .../dist/src/lib/markdown/index.test.d.ts | 1 + .../src/lib/markdown/index.test.js} | 124 +- .../dist/src/lib/markdown/index.test.js.map | 1 + .../discourse/dist/src/lib/markdown/page.d.ts | 1 + .../page.ts => dist/src/lib/markdown/page.js} | 16 +- .../dist/src/lib/markdown/page.js.map | 1 + .../dist/src/lib/markdown/types.d.ts | 5 + .../discourse/dist/src/lib/markdown/types.js | 2 + .../dist/src/lib/markdown/types.js.map | 1 + packages/discourse/dist/src/main.d.ts | 2 + packages/discourse/dist/src/main.js | 14 + packages/discourse/dist/src/main.js.map | 1 + packages/discourse/dist/src/options.d.ts | 3 + packages/discourse/dist/src/options.js | 21 + packages/discourse/dist/src/options.js.map | 1 + packages/discourse/dist/src/types.d.ts | 157 ++ packages/discourse/dist/src/types.js | 38 + packages/discourse/dist/src/types.js.map | 1 + packages/discourse/dist/tests/commons.d.ts | 4 + packages/discourse/dist/tests/commons.js | 15 + packages/discourse/dist/tests/commons.js.map | 1 + packages/discourse/dist/tests/posts.test.d.ts | 1 + packages/discourse/dist/tests/posts.test.js | 16 + .../discourse/dist/tests/posts.test.js.map | 1 + .../discourse/dist/tests/topics.test.d.ts | 1 + packages/discourse/dist/tests/topics.test.js | 37 + .../discourse/dist/tests/topics.test.js.map | 1 + packages/discourse/dist/tests/users.test.d.ts | 1 + packages/discourse/dist/tests/users.test.js | 28 + .../discourse/dist/tests/users.test.js.map | 1 + packages/discourse/package-lock.json | 1958 +++++++++++++---- packages/discourse/package.json | 5 +- packages/discourse/src/_cli.ts | 60 - packages/discourse/src/cli.ts | 4 + packages/discourse/src/index.ts | 12 - packages/discourse/src/lib/discourse/index.ts | 78 +- .../discourse/src/lib/markdown/Pattern.ts | 2 +- packages/discourse/src/lib/markdown/Rule.ts | 2 +- packages/discourse/src/lib/markdown/index.ts | 16 +- packages/discourse/src/main.ts | 14 +- packages/discourse/tests/commons.ts | 17 + packages/discourse/tests/posts.test.ts | 16 + packages/discourse/tests/topics.test.ts | 36 + packages/discourse/tests/users.test.ts | 28 + packages/discourse/tsconfig.json | 3 +- 81 files changed, 4301 insertions(+), 647 deletions(-) create mode 100644 packages/discourse/dist/src/_cli.d.ts create mode 100644 packages/discourse/dist/src/_cli.js create mode 100644 packages/discourse/dist/src/_cli.js.map create mode 100644 packages/discourse/dist/src/cli.d.ts create mode 100644 packages/discourse/dist/src/cli.js create mode 100644 packages/discourse/dist/src/cli.js.map create mode 100644 packages/discourse/dist/src/constants.d.ts create mode 100644 packages/discourse/dist/src/constants.js create mode 100644 packages/discourse/dist/src/constants.js.map create mode 100644 packages/discourse/dist/src/index.d.ts create mode 100644 packages/discourse/dist/src/index.js create mode 100644 packages/discourse/dist/src/index.js.map create mode 100644 packages/discourse/dist/src/lib/discourse/cache.d.ts create mode 100644 packages/discourse/dist/src/lib/discourse/cache.js create mode 100644 packages/discourse/dist/src/lib/discourse/cache.js.map create mode 100644 packages/discourse/dist/src/lib/discourse/constants.d.ts create mode 100644 packages/discourse/dist/src/lib/discourse/constants.js create mode 100644 packages/discourse/dist/src/lib/discourse/constants.js.map create mode 100644 packages/discourse/dist/src/lib/discourse/index.d.ts create mode 100644 packages/discourse/dist/src/lib/discourse/index.js create mode 100644 packages/discourse/dist/src/lib/discourse/index.js.map create mode 100644 packages/discourse/dist/src/lib/discourse/types.d.ts create mode 100644 packages/discourse/dist/src/lib/discourse/types.js create mode 100644 packages/discourse/dist/src/lib/discourse/types.js.map create mode 100644 packages/discourse/dist/src/lib/index.d.ts create mode 100644 packages/discourse/dist/src/lib/index.js create mode 100644 packages/discourse/dist/src/lib/index.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/Pattern.d.ts create mode 100644 packages/discourse/dist/src/lib/markdown/Pattern.js create mode 100644 packages/discourse/dist/src/lib/markdown/Pattern.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/Rule.d.ts create mode 100644 packages/discourse/dist/src/lib/markdown/Rule.js create mode 100644 packages/discourse/dist/src/lib/markdown/Rule.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/index.d.ts create mode 100644 packages/discourse/dist/src/lib/markdown/index.js create mode 100644 packages/discourse/dist/src/lib/markdown/index.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/index.test.d.ts rename packages/discourse/{src/lib/markdown/index.test.ts => dist/src/lib/markdown/index.test.js} (51%) create mode 100644 packages/discourse/dist/src/lib/markdown/index.test.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/page.d.ts rename packages/discourse/{src/lib/markdown/page.ts => dist/src/lib/markdown/page.js} (90%) create mode 100644 packages/discourse/dist/src/lib/markdown/page.js.map create mode 100644 packages/discourse/dist/src/lib/markdown/types.d.ts create mode 100644 packages/discourse/dist/src/lib/markdown/types.js create mode 100644 packages/discourse/dist/src/lib/markdown/types.js.map create mode 100644 packages/discourse/dist/src/main.d.ts create mode 100644 packages/discourse/dist/src/main.js create mode 100644 packages/discourse/dist/src/main.js.map create mode 100644 packages/discourse/dist/src/options.d.ts create mode 100644 packages/discourse/dist/src/options.js create mode 100644 packages/discourse/dist/src/options.js.map create mode 100644 packages/discourse/dist/src/types.d.ts create mode 100644 packages/discourse/dist/src/types.js create mode 100644 packages/discourse/dist/src/types.js.map create mode 100644 packages/discourse/dist/tests/commons.d.ts create mode 100644 packages/discourse/dist/tests/commons.js create mode 100644 packages/discourse/dist/tests/commons.js.map create mode 100644 packages/discourse/dist/tests/posts.test.d.ts create mode 100644 packages/discourse/dist/tests/posts.test.js create mode 100644 packages/discourse/dist/tests/posts.test.js.map create mode 100644 packages/discourse/dist/tests/topics.test.d.ts create mode 100644 packages/discourse/dist/tests/topics.test.js create mode 100644 packages/discourse/dist/tests/topics.test.js.map create mode 100644 packages/discourse/dist/tests/users.test.d.ts create mode 100644 packages/discourse/dist/tests/users.test.js create mode 100644 packages/discourse/dist/tests/users.test.js.map create mode 100644 packages/discourse/src/cli.ts create mode 100644 packages/discourse/tests/commons.ts create mode 100644 packages/discourse/tests/posts.test.ts create mode 100644 packages/discourse/tests/topics.test.ts create mode 100644 packages/discourse/tests/users.test.ts diff --git a/packages/discourse/dist/src/_cli.d.ts b/packages/discourse/dist/src/_cli.d.ts new file mode 100644 index 00000000..43e6fa75 --- /dev/null +++ b/packages/discourse/dist/src/_cli.d.ts @@ -0,0 +1 @@ +export declare const defaults: () => void; diff --git a/packages/discourse/dist/src/_cli.js b/packages/discourse/dist/src/_cli.js new file mode 100644 index 00000000..b0e2cb5b --- /dev/null +++ b/packages/discourse/dist/src/_cli.js @@ -0,0 +1,13 @@ +export const defaults = () => { + // default command + const DefaultCommand = 'info'; + if (process.argv.length === 2) { + process.argv.push(DefaultCommand); + } + process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; + // currently no default handler, display only : + process.on('unhandledRejection', (reason) => { + console.error('Unhandled rejection, reason: ', reason); + }); +}; +//# sourceMappingURL=_cli.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/_cli.js.map b/packages/discourse/dist/src/_cli.js.map new file mode 100644 index 00000000..3a227bd1 --- /dev/null +++ b/packages/discourse/dist/src/_cli.js.map @@ -0,0 +1 @@ +{"version":3,"file":"_cli.js","sourceRoot":"","sources":["../../src/_cli.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IACzB,kBAAkB;IAClB,MAAM,cAAc,GAAG,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QAC3B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KACrC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;IAElD,+CAA+C;IAC/C,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE;QAChD,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/cli.d.ts b/packages/discourse/dist/src/cli.d.ts new file mode 100644 index 00000000..d6251a34 --- /dev/null +++ b/packages/discourse/dist/src/cli.d.ts @@ -0,0 +1,2 @@ +/// +export declare const cli: import("yargs").Argv<{}>; diff --git a/packages/discourse/dist/src/cli.js b/packages/discourse/dist/src/cli.js new file mode 100644 index 00000000..7b0fd58d --- /dev/null +++ b/packages/discourse/dist/src/cli.js @@ -0,0 +1,4 @@ +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +export const cli = yargs(hideBin(process.argv)); +//# sourceMappingURL=cli.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/cli.js.map b/packages/discourse/dist/src/cli.js.map new file mode 100644 index 00000000..3df86f87 --- /dev/null +++ b/packages/discourse/dist/src/cli.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEvC,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/constants.d.ts b/packages/discourse/dist/src/constants.d.ts new file mode 100644 index 00000000..ca2c1318 --- /dev/null +++ b/packages/discourse/dist/src/constants.d.ts @@ -0,0 +1 @@ +export declare const MODULE_NAME = "OSR-DISCOURSE"; diff --git a/packages/discourse/dist/src/constants.js b/packages/discourse/dist/src/constants.js new file mode 100644 index 00000000..df4d533d --- /dev/null +++ b/packages/discourse/dist/src/constants.js @@ -0,0 +1,2 @@ +export const MODULE_NAME = `OSR-DISCOURSE`; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/constants.js.map b/packages/discourse/dist/src/constants.js.map new file mode 100644 index 00000000..e93b9996 --- /dev/null +++ b/packages/discourse/dist/src/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/index.d.ts b/packages/discourse/dist/src/index.d.ts new file mode 100644 index 00000000..5e4594a6 --- /dev/null +++ b/packages/discourse/dist/src/index.d.ts @@ -0,0 +1,6 @@ +export * from './constants.js'; +export * from './types.js'; +export * from './lib/index.js'; +export { Logger } from 'tslog'; +import { IObjectLiteral } from "@polymech/core"; +export declare const substitute: (alt: boolean, template: string, vars?: IObjectLiteral) => any; diff --git a/packages/discourse/dist/src/index.js b/packages/discourse/dist/src/index.js new file mode 100644 index 00000000..21b8f15b --- /dev/null +++ b/packages/discourse/dist/src/index.js @@ -0,0 +1,7 @@ +export * from './constants.js'; +export * from './types.js'; +export * from './lib/index.js'; +export { Logger } from 'tslog'; +import { substitute as _substitute, substituteAlt as _substituteAlt } from "@polymech/core/strings"; +export const substitute = (alt, template, vars = {}) => alt ? _substituteAlt(template, vars) : _substitute(template, vars); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/index.js.map b/packages/discourse/dist/src/index.js.map new file mode 100644 index 00000000..f62a8e0b --- /dev/null +++ b/packages/discourse/dist/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEnG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,QAAgB,EAAE,OAAuB,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/cache.d.ts b/packages/discourse/dist/src/lib/discourse/cache.d.ts new file mode 100644 index 00000000..8ef04932 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/cache.d.ts @@ -0,0 +1,11 @@ +/// +/// +import { IDiscourseUser } from '../../index.js'; +import { Discourser } from '../index.js'; +export declare const fileAsBuffer: (path: string) => Buffer; +export declare const cacheCategories: (options: any, discourse: Discourser) => Promise; +export declare const cacheTopics: (options: any, discourse: Discourser) => Promise; +export declare const _getForumUsers: (d: Discourser, page: any, detail: any) => any; +export declare const getForumUsers: (d: any, detail: any) => Promise; +export declare const cacheUsers: (options: any, discourse: Discourser) => Promise; +export declare const cacheTags: (options: any, discourse: Discourser) => Promise; diff --git a/packages/discourse/dist/src/lib/discourse/cache.js b/packages/discourse/dist/src/lib/discourse/cache.js new file mode 100644 index 00000000..83e8b5ff --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/cache.js @@ -0,0 +1,110 @@ +import { Promise as BPromise } from 'bluebird'; +import { sync as read } from '@polymech/fs/read'; +import { sync as exists } from '@polymech/fs/exists'; +import { sync as write } from '@polymech/fs/write'; +import { resolve } from '@polymech/commons'; +import { DISCOURSE_CATEGORY_CACHE, DISCOURSE_TAGS_CACHE, DISCOURSE_USER_CACHE, } from '../discourse/constants.js'; +import * as path from 'path'; +export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-"); +import { get_cached, set_cached } from '@polymech/cache/lib'; +import { OSR_CACHE } from '@polymech/commons'; +import { MODULE_NAME } from '../../constants.js'; +export const cacheCategories = async (options, discourse) => { + const osr_cache = OSR_CACHE(); + const cPath = path.resolve(resolve(DISCOURSE_CATEGORY_CACHE)); + const cached = exists(cPath) ? await get_cached(cPath, {}, MODULE_NAME) : null; + if (osr_cache && cached && options.cache !== false) { + return JSON.parse(cached); + } + let cats = await discourse.getCategories({ + include_subcategories: true + }); + write(cPath, cats); + if (osr_cache && options.cache !== false) { + await set_cached(cPath, {}, MODULE_NAME, cats); + } + return cats; +}; +export const cacheTopics = async (options, discourse) => { +}; +let uPage = 1; +let usersAll = []; +export const _getForumUsers = async (d, page, detail) => { + const uPath = path.resolve(resolve(DISCOURSE_USER_CACHE)); + if (uPage == 1) { + usersAll = []; + } + let users = await d.getUsers(page); + if (users.length) { + usersAll = usersAll.concat(users); + uPage++; + return _getForumUsers(d, uPage, detail); + } + else { + uPage = 1; + write(uPath, usersAll); + let fUsers = read(uPath, 'json') || []; + const add = async (u) => { + return new Promise((resolve, reject) => { + let fUser = fUsers.find((fu) => u.id == fu.id); + if (!fUser) { + fUsers.push(u); + fUser = u; + } + if (fUser.detail) { + console.log('Retrieve User Detail ' + u.name); + setTimeout(() => { + d.getUser(fUser.id).then((detail) => { + if (detail) { + fUser.detail = detail; + } + write(uPath, fUsers); + resolve(fUser); + }); + }, 200); + } + else { + resolve(fUser); + } + }); + }; + return await BPromise.resolve(usersAll).map((u) => { + return add(u); + }, { concurrency: 1 }); + } +}; +export const getForumUsers = async (d, detail) => { + return _getForumUsers(d, uPage, detail); +}; +export const cacheUsers = async (options, discourse) => { + const osr_cache = OSR_CACHE(); + const uPath = path.resolve(resolve(DISCOURSE_USER_CACHE)); + const cached = exists(uPath) ? await get_cached(uPath, {}, MODULE_NAME) : null; + if (osr_cache && options.cache !== false && exists(uPath)) { + return read(uPath, 'json'); + } + if (osr_cache && cached && options.cache !== false) { + return JSON.parse(cached); + } + let users = await getForumUsers(discourse, false); + write(uPath, users); + if (osr_cache && options.cache !== false) { + await set_cached(uPath, {}, MODULE_NAME, users); + } + return users; +}; +export const cacheTags = async (options, discourse) => { + const osr_cache = OSR_CACHE(); + const tPath = path.resolve(resolve(DISCOURSE_TAGS_CACHE)); + const cached = exists(tPath) ? await get_cached(tPath, {}, MODULE_NAME) : null; + if (osr_cache && cached && options.cache !== false) { + return JSON.parse(cached); + } + let tags = await discourse.getTags(); + write(tPath, tags); + if (osr_cache && options.cache !== false) { + await set_cached(tPath, {}, MODULE_NAME, tags); + } + return tags; +}; +//# sourceMappingURL=cache.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/cache.js.map b/packages/discourse/dist/src/lib/discourse/cache.js.map new file mode 100644 index 00000000..986f59ce --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/cache.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../src/lib/discourse/cache.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/constants.d.ts b/packages/discourse/dist/src/lib/discourse/constants.d.ts new file mode 100644 index 00000000..49a2ce1c --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/constants.d.ts @@ -0,0 +1,70 @@ +export type EDiscourseConfigKey = 'discourse' | 'discourse_admin'; +export declare const SYNC_TRACK_FILENAME = "discourse-sync.json"; +export declare const OSR_CACHE_ROOT = "${OSR_CACHE}"; +export declare const OSR_DISCOURSE_CACHE = "${OSR_CACHE}/discourse"; +export declare const DISCOURSE_CATEGORY_CACHE = "${OSR_CACHE}/discourse/cats.json"; +export declare const DISCOURSE_TOPICS_CACHE = "${OSR_CACHE}/discourse/topics.json"; +export declare const DISCOURSE_TAGS_CACHE = "${OSR_CACHE}/discourse/tags.json"; +export declare const DISCOURSE_USER_CACHE = "${OSR_CACHE}/discourse/users.json"; +export declare const OA_DIRECTORY_OVERVIEW_TOPIC = 28873; +export declare const OA_USER_IMPORT_GROUP = 43; +export declare const KB_USERS = "${KB_ROOT}/static/users"; +export declare const DATA_PATH = "${OSR_ROOT}/osr-directory/pp"; +export declare const LATEST_TRACK = "${OSR_ROOT}/osr-directory/pp/merged.json"; +export declare const LATEST_TEST = "./latest_test.json"; +export declare const FETCH_DUSERS = false; +export declare const F_USERS_NOW = "./fusers.json"; +export declare const F_USERS_ALL = "./fusers-all.json"; +export declare const DEFAULT_PASSWORD: () => string; +export declare const HOWTOS_ASSETS_URL: () => string; +export declare const MACHINES_ASSETS_URL: () => string; +export declare const CAT_TEST = 65; +export declare const TAGS_TEST = "plastic, meta"; +export declare const DEFAULT_IMPORT_OWNER = 1; +export declare const D_ROOT_CAT = 97; +export declare const D_ROOT_AFRICA = 79; +export declare const D_ROOT_ASIA = 60; +export declare const D_ROOT_EUROPE = 59; +export declare const D_ROOT_AUSTRALIA = 76; +export declare const D_ROOT_NAMERICA = 101; +export declare const D_ROOT_SAMERICA = 102; +export declare const D_ROOT_OCEANIA = 103; +export declare const HT_CAT_ROOT = 54; +export declare const HT_CAT_GUIDES = 86; +export declare const HT_CAT_MACHINES = 87; +export declare const HT_CAT_PRODUCTS = 88; +export declare const HT_CAT_MOULDS = 89; +export declare const HT_CAT_IDS: { + HT_CAT_ROOT: number; + HT_CAT_GUIDES: number; + HT_CAT_MACHINES: number; + HT_CAT_PRODUCTS: number; + HT_CAT_MOULDS: number; +}; +export declare const HT_CATS: { + Guides: number; + Machines: number; + Products: number; + Moulds: number; +}; +export declare const MACHINE_CAT_INJECTION = 50; +export declare const MACHINE_CAT_EXTRUSION = 51; +export declare const MACHINE_CAT_SHREDDER = 52; +export declare const MACHINE_CAT_SHEETPRESS = 63; +export declare const MACHINE_CAT_3DPRINT = 70; +export declare const MACHINE_CAT_MOULDS = 71; +export declare const MACHINE_CAT_IDS: { + MACHINE_CAT_INJECTION: number; + MACHINE_CAT_EXTRUSION: number; + MACHINE_CAT_SHREDDER: number; + MACHINE_CAT_SHEETPRESS: number; + MACHINE_CAT_3DPRINT: number; + MACHINE_CAT_MOULDS: number; +}; +export declare const MACHINE_CATS: { + Injection: number; + Extrusion: number; + Sheetpress: number; + '3DPrint': number; + Moulds: number; +}; diff --git a/packages/discourse/dist/src/lib/discourse/constants.js b/packages/discourse/dist/src/lib/discourse/constants.js new file mode 100644 index 00000000..51dac7ba --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/constants.js @@ -0,0 +1,94 @@ +////////////////////////////////////////////////////////////// +// +// Keys +// +////////////////////////////////////////////////////////////// +// +// Paths +// +export const SYNC_TRACK_FILENAME = 'discourse-sync.json'; +export const OSR_CACHE_ROOT = '${OSR_CACHE}'; +export const OSR_DISCOURSE_CACHE = '${OSR_CACHE}/discourse'; +export const DISCOURSE_CATEGORY_CACHE = '${OSR_CACHE}/discourse/cats.json'; +export const DISCOURSE_TOPICS_CACHE = '${OSR_CACHE}/discourse/topics.json'; +export const DISCOURSE_TAGS_CACHE = '${OSR_CACHE}/discourse/tags.json'; +export const DISCOURSE_USER_CACHE = '${OSR_CACHE}/discourse/users.json'; +////////////////////////////////////////////////////////////// +// +// OA - User Import +// +export const OA_DIRECTORY_OVERVIEW_TOPIC = 28873; +export const OA_USER_IMPORT_GROUP = 43; +export const KB_USERS = '${KB_ROOT}/static/users'; +export const DATA_PATH = '${OSR_ROOT}/osr-directory/pp'; +export const LATEST_TRACK = '${OSR_ROOT}/osr-directory/pp/merged.json'; +export const LATEST_TEST = './latest_test.json'; +export const FETCH_DUSERS = false; +export const F_USERS_NOW = './fusers.json'; +export const F_USERS_ALL = './fusers-all.json'; +export const DEFAULT_PASSWORD = () => '4g0&KPN$e*Un'; +export const HOWTOS_ASSETS_URL = () => `https://kb.osr-plastic.org/howtos/`; +export const MACHINES_ASSETS_URL = () => `https://assets.osr-plastic.org/machines/`; +export const CAT_TEST = 65; +export const TAGS_TEST = 'plastic, meta'; +export const DEFAULT_IMPORT_OWNER = 1; +////////////////////////////////////////////////////////////// +// +// OA - Directory Import +// +export const D_ROOT_CAT = 97; +export const D_ROOT_AFRICA = 79; +export const D_ROOT_ASIA = 60; +export const D_ROOT_EUROPE = 59; +export const D_ROOT_AUSTRALIA = 76; +export const D_ROOT_NAMERICA = 101; +export const D_ROOT_SAMERICA = 102; +export const D_ROOT_OCEANIA = 103; +////////////////////////////////////////////////////////////// +// +// OA - Howto Import +// +export const HT_CAT_ROOT = 54; +export const HT_CAT_GUIDES = 86; +export const HT_CAT_MACHINES = 87; +export const HT_CAT_PRODUCTS = 88; +export const HT_CAT_MOULDS = 89; +export const HT_CAT_IDS = { + HT_CAT_ROOT, + HT_CAT_GUIDES, + HT_CAT_MACHINES, + HT_CAT_PRODUCTS, + HT_CAT_MOULDS +}; +export const HT_CATS = { + 'Guides': HT_CAT_GUIDES, + 'Machines': HT_CAT_MACHINES, + 'Products': HT_CAT_PRODUCTS, + 'Moulds': HT_CAT_MOULDS +}; +////////////////////////////////////////////////////////////// +// +// OA - Library Import +// +export const MACHINE_CAT_INJECTION = 50; +export const MACHINE_CAT_EXTRUSION = 51; +export const MACHINE_CAT_SHREDDER = 52; +export const MACHINE_CAT_SHEETPRESS = 63; +export const MACHINE_CAT_3DPRINT = 70; +export const MACHINE_CAT_MOULDS = 71; +export const MACHINE_CAT_IDS = { + MACHINE_CAT_INJECTION, + MACHINE_CAT_EXTRUSION, + MACHINE_CAT_SHREDDER, + MACHINE_CAT_SHEETPRESS, + MACHINE_CAT_3DPRINT, + MACHINE_CAT_MOULDS +}; +export const MACHINE_CATS = { + 'Injection': MACHINE_CAT_INJECTION, + 'Extrusion': MACHINE_CAT_EXTRUSION, + 'Sheetpress': MACHINE_CAT_SHEETPRESS, + '3DPrint': MACHINE_CAT_3DPRINT, + 'Moulds': HT_CAT_MOULDS +}; +//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/constants.js.map b/packages/discourse/dist/src/lib/discourse/constants.js.map new file mode 100644 index 00000000..21b6c9d7 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/lib/discourse/constants.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/index.d.ts b/packages/discourse/dist/src/lib/discourse/index.d.ts new file mode 100644 index 00000000..bf8d37ac --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/index.d.ts @@ -0,0 +1,180 @@ +import { IDiscourseConfig } from '@polymech/commons/types'; +import PromisePool from 'native-promise-pool'; +export declare const escape: (path: string) => string; +import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types.js'; +import { Category, CategoriesResponse, PostsResponse, PostResponse, TopicResponse, TopicItem, CategoryResponse, PostItem, PostUpdateItem, IDiscourserConfig, Thread, PostModifier, FetchConfig, FetchOptions, ISearchResult, ICreateUserResponse, IUserDetail, TagsResponse, Tag, TopicUpdateBasicTopic } from './types.js'; +import { IDiscourseUser } from '@polymech/commons'; +import { EDiscourseConfigKey } from './constants.js'; +/** + * Discourser is an API Client for the [Discourse API](https://docs.discourse.org) + * It special features are: + * - TypeScript Types + * - Respecting Rate Limits + * - Optional Heavy Caching + * - Post Modifiers (can be used for global find and replace across all posts on the forum) + */ +export declare class Discourser { + readonly host: string; + readonly key: string; + readonly username: string; + readonly cache?: string; + readonly useCache?: boolean; + readonly dry: boolean; + readonly pool: PromisePool; + /** + * Construct our Discourser instance + * See {@link IDiscourserConfig} for available configuration. + */ + constructor(config: IDiscourserConfig); + /** Get the URL of a topic */ + getTopicURL(topic: TopicItem | TopicResponse | number): string; + /** Fetch a discourse API URL, with rate limit concurrency and optional caching */ + fetch({ url, useCache, request }: FetchConfig): Promise; + /** Fetch a discourse API URL, with rate limit retries */ + private _post; + /** Fetch a discourse API URL, with rate limit retries */ + private _fetch; + /** + * API Helper for {@link .search} + * https://docs.discourse.org/#tag/Search/operation/search + */ + search(query: string, params?: string, opts?: FetchOptions): Promise; + /** + * API Helper for {@link .getTags} + */ + protected getTagsResponse(opts?: FetchOptions): Promise; + /** + * Fetch the whole information, for all categories of the forum + */ + getTags(opts?: FetchOptions): Promise; + createTag(name: any): Promise; + /** + * API Helper for {@link .getCategories} + */ + protected getCategoriesResponse(opts?: FetchOptions): Promise; + /** + * Fetch the whole information, for all categories of the forum + */ + getCategories(opts?: FetchOptions): Promise; + /** + * API Helper for {@link .getTopicItemsOfCategory} + * Discourse does not provide an API for fetching category information for a specific category. + * Instead, all that it provides is a way of getting the topics for a specific category. + */ + protected getCategoryResponse(categoryID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all topics of a specific category + */ + getTopicItemsOfCategory(categoryID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all topics of specific categoires + */ + getTopicItemsOfCategories(categoryIDs: number[], opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all topics of the forum + */ + getTopicItems(opts?: FetchOptions): Promise; + /** + * Fetch the whole information, for a specific topic of the forum + */ + getTopic(id: number, opts?: FetchOptions): Promise; + /** + * Fetch the whole information, for all topics, or specific topics, of the forum + */ + getTopics(topicIDs?: number[] | null, opts?: FetchOptions): Promise; + updateTopicVisibility(topicID: number, listed?: boolean, visible?: TPostStatus): Promise; + updateTopicTimestamp(topicID: number, timestamp: Date | string | number, token: string): Promise; + /** + * API Helper for {@link .getPostItemsOfTopic} + */ + protected getPostItemsOfTopicResponse(topicID: number, opts?: FetchOptions): Promise; + _createUser(name: any, email: any, pUserGroup: any): Promise; + getUsers(page: any): Promise; + getUser(id: any): Promise; + /** + * Fetch the partial information, for all posts of a specific topic + */ + getPostItemsOfTopic(topicID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of specific topics + */ + getPostItemsOfTopics(topicIDs: number[], opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of a specific category + */ + getPostItemsOfCategory(categoryID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of specific categories + */ + getPostItemsOfCategories(categoryIDs: number[], opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of the forum + */ + getPostItems(opts?: FetchOptions): Promise; + /** + * Fetch the whole information, for a specific post of the forum + */ + getPost(id: number, opts?: FetchOptions): Promise; + createReply(postId: any, raw: any, category: any): Promise; + changeOwner(postId: string | number, topicId: string | number, owner: string): Promise; + createUser(data: any): Promise; + getUserByUsername(username: any): Promise; + setUserAvatar(user_name: any, upload_id: any): Promise; + updateUser(user_name: any, args: any): Promise; + updateGroup(user_name: any, group: any): Promise; + upload(userId: any, file: any): Promise; + uploadFile(userId: any, file: any): Promise; + /** + * Fetch the whole information, for all posts, or specific posts, of the forum + */ + getPosts(postIDs?: number[] | null, opts?: FetchOptions): Promise; + createPost(title: string, raw: string, category: number): Promise; + /** + * Update a post with the content + * @param postID the identifier of the post to update + * @param content the new raw content for the post + * @param reason the reason, if provided, for modifying the post + * @param old if the old raw content is provided, then the update verified that you are working with the latest post content before applying the update + */ + updatePost(postID: number, content: string, reason?: string, old?: string): Promise; + /** + * Update post meta + */ + updateTopic(postId: number, category_id: number, title: string, tags?: string[]): Promise; + rebakePost(postID: number): Promise; + /** + * Modify a post using a modifier + */ + modifyPost(post: PostResponse, modifier: PostModifier): Promise; + /** + * Modify a post (via its post identifier) using a modifier + */ + modifyPostID(post: number, modifier: PostModifier): Promise; + /** + * Modify a post (via fetching the whole post from the partial post identifier) using a modifier + */ + modifyPostItem(post: PostItem, modifier: PostModifier): Promise; + /** + * Run the post modifier on all specified posts + */ + modifyPosts(posts: PostResponse[], modifier: PostModifier): Promise; + /** + * Fetch the partial information, for all posts of a specific topic + * Alias of {@link .getPostItemsOfTopic}. + */ + getThread(topicID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of specific topics, grouped by topic + */ + getThreads(topicIDs: number[], opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of specific categories, grouped by topic + */ + getThreadsOfCategory(categoryID: number, opts?: FetchOptions): Promise; + /** + * Fetch the partial information, for all posts of specific categories, grouped by category, then topic + */ + getThreadsOfCategories(categoryIDs: number[], opts?: FetchOptions): Promise; + updateUserProfile(userId: any, prefs: UserPreferencesUpdate): Promise; +} +export declare const Instance: (config?: IDiscourseConfig, key?: EDiscourseConfigKey) => Discourser; diff --git a/packages/discourse/dist/src/lib/discourse/index.js b/packages/discourse/dist/src/lib/discourse/index.js new file mode 100644 index 00000000..9d24de86 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/index.js @@ -0,0 +1,831 @@ +import { MODULE_NAME } from '../../constants.js'; +import { CONFIG_DEFAULT } from '@polymech/commons'; +import { createLogger } from '@polymech/log'; +const logger = createLogger(MODULE_NAME); +import { sync as write } from '@polymech/fs/write'; +import { sync as read } from '@polymech/fs/write'; +import { sync as exists } from '@polymech/fs/exists'; +import PromisePool from 'native-promise-pool'; +import { join } from 'path'; +import * as _axios from 'axios'; +const axios = _axios.default || _axios; +import * as fs from 'fs'; +import * as path from 'path'; +import * as _FormData from 'form-data'; +const FormData = _FormData.default || _FormData; +import * as https from 'https'; +import * as _fetch from 'isomorphic-unfetch'; +const fetch = _fetch.default || _fetch; +export const escape = (path) => path.replace(/[^\w]/g, '-').replace(/-+/, '-'); +import { generate } from 'generate-password'; +/** + * Discourser is an API Client for the [Discourse API](https://docs.discourse.org) + * It special features are: + * - TypeScript Types + * - Respecting Rate Limits + * - Optional Heavy Caching + * - Post Modifiers (can be used for global find and replace across all posts on the forum) + */ +export class Discourser { + host; + key; + username; + cache; + useCache; + dry; + pool; + /** + * Construct our Discourser instance + * See {@link IDiscourserConfig} for available configuration. + */ + constructor(config) { + this.host = config.host; + this.key = config.key; + this.username = config.username; + this.cache = config.cache; + this.useCache = config.useCache; + this.dry = config.dry || false; + this.pool = new PromisePool(config.rateLimitConcurrency || 60); + } + /** Get the URL of a topic */ + getTopicURL(topic) { + if (typeof topic === 'number') { + return `${this.host}/t/${topic}`; + } + return `${this.host}/t/${topic.slug}/${topic.id}`; + } + /** Fetch a discourse API URL, with rate limit concurrency and optional caching */ + async fetch({ url, useCache, request }) { + // check if cache is enabled + useCache = false; + const cache = this.cache && + (request?.method || 'get') === 'get' && + join(this.cache, escape(url)); + // check if we should and can read from cache + if (cache && + this.useCache !== false && + useCache !== false && + (exists(cache))) { + const result = read(cache, 'json'); + return result; + } + // fetch + const result = await this.pool.open(() => this._fetch({ url, request })); + // write to cache if cache is enabled + if (cache) { + write(cache, result); + } + // return the result + return result; + } + /** Fetch a discourse API URL, with rate limit retries */ + async _post(url, data) { + const opts = { + headers: { + 'Api-Key': this.key, + 'Api-Username': this.username, + }, + }; + let d = data; + const res = await axios.post(url, d, { + headers: opts.headers + }); + // fetch text then parse as json, so that when errors occur we can output what it was + // rather than being stuck with errors like these: + // FetchError: invalid json response body at https://discuss.bevry.me/posts/507.json reason: Unexpected token < in JSON at position 0 + const text = await res.data; + // check if there are errors + if (typeof data.errors !== 'undefined') { + // check if the error is a rate limit + const wait = data.extras?.wait_seconds; + if (wait != null) { + // if it was, try later + // return await retry(wait + 1) + } + // otherwise fail + // logger.debug({ data, url, opts }) + return Promise.reject(new Error(`fetch of [${url}] received failed response:\n${data}`)); + } + return text; + } + /** Fetch a discourse API URL, with rate limit retries */ + async _fetch({ url, request }) { + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }); + const opts = { + ...request, + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'Api-Key': this.key, + 'Api-Username': this.username, + ...request?.headers + }, + rejectUnauthorized: false, + agent: httpsAgent + }; + const retry = (seconds) => { + return new Promise((resolve, reject) => { + setTimeout(() => this._fetch({ url, request }) + .then(resolve) + .catch(reject), (seconds || 60) * 1000); + }); + }; + try { + const res = await fetch(url, opts); + // fetch text then parse as json, so that when errors occur we can output what it was + // rather than being stuck with errors like these: + // FetchError: invalid json response body at https://discuss.bevry.me/posts/507.json reason: Unexpected token < in JSON at position 0 + const text = await res.text(); + let data; + try { + data = JSON.parse(text); + } + catch (err) { + // check if it was cloudflare reporting that the server has been hit too hard + if (text.includes('Please try again in a few minutes')) { + logger.debug('server has stalled, trying again in a minute'); + return await retry(60); + } + // otherwise log the error page and die + // logger.debug({ text, url , opts }) + return Promise.reject(logger.error(text, url, opts, err) && + new Error(`fetch of [${url}] received invalid response:\n${text}`)); + } + // check if there are errors + if (typeof data.errors !== 'undefined') { + // check if the error is a rate limit + const wait = data.extras?.wait_seconds; + if (wait != null) { + // if it was, try later + return await retry(wait + 1); + } + // otherwise fail + // logger.debug({ data, url, opts }) + return Promise.reject(new Error(`fetch of [${url}] received failed response:\n${data}`)); + } + return data; + } + catch (err) { + // logger.debug({ err, url, opts }) + return Promise.reject(logger.error(`fetch of [${url}] failed with error`, err)); + } + } + // ================================= + // Search + /** + * API Helper for {@link .search} + * https://docs.discourse.org/#tag/Search/operation/search + */ + async search(query, params = '', opts = {}) { + let url = `${this.host}/search.json?q=${encodeURIComponent(query)} ${encodeURIComponent(params)}`; + return await this.fetch({ url, ...opts }); + } + // ================================= + // Tags + /** + * API Helper for {@link .getTags} + */ + async getTagsResponse(opts = {}) { + const url = `${this.host}/tags.json`; + return await this.fetch({ url, ...opts }); + } + /** + * Fetch the whole information, for all categories of the forum + */ + async getTags(opts = {}) { + const response = await this.getTagsResponse(opts); + const tags = response.tags; + return tags; + } + async createTag(name) { + const url = `${this.host}/tag_groups.json`; + try { + return await this._post(url, { + name + }); + } + catch (error) { + debugger; + } + } + // ================================= + // CATEGORIES + /** + * API Helper for {@link .getCategories} + */ + async getCategoriesResponse(opts = {}) { + const url = `${this.host}/categories.json` + + (opts.include_subcategories ? '?include_subcategories=true' : ''); + return await this.fetch({ url, ...opts }); + } + /** + * Fetch the whole information, for all categories of the forum + */ + async getCategories(opts = {}) { + const response = await this.getCategoriesResponse(opts); + const categories = response.category_list.categories; + return categories; + } + /** + * API Helper for {@link .getTopicItemsOfCategory} + * Discourse does not provide an API for fetching category information for a specific category. + * Instead, all that it provides is a way of getting the topics for a specific category. + */ + async getCategoryResponse(categoryID, opts = {}) { + const url = `${this.host}/c/${categoryID}.json` + + (opts.page !== 0 ? `?page=${opts.page}` : ''); + return await this.fetch({ url, ...opts }); + } + // ================================= + // TOPICS + /** + * Fetch the partial information, for all topics of a specific category + */ + async getTopicItemsOfCategory(categoryID, opts = {}) { + // prepare and fetch + let page = opts.page || 0; + const response = await this.getCategoryResponse(categoryID, { + ...opts, + page, + }); + let topics = response.topic_list.topics; + // fetch the next page + if (topics.length === response.topic_list.per_page) { + page += 1; + const more = await this.getTopicItemsOfCategory(categoryID, { + ...opts, + page, + }); + topics.push(...more); + } + // if we are the first page, then output count as we now have all of them + if (page === 0) { + const ids = topics.map((i) => i.id); + } + topics = topics.filter((t) => t.visible === true); + return topics; + } + /** + * Fetch the partial information, for all topics of specific categoires + */ + async getTopicItemsOfCategories(categoryIDs, opts = {}) { + // fetch topic items for specific categories + try { + const topicsOfCategories = await Promise.all(categoryIDs.map((id) => this.getTopicItemsOfCategory(id, opts))); + // @ts-ignore + return topicsOfCategories.flat(); + } + catch (error) { + logger.error(error); + } + } + /** + * Fetch the partial information, for all topics of the forum + */ + async getTopicItems(opts = {}) { + const categories = await this.getCategories(); + const categoryIDs = categories.map((i) => i.id); + return this.getTopicItemsOfCategories(categoryIDs, opts); + } + /** + * Fetch the whole information, for a specific topic of the forum + */ + getTopic(id, opts = {}) { + const url = `${this.host}/t/${id}.json`; + return this.fetch({ url, ...opts }); + } + /** + * Fetch the whole information, for all topics, or specific topics, of the forum + */ + async getTopics(topicIDs, opts = {}) { + // if no topics, use all topics + if (!topicIDs) { + const topics = await this.getTopicItems(opts); + topicIDs = topics.map((i) => i.id); + } + // fetch whole topics + return Promise.all(topicIDs.map((id) => this.getTopic(id, opts))); + } + async updateTopicVisibility(topicID, listed = true, visible = 'visible') { + const url = `${this.host}/t/${topicID}/status`; + let ret = await fetch(url, { + "headers": { + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + 'Api-Key': this.key, + 'Api-Username': this.username + }, + "body": `status=${visible}&enabled=${listed}`, + "method": "PUT" + }); + return ret; + } + async updateTopicTimestamp(topicID, timestamp, token) { + let time; + if (typeof timestamp === 'number') { + time = timestamp; + } + else if (typeof timestamp === 'number') { + time = Number(timestamp); + } + else if (timestamp instanceof Date) { + // ms to seconds + time = timestamp.getTime() / 1000; + } + else { + return Promise.reject(new Error('invalid timestamp format')); + } + const url = `${this.host}/t/${topicID}/change-timestamp`; + // prepare the request + const request = { + timestamp: time, + }; + // send the update + logger.debug('updating', topicID, 'topic timestamp with', request); + //const url = `${this.host}/t/${topicID}/change-timestamp` + const response = await this.fetch({ + url, + request: { + method: 'put', + body: `timestamp=${time}`, + headers: { + 'Api-Key': this.key, + 'Api-Username': this.username, + "content-type": "application/x-www-form-urlencoded; charset=UTF-8" + } + } + }); + // check it + if (response.success !== 'OK') { + return Promise.reject(new Error(`timestamp update of topic ${topicID} failed:\n${{ + url, + request, + response, + }}`)); + } + return response; + } + // ================================= + // POSTS + /** + * API Helper for {@link .getPostItemsOfTopic} + */ + async getPostItemsOfTopicResponse(topicID, opts = {}) { + const url = `${this.host}/t/${topicID}/posts.json`; + const response = await this.fetch({ url, ...opts }); + return response; + } + async _createUser(name, email, pUserGroup) { + const pwd = generate({ + length: 10, + numbers: true + }); + let user = await this.createUser({ + "name": name, + "email": email, + "password": pwd, + "username": name, + "active": true, + "approved": true, + "user_fields[1]": true + }); + if (user && user.user_id) { + await this.updateGroup(name, pUserGroup); + return { ...user, password: pwd }; + } + else { + if (user && user.message && user.message == 'Username must be unique\nPrimary email has already been taken') { + return null; + } + else if (user && user.message && user.message == 'Your account is activated and ready to use.') { + if (user.user_id) { + return { ...user, password: pwd }; + } + return null; + } + else { + console.log('cant create user ' + name, user); + } + return null; + } + } + async getUsers(page) { + const url = `${this.host}/admin/users/list/active.json?page=` + page; + const response = await this.fetch({ url }); + return response; + } + async getUser(id) { + const url = `${this.host}/admin/users/${id}.json`; + const response = await this.fetch({ url }); + return response; + } + /** + * Fetch the partial information, for all posts of a specific topic + */ + async getPostItemsOfTopic(topicID, opts = {}) { + const response = await this.getPostItemsOfTopicResponse(topicID, opts); + const posts = response.post_stream.posts; + const ids = posts.map((i) => i.id); + return posts; + } + /** + * Fetch the partial information, for all posts of specific topics + */ + async getPostItemsOfTopics(topicIDs, opts = {}) { + // fetch post items for specific topics + const postItemsOfTopics = await Promise.all(topicIDs.map((id) => this.getPostItemsOfTopic(id, opts))); + // @ts-ignore + return postItemsOfTopics.flat(); + } + /** + * Fetch the partial information, for all posts of a specific category + */ + async getPostItemsOfCategory(categoryID, opts = {}) { + // fetch topics for the category + const topics = await this.getTopicItemsOfCategory(categoryID, opts); + const topicIDs = topics.map((i) => i.id); + // fetch + const posts = await this.getPostItemsOfTopics(topicIDs); + const ids = posts.map((i) => i.id); + return posts; + } + /** + * Fetch the partial information, for all posts of specific categories + */ + async getPostItemsOfCategories(categoryIDs, opts = {}) { + // fetch post items for specific categories + const postItemsOfCategories = await Promise.all(categoryIDs.map((id) => this.getPostItemsOfCategory(id, opts))); + // @ts-ignore + return postItemsOfCategories.flat(); + } + /** + * Fetch the partial information, for all posts of the forum + */ + async getPostItems(opts = {}) { + const categories = await this.getCategories(); + const categoryIDs = categories.map((i) => i.id); + return this.getPostItemsOfCategories(categoryIDs, opts); + } + /** + * Fetch the whole information, for a specific post of the forum + */ + getPost(id, opts = {}) { + const url = `${this.host}/posts/${id}.json`; + return this.fetch({ url, ...opts }); + } + async createReply(postId, raw, category) { + const url = `${this.host}/posts.json`; + const data = new URLSearchParams(); + data.append('raw', raw); + data.append('unlist_topic', 'false'); + data.append('category', String(category)); + data.append('topic_id', String(postId)); + data.append('is_warning', 'false'); + data.append('archetype', 'regular'); + data.append('featured_link', ''); + data.append('shared_draft', 'false'); + data.append('nested_post', 'true'); + return await axios.post(url, data.toString(), { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + } + async changeOwner(postId, topicId, owner) { + const url = `${this.host}/t/${topicId}/change-owner.json`; + const body = `post_ids%5B%5D=${postId}&username=${owner}`; + return await axios.post(url, body, { + headers: { + 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + } + async createUser(data) { + const url = `${this.host}/users`; + return await this._post(url, data); + } + async getUserByUsername(username) { + const url = `${this.host}/u/${username}.json`; + const response = await this.fetch({ url }); + return response.user; + } + async setUserAvatar(user_name, upload_id) { + // fetch whole posts + const url = `${this.host}/u/${user_name}/preferences/avatar/pick.json`; + return await axios.put(url, { + upload_id, + username: user_name, + type: 'uploaded' + }, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + } + async updateUser(user_name, args) { + const url = `${this.host}/u/${user_name}.json`; + return await axios.put(url, { + ...args + }, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + } + async updateGroup(user_name, group) { + // fetch whole posts + const url = `${this.host}/groups/${group}/members.json`; + const t = axios.put(url, { + usernames: user_name, + notify_users: false + }, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + t.then((d) => { + }).catch((e) => { + //debugger; + }); + return t; + } + async upload(userId, file) { + // fetch whole posts + const url = `${this.host}/uploads.json`; + let data = new FormData(); + const fsData = path.parse(file); + data.append('file', file, fsData.base); + data.append('user_id', userId); + data.append('upload_type', 'avatar'); + data.append('file', fs.createReadStream(file)); + return (await axios.post(url, data, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + 'Content-Type': `multipart/form-data; boundary=${data._boundary}`, + 'Api-Key': this.key, + 'Api-Username': this.username + } + })).data; + } + async uploadFile(userId, file) { + // fetch whole posts + const url = `${this.host}/uploads.json`; + let data = new FormData(); + const fsData = path.parse(file); + data.append('file', file, fsData.base); + data.append('user_id', userId); + data.append('upload_type', 'composer'); + data.append('file', fs.createReadStream(file)); + return (await axios.post(url, data, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + 'Content-Type': `multipart/form-data; boundary=${data._boundary}`, + 'Api-Key': this.key, + 'Api-Username': this.username + } + })).data; + } + // ================================= + // POSTS: UPDATING + /** + * Fetch the whole information, for all posts, or specific posts, of the forum + */ + async getPosts(postIDs, opts = {}) { + // if no posts, use all + if (!postIDs) { + const posts = await this.getPostItems(opts); + postIDs = posts.map((i) => i.id); + } + // fetch whole posts + return await Promise.all(postIDs.map((id) => this.getPost(id, opts))); + } + async createPost(title, raw, category) { + // fetch whole posts + const url = `${this.host}/posts`; + return new Promise((resolve) => { + return this._post(url, { raw, title, category }).then((d) => { + resolve(d); + }).catch((e) => { + resolve(e.response.data); + }); + }); + } + /** + * Update a post with the content + * @param postID the identifier of the post to update + * @param content the new raw content for the post + * @param reason the reason, if provided, for modifying the post + * @param old if the old raw content is provided, then the update verified that you are working with the latest post content before applying the update + */ + async updatePost(postID, content, reason = 'api update', old) { + // prepare the request + const data = { + post: { + raw: content, + edit_reason: reason, + }, + }; + if (old) { + data.post.raw_old = old; + } + // send the update + const url = `${this.host}/posts/${postID}.json`; + const response = await this.fetch({ + url, + request: { + method: 'put', + body: JSON.stringify(data), + }, + }); + // return the response + return response.post; + } + /** + * Update post meta + */ + async updateTopic(postId, category_id, title, tags) { + const data = { + title, + tags: tags || [], + featuredLink: null, + category_id + }; + const url = `${this.host}/t/${postId}.json`; + const response = await this.fetch({ + url, + request: { + method: 'put', + body: JSON.stringify(data), + }, + }); + return response.basic_topic; + } + async rebakePost(postID) { + const url = `${this.host}/posts/${postID}/rebake`; + logger.debug('rebaking', postID); + const response = await this.fetch({ + url, + request: { + method: 'put' + } + }); + logger.debug('rebaked', postID); + return response; + } + /** + * Modify a post using a modifier + */ + async modifyPost(post, modifier) { + // check if we received a post item, instead of a post response + if (post.raw == null) { + post = await this.getPost(post.id); + } + // check + if (!post.raw) { + return Promise.resolve(null); + } + // replace + const { result, reason } = modifier(post); + if (result === post.raw) { + // if (post.cooked) { + // const { result, reason } = modifier(post.cooked) + // if (result !== post.cooked) { + // logger.debug( + // 'replace did have an effect on cooked post', + // postID, + // 'so rebaking it' + // ) + // return await this.rebakePost(postID) + // } + // } + return Promise.resolve(null); + } + // dry + if (this.dry) { + return Promise.resolve({ + ...post, + result, + reason, + }); + } + // update + try { + return await this.updatePost(post.id, result, reason, post.raw); + } + catch (err) { + if (err.message.includes('That post was edited by another user and your changes can no longer be saved.')) { + return this.modifyPost(await this.getPost(post.id, { useCache: false }), modifier); + } + logger.error(err); + return Promise.reject(`modifying post ${post.id} failed`); + } + } + /** + * Modify a post (via its post identifier) using a modifier + */ + async modifyPostID(post, modifier) { + return this.modifyPost(await this.getPost(post), modifier); + } + /** + * Modify a post (via fetching the whole post from the partial post identifier) using a modifier + */ + async modifyPostItem(post, modifier) { + return this.modifyPost(await this.getPost(post.id), modifier); + } + /** + * Run the post modifier on all specified posts + */ + async modifyPosts(posts, modifier) { + const updates = await Promise.all(posts.map((post) => this.modifyPost(post, modifier))); + const updated = updates.filter((i) => i); + return updated; + } + // ================================= + // THREADS + /** + * Fetch the partial information, for all posts of a specific topic + * Alias of {@link .getPostItemsOfTopic}. + */ + async getThread(topicID, opts = {}) { + const topic = await this.getTopic(topicID, opts); + const [post, ...replies] = await this.getPostItemsOfTopic(topicID, opts); + return { + topic, + post, + replies, + }; + } + /** + * Fetch the partial information, for all posts of specific topics, grouped by topic + */ + async getThreads(topicIDs, opts = {}) { + return await Promise.all(topicIDs.map((id) => this.getThread(id, opts))); + } + /** + * Fetch the partial information, for all posts of specific categories, grouped by topic + */ + async getThreadsOfCategory(categoryID, opts = {}) { + // fetch topics for the category + const topics = await this.getTopicItemsOfCategory(categoryID, opts); + const topicIDs = topics.map((i) => i.id); + // return threads + return await this.getThreads(topicIDs); + } + /** + * Fetch the partial information, for all posts of specific categories, grouped by category, then topic + */ + async getThreadsOfCategories(categoryIDs, opts = {}) { + return await Promise.all(categoryIDs.map((id) => this.getThreadsOfCategory(id, opts))); + } + async updateUserProfile(userId, prefs) { + const url = `${this.host}/u/${userId}.json`; + let data = new FormData(); + data.append('bio_raw', prefs.bio_raw); + prefs.location && data.append('location', prefs.location); + prefs.website && data.append('website', prefs.website); + return await axios.put(url, data, { + headers: { + 'accept': 'application/json', + 'Accept-Language': 'en-US,en;q=0.8', + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + 'Api-Key': this.key, + 'Api-Username': this.username + } + }); + } +} +export const Instance = (config, key = 'discourse_admin') => { + return new Discourser(config || CONFIG_DEFAULT()[key]); + /* + + d.getTopicItemsOfCategories([cat]).then(posts => { + //console.log('posts', posts) + let content = "
    " + posts = posts.map((p) => { + const url = `${config.discourse.host}/t/${p.id}`; + const title = `${p.fancy_title}`; + return `
  • ${title}
  • `; + }).join('\n'); + content += posts + "
"; + resolve(content); + + }); + */ +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/index.js.map b/packages/discourse/dist/src/lib/discourse/index.js.map new file mode 100644 index 00000000..06ecf043 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/discourse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIlD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAA;AAExC,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,WAAW,MAAM,qBAAqB,CAAA;AAG7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,MAAM,MAAM,OAAO,CAAA;AAC/B,MAAM,KAAK,GAAI,MAAc,CAAC,OAAO,IAAI,MAAM,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,SAAS,MAAM,WAAW,CAAA;AACtC,MAAM,QAAQ,GAAS,SAAiB,CAAC,OAAO,IAAI,SAAS,CAAA;AAE7D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAC5C,MAAM,KAAK,GAAI,MAAc,CAAC,OAAO,IAAI,MAAM,CAAA;AAE/C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAoC5C;;;;;;;GAOG;AACH,MAAM,OAAO,UAAU;IACb,IAAI,CAAQ;IACZ,GAAG,CAAQ;IACX,QAAQ,CAAQ;IAChB,KAAK,CAAS;IACd,QAAQ,CAAU;IAClB,GAAG,CAAS;IACZ,IAAI,CAAkB;IAE/B;;;OAGG;IACH,YAAY,MAAyB;QACpC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACvB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;QACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QACzB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,KAAK,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,6BAA6B;IAC7B,WAAW,CAAC,KAAyC;QACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC9B,OAAO,GAAG,IAAI,CAAC,IAAI,MAAM,KAAK,EAAE,CAAA;SAChC;QACD,OAAO,GAAG,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAA;IAClD,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,KAAK,CAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAe;QACrD,4BAA4B;QAC5B,QAAQ,GAAG,KAAK,CAAA;QAChB,MAAM,KAAK,GACV,IAAI,CAAC,KAAK;YACV,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK;YACpC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;QAC9B,6CAA6C;QAC7C,IACC,KAAK;YACL,IAAI,CAAC,QAAQ,KAAK,KAAK;YACvB,QAAQ,KAAK,KAAK;YAClB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACd;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;YAClC,OAAQ,MAAuB,CAAA;SAC/B;QACD,QAAQ;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QAC3E,qCAAqC;QACrC,IAAI,KAAK,EAAE;YACV,KAAK,CAAC,KAAK,EAAE,MAAa,CAAC,CAAA;SAC3B;QACD,oBAAoB;QACpB,OAAO,MAAM,CAAA;IACd,CAAC;IAGD,yDAAyD;IACjD,KAAK,CAAC,KAAK,CAAI,GAAG,EAAE,IAAI;QAC/B,MAAM,IAAI,GAAG;YACZ,OAAO,EAAE;gBACR,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAA;QACD,IAAI,CAAC,GAAG,IAAI,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE;YACpC,OAAO,EAAE,IAAI,CAAC,OAAc;SAC5B,CAAC,CAAC;QAEH,qFAAqF;QACrF,kDAAkD;QAClD,qIAAqI;QACrI,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;QAC5B,4BAA4B;QAC5B,IAAI,OAAQ,IAAY,CAAC,MAAM,KAAK,WAAW,EAAE;YAChD,qCAAqC;YACrC,MAAM,IAAI,GAAY,IAAY,CAAC,MAAM,EAAE,YAAY,CAAA;YACvD,IAAI,IAAI,IAAI,IAAI,EAAE;gBACjB,uBAAuB;gBACvB,+BAA+B;aAC/B;YAED,iBAAiB;YACjB,oCAAoC;YACpC,OAAO,OAAO,CAAC,MAAM,CACpB,IAAI,KAAK,CACR,aAAa,GAAG,gCAAgC,IAAI,EAAE,CACtD,CACD,CAAA;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAID,yDAAyD;IACjD,KAAK,CAAC,MAAM,CAAI,EAAE,GAAG,EAAE,OAAO,EAAe;QAEpD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC;YAClC,kBAAkB,EAAE,KAAK;SACzB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG;YACZ,GAAG,OAAO;YACV,OAAO,EAAE;gBACR,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;gBAC7B,GAAG,OAAO,EAAE,OAAO;aACnB;YACD,kBAAkB,EAAE,KAAK;YACzB,KAAK,EAAE,UAAU;SACjB,CAAA;QAED,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE;YACjC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACzC,UAAU,CACT,GAAG,EAAE,CACJ,IAAI,CAAC,MAAM,CAAI,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;qBAC9B,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC,EAChB,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,IAAI,CACtB,CAAA;YACF,CAAC,CAAC,CAAA;QACH,CAAC,CAAA;QAED,IAAI;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACnC,qFAAqF;YACrF,kDAAkD;YAClD,qIAAqI;YACrI,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,IAAI,IAAO,CAAA;YAEX,IAAI;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAA;aAC5B;YAAC,OAAO,GAAG,EAAE;gBACb,6EAA6E;gBAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE;oBACvD,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAA;oBAC5D,OAAO,MAAM,KAAK,CAAC,EAAE,CAAC,CAAA;iBACtB;gBACD,uCAAuC;gBACvC,qCAAqC;gBACrC,OAAO,OAAO,CAAC,MAAM,CACpB,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;oBAClC,IAAI,KAAK,CAAC,aAAa,GAAG,iCAAiC,IAAI,EAAE,CAAC,CAClE,CAAA;aACD;YAED,4BAA4B;YAC5B,IAAI,OAAQ,IAAY,CAAC,MAAM,KAAK,WAAW,EAAE;gBAChD,qCAAqC;gBACrC,MAAM,IAAI,GAAY,IAAY,CAAC,MAAM,EAAE,YAAY,CAAA;gBACvD,IAAI,IAAI,IAAI,IAAI,EAAE;oBACjB,uBAAuB;oBACvB,OAAO,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;iBAC5B;gBAED,iBAAiB;gBACjB,oCAAoC;gBACpC,OAAO,OAAO,CAAC,MAAM,CACpB,IAAI,KAAK,CACR,aAAa,GAAG,gCAAgC,IAAI,EAAE,CACtD,CACD,CAAA;aACD;YACD,OAAO,IAAI,CAAA;SACX;QAAC,OAAO,GAAG,EAAE;YACb,mCAAmC;YACnC,OAAO,OAAO,CAAC,MAAM,CACpB,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,qBAAqB,EAAE,GAAG,CAAC,CACxD,CAAA;SACD;IACF,CAAC;IAED,oCAAoC;IACpC,SAAS;IAET;;;OAGG;IACI,KAAK,CAAC,MAAM,CAClB,KAAa,EACb,SAAiB,EAAE,EACnB,OAAqB,EAAE;QAEvB,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClG,OAAO,MAAM,IAAI,CAAC,KAAK,CAAgB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,oCAAoC;IACpC,OAAO;IAEP;;OAEG;IACO,KAAK,CAAC,eAAe,CAC9B,OAAqB,EAAE;QAEvB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,YAAY,CAAA;QACpC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAe,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAAqB,EAAE;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;QAC1B,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAI;QACnB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,kBAAkB,CAAA;QAC1C,IAAI;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC5B,IAAI;aACJ,CAAC,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACf,QAAQ,CAAA;SACR;IAEF,CAAC;IAED,oCAAoC;IACpC,aAAa;IAEb;;OAEG;IACO,KAAK,CAAC,qBAAqB,CACpC,OAAqB,EAAE;QAEvB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,kBAAkB;YACzC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAClE,OAAO,MAAM,IAAI,CAAC,KAAK,CAAqB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAqB,EAAE;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAA;QACpD,OAAO,UAAU,CAAA;IAClB,CAAC;IAED;;;;OAIG;IACO,KAAK,CAAC,mBAAmB,CAClC,UAAkB,EAClB,OAAqB,EAAE;QAEvB,MAAM,GAAG,GACR,GAAG,IAAI,CAAC,IAAI,MAAM,UAAU,OAAO;YACnC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9C,OAAO,MAAM,IAAI,CAAC,KAAK,CAAmB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,oCAAoC;IACpC,SAAS;IAET;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAC5B,UAAkB,EAClB,OAAqB,EAAE;QAEvB,oBAAoB;QACpB,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA;QACzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE;YAC3D,GAAG,IAAI;YACP,IAAI;SACJ,CAAC,CAAA;QAEF,IAAI,MAAM,GAAgB,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAA;QAEpD,sBAAsB;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE;YACnD,IAAI,IAAI,CAAC,CAAA;YACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE;gBAC3D,GAAG,IAAI;gBACP,IAAI;aACJ,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;SACpB;QAED,yEAAyE;QACzE,IAAI,IAAI,KAAK,CAAC,EAAE;YACf,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;SAC9C;QAED,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;QAElD,OAAO,MAAM,CAAA;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,yBAAyB,CAC9B,WAAqB,EACrB,OAAqB,EAAE;QAEvB,4CAA4C;QAC5C,IAAI;YACH,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3C,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAC/D,CAAA;YACD,aAAa;YACb,OAAO,kBAAkB,CAAC,IAAI,EAAE,CAAA;SAChC;QAAC,OAAO,KAAK,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACpB;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,OAAqB,EAAE;QAC1C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACzD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,EAAU,EAAE,OAAqB,EAAE;QAC3C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,EAAE,OAAO,CAAA;QACvC,OAAO,IAAI,CAAC,KAAK,CAAgB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACd,QAA0B,EAC1B,OAAqB,EAAE;QAEvB,+BAA+B;QAC/B,IAAI,CAAC,QAAQ,EAAE;YACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;YAC7C,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;SAClC;QAED,qBAAqB;QACrB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,qBAAqB,CAC1B,OAAe,EACf,SAAkB,IAAI,EACtB,UAAuB,SAAS;QAEhC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,OAAO,SAAS,CAAA;QAC9C,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,SAAS,EAAE;gBACV,cAAc,EAAE,kDAAkD;gBAClE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;YACD,MAAM,EAAE,UAAU,OAAO,YAAY,MAAM,EAAE;YAC7C,QAAQ,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,OAAO,GAAG,CAAA;IACX,CAAC;IAED,KAAK,CAAC,oBAAoB,CACzB,OAAe,EACf,SAAiC,EACjC,KAAa;QAEb,IAAI,IAAY,CAAA;QAChB,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAClC,IAAI,GAAG,SAAS,CAAA;SAChB;aAAM,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YACzC,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;SACxB;aAAM,IAAI,SAAS,YAAY,IAAI,EAAE;YACrC,gBAAgB;YAChB,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,IAAI,CAAA;SACjC;aAAM;YACN,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;SAC5D;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,OAAO,mBAAmB,CAAA;QAGxD,sBAAsB;QACtB,MAAM,OAAO,GAAgC;YAC5C,SAAS,EAAE,IAAI;SACf,CAAA;QAED,kBAAkB;QAClB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAA;QAClE,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAA+B;YAC/D,GAAG;YACH,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,aAAa,IAAI,EAAE;gBACzB,OAAO,EAAE;oBACR,SAAS,EAAE,IAAI,CAAC,GAAG;oBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;oBAC7B,cAAc,EAAE,kDAAkD;iBAElE;aACD;SACD,CAAC,CAAA;QAEF,WAAW;QACX,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE;YAC9B,OAAO,OAAO,CAAC,MAAM,CACpB,IAAI,KAAK,CACR,6BAA6B,OAAO,aAAa;gBAChD,GAAG;gBACH,OAAO;gBACP,QAAQ;aACR,EAAE,CACH,CACD,CAAA;SACD;QAED,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,oCAAoC;IACpC,QAAQ;IAER;;OAEG;IACO,KAAK,CAAC,2BAA2B,CAC1C,OAAe,EACf,OAAqB,EAAE;QAEvB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,OAAO,aAAa,CAAA;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAgB,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QAClE,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU;QAExC,MAAM,GAAG,GAAG,QAAQ,CAAC;YACpB,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,IAAI;SACb,CAAC,CAAA;QAEF,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;YAChC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,gBAAgB,EAAE,IAAI;SACtB,CAA+B,CAAC;QAEjC,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;YACzB,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACzC,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;SAClC;aAAM;YACN,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,+DAA+D,EAAE;gBAC5G,OAAO,IAAI,CAAC;aACZ;iBAAM,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,6CAA6C,EAAE;gBACjG,IAAI,IAAI,CAAC,OAAO,EAAE;oBACjB,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;iBAClC;gBACD,OAAO,IAAI,CAAC;aACZ;iBAAM;gBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;aAC9C;YACD,OAAO,IAAI,CAAC;SACZ;IACF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAI;QAClB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,qCAAqC,GAAG,IAAI,CAAA;QACpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAiB,EAAE,GAAG,EAAE,CAAC,CAAA;QAC1D,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE;QACf,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE,OAAO,CAAA;QACjD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAc,EAAE,GAAG,EAAE,CAAC,CAAA;QACvD,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACxB,OAAe,EACf,OAAqB,EAAE;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACtE,MAAM,KAAK,GAAe,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAA;QACpD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAClC,OAAO,KAAK,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACzB,QAAkB,EAClB,OAAqB,EAAE;QAEvB,uCAAuC;QACvC,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC1C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CACxD,CAAA;QAED,aAAa;QACb,OAAO,iBAAiB,CAAC,IAAI,EAAE,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC3B,UAAkB,EAClB,OAAqB,EAAE;QAEvB,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAExC,QAAQ;QACR,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QACvD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAClC,OAAO,KAAK,CAAA;IACb,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB,CAC7B,WAAqB,EACrB,OAAqB,EAAE;QAEvB,2CAA2C;QAC3C,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9C,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAC9D,CAAA;QAED,aAAa;QACb,OAAO,qBAAqB,CAAC,IAAI,EAAE,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAqB,EAAE;QACzC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC,wBAAwB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU,EAAE,OAAqB,EAAE;QAC1C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,UAAU,EAAE,OAAO,CAAA;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAe,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ;QAEtC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,aAAa,CAAC;QAEtC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QACnC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QACpC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;QAElC,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE;YAC7C,OAAO,EAAE;gBACR,cAAc,EAAE,kDAAkD;gBAClE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC;IAEJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAuB,EAAE,OAAwB,EAAE,KAAa;QAEjF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,OAAO,oBAAoB,CAAC;QAE1D,MAAM,IAAI,GAAG,kBAAkB,MAAM,aAAa,KAAK,EAAE,CAAC;QAE1D,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;YAClC,OAAO,EAAE;gBACR,cAAc,EAAE,kDAAkD;gBAClE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAI;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAA;QAChC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAQ;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,QAAQ,OAAO,CAAA;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAc,EAAE,GAAG,EAAE,CAAC,CAAA;QACvD,OAAQ,QAAgB,CAAC,IAAI,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,SAAS;QACvC,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,SAAS,+BAA+B,CAAC;QACvE,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC3B,SAAS;YACT,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,UAAU;SAChB,EAAE;YACF,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI;QAE/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,SAAS,OAAO,CAAC;QAC/C,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC3B,GAAG,IAAI;SACP,EAAE;YACF,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK;QACjC,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,WAAW,KAAK,eAAe,CAAC;QACxD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACxB,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,KAAK;SACnB,EAAE;YACF,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC;QACH,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAEb,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,WAAW;QACZ,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAID,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;QACxB,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,eAAe,CAAC;QAExC,IAAI,IAAI,GAAQ,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;YACnC,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,iCAAiC,IAAI,CAAC,SAAS,EAAE;gBACjE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC,CAAC,IAAI,CAAC;IACV,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI;QAC5B,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,eAAe,CAAC;QACxC,IAAI,IAAI,GAAQ,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;YACnC,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,iCAAiC,IAAI,CAAC,SAAS,EAAE;gBACjE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAC,CAAC,IAAI,CAAC;IACV,CAAC;IAED,oCAAoC;IACpC,kBAAkB;IAElB;;OAEG;IACH,KAAK,CAAC,QAAQ,CACb,OAAyB,EACzB,OAAqB,EAAE;QAEvB,uBAAuB;QACvB,IAAI,CAAC,OAAO,EAAE;YACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC3C,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;SAChC;QAED,oBAAoB;QACpB,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,UAAU,CACf,KAAa,EACb,GAAW,EACX,QAAgB;QAEhB,oBAAoB;QACpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAA;QAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC3D,OAAO,CAAC,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAA;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CACf,MAAc,EACd,OAAe,EACf,SAAiB,YAAY,EAC7B,GAAY;QAEZ,sBAAsB;QACtB,MAAM,IAAI,GAAsB;YAC/B,IAAI,EAAE;gBACL,GAAG,EAAE,OAAO;gBACZ,WAAW,EAAE,MAAM;aACnB;SACD,CAAA;QACD,IAAI,GAAG,EAAE;YACR,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;SACvB;QAED,kBAAkB;QAClB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,UAAU,MAAM,OAAO,CAAA;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAqB;YACrD,GAAG;YACH,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC1B;SACD,CAAC,CAAA;QAEF,sBAAsB;QACtB,OAAO,QAAQ,CAAC,IAAI,CAAA;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAChB,MAAc,EACd,WAAmB,EACnB,KAAa,EACb,IAAe;QAEf,MAAM,IAAI,GACV;YACC,KAAK;YACL,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,YAAY,EAAE,IAAI;YAClB,WAAW;SACX,CAAA;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,MAAM,OAAO,CAAA;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAM;YACtC,GAAG;YACH,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC1B;SACD,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,WAAW,CAAA;IAC5B,CAAC;IAID,KAAK,CAAC,UAAU,CAAC,MAAc;QAE9B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,UAAU,MAAM,SAAS,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAEhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAe;YAC/C,GAAG;YACH,OAAO,EAAE;gBACR,MAAM,EAAE,KAAK;aACb;SACD,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC/B,OAAO,QAAQ,CAAA;IAChB,CAAC;IAID;;OAEG;IACH,KAAK,CAAC,UAAU,CACf,IAAkB,EAClB,QAAsB;QAEtB,+DAA+D;QAC/D,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE;YACrB,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;SAClC;QAED,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACd,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;SAC5B;QAED,UAAU;QACV,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QACzC,IAAI,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE;YACxB,qBAAqB;YACrB,oDAAoD;YACpD,iCAAiC;YACjC,kBAAkB;YAClB,kDAAkD;YAClD,aAAa;YACb,sBAAsB;YACtB,MAAM;YACN,yCAAyC;YACzC,KAAK;YACL,IAAI;YACJ,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;SAC5B;QAED,MAAM;QACN,IAAI,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,OAAO,CAAC,OAAO,CAAC;gBACtB,GAAK,IAAmC;gBACxC,MAAM;gBACN,MAAM;aACN,CAAC,CAAA;SACF;QAED,SAAS;QACT,IAAI;YACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;SAC/D;QAAC,OAAO,GAAG,EAAE;YACb,IACC,GAAG,CAAC,OAAO,CAAC,QAAQ,CACnB,+EAA+E,CAC/E,EACA;gBACD,OAAO,IAAI,CAAC,UAAU,CACrB,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAChD,QAAQ,CACR,CAAA;aACD;YACD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,EAAE,SAAS,CAAC,CAAA;SACzD;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,QAAsB;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,IAAc,EAAE,QAAsB;QAC1D,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAChB,KAAqB,EACrB,QAAsB;QAEtB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CACpD,CAAA;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAqB,CAAA;QAC5D,OAAO,OAAO,CAAA;IACf,CAAC;IAED,oCAAoC;IACpC,UAAU;IAEV;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,OAAqB,EAAE;QACvD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACxE,OAAO;YACN,KAAK;YACL,IAAI;YACJ,OAAO;SACP,CAAA;IACF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACf,QAAkB,EAClB,OAAqB,EAAE;QAEvB,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACzB,UAAkB,EAClB,OAAqB,EAAE;QAEvB,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACxC,iBAAiB;QACjB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC3B,WAAqB,EACrB,OAAqB,EAAE;QAEvB,OAAO,MAAM,OAAO,CAAC,GAAG,CACvB,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAC5D,CAAA;IACF,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAA4B;QAE3D,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,MAAM,OAAO,CAAA;QAC3C,IAAI,IAAI,GAAQ,IAAI,QAAQ,EAAE,CAAA;QAE9B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAErC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;QACzD,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QAEtD,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE;YACjC,OAAO,EAAE;gBACR,QAAQ,EAAE,kBAAkB;gBAC5B,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,kDAAkD;gBAClE,SAAS,EAAE,IAAI,CAAC,GAAG;gBACnB,cAAc,EAAE,IAAI,CAAC,QAAQ;aAC7B;SACD,CAAC,CAAA;IACH,CAAC;CAED;AAGD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAyB,EAAE,MAA2B,iBAAiB,EAAE,EAAE;IAEnG,OAAO,IAAI,UAAU,CAAC,MAAM,IAAK,cAAc,EAAiB,CAAC,GAAG,CAAC,CAAC,CAAA;IAEtE;;;;;;;;;;;;;;MAcE;AACH,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/types.d.ts b/packages/discourse/dist/src/lib/discourse/types.d.ts new file mode 100644 index 00000000..717972e6 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/types.d.ts @@ -0,0 +1,697 @@ +export interface Failure { + success: 'OK'; +} +export interface Success { + failed: 'FAILED'; +} +export type Response = Failure & Success; +export interface Action { + can_act: boolean; + id: number; + count?: number; + hidden?: boolean; +} +export interface Poster { + description: string; + extras: string; + user_id: number; +} +export interface Person { + avatar_template: string; + id: number; + username: string; +} +export interface Participant extends Person { + post_count: number; +} +export interface Link { + url: string; + internal: boolean; + reflection: boolean; + title: string; + clicks: number; +} +/** + * Update a Topic Timestamp + * https://docs.discourse.org/#tag/Topics/paths/~1t~1{id}~1change-timestamp/put + */ +export interface TopicUpdateTimestampRequest { + timestamp: number; +} +export type TopicUpdateTimestampResponse = Response; +/** + * Update a Post + * https://docs.discourse.org/#tag/Posts/paths/~1posts~1{id}.json/put + */ +export interface PostUpdateResponse { + post: PostUpdateItem; +} +export interface TopicUpdateBasicTopic { + fancy_title: string; + id: number; + posts_count: number; + slug: string; + title: string; +} +export interface TopicUpdateResponse { + basic_topic: TopicUpdateBasicTopic; +} +export interface PostUpdateItem { + actions_summary: Array; + admin: boolean; + avatar_template: string; + avg_time: object; + can_delete: boolean; + can_edit: boolean; + can_recover: boolean; + can_view_edit_history: boolean; + can_wiki: boolean; + cooked: string; + created_at: string; + deleted_at: object; + display_username: string; + draft_sequence: number; + edit_reason: object; + hidden_reason_id: object; + hidden: boolean; + id: number; + incoming_link_count: number; + moderator: boolean; + name: string; + post_number: number; + post_type: number; + primary_group_flair_bg_color: object; + primary_group_flair_color: object; + primary_group_flair_url: object; + primary_group_name: object; + quote_count: number; + reads: number; + reply_count: number; + reply_to_post_number: object; + score: number; + staff: boolean; + topic_id: number; + topic_slug: string; + trust_level: number; + updated_at: string; + user_deleted: boolean; + user_id: number; + user_title: object; + username: string; + version: number; + wiki: boolean; + yours: boolean; +} +export interface PostUpdateRequest { + post: { + raw: string; + raw_old?: string; + edit_reason?: string; + cooked?: string; + }; +} +export interface TagsResponse { + tags: Tag[]; + extras: TagsExtras; +} +export interface TagsExtras { + categories: any[]; +} +export interface Tag { + count: number; + description: null; + id: string; + name: string; + pm_only: boolean; + target_tag: null; + text: string; +} +/** https://docs.discourse.org/#tag/Categories/paths/~1categories.json/get */ +export interface CategoriesResponse { + category_list: { + can_create_category: boolean; + can_create_topic: boolean; + categories: Category[]; + draft_key: string; + draft_sequence: number; + draft: boolean; + }; +} +export interface Category { + background_url: string; + can_edit: boolean; + color: string; + description_excerpt: string; + description_text: string; + description: string; + has_children: boolean; + id: number; + logo_url: string; + name: string; + notification_level: string; + permission: number; + position: number; + post_count: number; + read_restricted: boolean; + slug: string; + text_color: string; + topic_count: number; + topic_template: string; + topic_url: string; + topics_all_time: number; + topics_day: number; + topics_month: number; + topics_week: number; + topics_year: number; +} +/** + * Get Single Topic + * https://docs.discourse.org/#tag/Topics/paths/~1t~1{id}.json/get + */ +export interface TopicResponse { + actions_summary: Array; + archetype: string; + archived: boolean; + bookmarked: object; + category_id: number; + chunk_size: number; + closed: boolean; + created_at: string; + deleted_at: object; + deleted_by: object; + details: TopicDetails; + draft_key: string; + draft_sequence: object; + draft: object; + fancy_title: string; + has_summary: boolean; + highest_post_number: number; + id: number; + last_posted_at: object; + like_count: number; + participant_count: number; + pinned_at: string; + pinned_globally: boolean; + pinned_until: object; + pinned: boolean; + posts_count: number; + reply_count: number; + slug: string; + tags: string[]; + title: string; + unpinned: object; + user_id: number; + views: number; + visible: boolean; + word_count: object; + post_stream: { + posts: Array; + stream: Array; + }; + timeline_lookup: [ + { + '0': Array; + } + ]; +} +export interface TopicDetails { + auto_close_at: object; + auto_close_based_on_last_post: boolean; + auto_close_hours: object; + can_flag_topic: boolean; + created_by: Person; + last_poster: Person; + notification_level: number; + participants: Array; + suggested_topics: Array; +} +export interface TopicItem { + archetype: string; + archived: boolean; + bookmarked: object; + bumped_at: string; + bumped: boolean; + category_id: number; + closed: boolean; + created_at: string; + excerpt: string; + fancy_title: string; + has_summary: boolean; + highest_post_number: number; + id: number; + image_url: string; + last_posted_at: string; + last_poster_username: string; + like_count: number; + liked: object; + pinned_globally: boolean; + pinned: boolean; + posters: Array; + posts_count: number; + reply_count: number; + slug: string; + title: string; + unpinned: boolean; + unseen: boolean; + views: number; + visible: boolean; +} +/** + * Get Topics for Category + * https://docs.discourse.org/#tag/Categories/paths/~1c~1{id}.json/get + */ +export interface CategoryResponse { + users: Person[]; + topic_list: { + can_create_topic: boolean; + draft: boolean; + draft_key: string; + draft_sequence: number; + per_page: number; + topics: Array; + }; +} +/** + * Whole Post Information + * As returned by getting a single Post + * https://docs.discourse.org/#tag/Posts/paths/~1posts~1{id}.json/get + */ +export interface PostResponse { + actions_summary: Array; + admin: boolean; + avatar_template: string; + avg_time: object; + can_delete: boolean; + can_edit: boolean; + can_recover: boolean; + can_view_edit_history: boolean; + can_wiki: boolean; + cooked: string; + created_at: string; + deleted_at: object; + display_username: string; + edit_reason: object; + hidden_reason_id: object; + hidden: boolean; + id: number; + incoming_link_count: number; + moderator: boolean; + name: string; + post_number: number; + post_type: number; + primary_group_flair_bg_color: object; + primary_group_flair_color: object; + primary_group_flair_url: object; + primary_group_name: object; + quote_count: number; + raw: string; + reads: number; + reply_count: number; + reply_to_post_number: object; + score: number; + staff: boolean; + topic_id: number; + topic_slug: string; + trust_level: number; + updated_at: string; + user_deleted: boolean; + user_id: number; + user_title: object; + username: string; + version: number; + wiki: boolean; + yours: boolean; +} +export interface ICreateUserResponse { + success: boolean; + active: boolean; + message: string; + user_id: number; + password: string; +} +/** + * Get the Posts of a Topic + * https://docs.discourse.org/#tag/Topics/paths/~1t~1{id}~1posts.json/get + */ +export interface PostsResponse { + post_stream: { + posts: Array; + }; + id: number; +} +/** + * Partial Post Information + * As returned by a listing + */ +export interface PostItem { + accepted_answer: boolean; + actions_summary: Array; + admin: boolean; + avatar_template: string; + can_accept_answer: boolean; + can_delete: boolean; + can_edit: boolean; + can_recover: boolean; + can_unaccept_answer: boolean; + can_view_edit_history: boolean; + can_wiki: boolean; + cooked: string; + created_at: string; + deleted_at: null; + display_username: string; + edit_reason: null; + hidden: boolean; + id: number; + incoming_link_count: number; + link_counts: Array; + moderator: boolean; + name: string; + post_number: number; + post_type: number; + primary_group_flair_bg_color: null | object; + primary_group_flair_color: null | object; + primary_group_flair_url: null | object; + primary_group_name: null | object; + quote_count: number; + read: boolean; + readers_count: number; + reads: number; + reply_count: number; + reply_to_post_number: null | number; + reviewable_id: number; + reviewable_score_count: number; + reviewable_score_pending_count: number; + score: number; + staff: boolean; + topic_id: number; + topic_slug: string; + trust_level: number; + updated_at: string; + user_deleted: boolean; + user_id: number; + user_title: null | object; + username: string; + version: number; + wiki: boolean; + yours: boolean; +} +export type Thread = { + topic: TopicResponse; + post: PostItem; + replies: PostItem[]; +}; +/** When finding and replacing, determine replacements using a method that matches this */ +export type PostModifier = (post: PostResponse) => { + result: string; + reason?: string; +}; +/** Configuration for Discourser */ +export interface IDiscourserConfig { + /** the discourse hostname to connect to, including protocol */ + host: string; + /** the API key to connect with */ + key: string; + /** the username to behave as */ + username: string; + /** the cache directory to use, if we are caching */ + cache?: string; + /** Whether or not we should read from the cache */ + useCache?: boolean; + /** whether or not updates should be dry (non-applying) */ + dry?: boolean; + /** how many concurrency requests to send to the server at once */ + rateLimitConcurrency?: number; +} +export interface FetchOptions { + /** Whether or not we should read from the cache */ + useCache?: boolean; + /** Only applicable to fetching topics of category */ + page?: number; + /** Any thing to init the fetch call with? */ + request?: RequestInit; + include_subcategories?: boolean; +} +export interface FetchConfig extends FetchOptions { + url: string; +} +export interface PostConfig extends FetchOptions { + url: string; + data: any; +} +export interface ISearchPost { + id: number; + name: string; + username: string; + avatar_template: string; + created_at: Date; + like_count: number; + blurb: string; + post_number: number; + topic_id: number; +} +export interface ISearchTagsDescriptions { +} +export interface ISearchTopic { + id: number; + title: string; + fancy_title: string; + slug: string; + posts_count: number; + reply_count: number; + highest_post_number: number; + created_at: Date; + last_posted_at: Date; + bumped: boolean; + bumped_at: Date; + archetype: string; + unseen: boolean; + pinned: boolean; + unpinned?: any; + excerpt: string; + visible: boolean; + closed: boolean; + archived: boolean; + bookmarked?: any; + liked?: any; + tags: any[]; + tags_descriptions: ISearchTagsDescriptions; + category_id: number; + has_accepted_answer: boolean; +} +export interface IGroupedSearchResult { + more_posts?: any; + more_users?: any; + more_categories?: any; + term: string; + search_log_id: number; + more_full_page_results?: any; + can_create_topic: boolean; + error?: any; + post_ids: number[]; + user_ids: any[]; + category_ids: any[]; + tag_ids: any[]; + group_ids: any[]; +} +export interface ISearchResult { + posts: ISearchPost[]; + topics: ISearchTopic[]; + users: any[]; + categories: any[]; + tags: any[]; + groups: any[]; + grouped_search_result: IGroupedSearchResult; +} +export interface IUserDetail { + id: number; + username: string; + name: string; + avatar_template: string; + email: string; + secondary_emails: any[]; + active: boolean; + admin: boolean; + moderator: boolean; + last_seen_at: string; + last_emailed_at: string; + created_at: string; + last_seen_age: number; + last_emailed_age: number; + created_at_age: number; + trust_level: number; + manual_locked_trust_level: any; + flag_level: number; + title: string; + time_read: number; + staged: boolean; + days_visited: number; + posts_read_count: number; + topics_entered: number; + post_count: number; + associated_accounts: AssociatedAccount[]; + can_send_activation_email: boolean; + can_activate: boolean; + can_deactivate: boolean; + ip_address: string; + registration_ip_address: string; + can_grant_admin: boolean; + can_revoke_admin: boolean; + can_grant_moderation: boolean; + can_revoke_moderation: boolean; + can_impersonate: boolean; + like_count: number; + like_given_count: number; + topic_count: number; + post_edits_count: number; + flags_given_count: number; + flags_received_count: number; + private_topics_count: number; + can_delete_all_posts: boolean; + can_be_deleted: boolean; + can_be_anonymized: boolean; + can_be_merged: boolean; + full_suspend_reason: any; + silence_reason: any; + penalty_counts: PenaltyCounts; + next_penalty: string; + primary_group_id: any; + badge_count: number; + warnings_received_count: number; + user_fields: UserFields; + bounce_score: number; + reset_bounce_score_after: any; + can_view_action_logs: boolean; + can_disable_second_factor: boolean; + can_delete_sso_record: boolean; + api_key_count: number; + external_ids: ExternalIds; + single_sign_on_record: any; + approved_by: ApprovedBy; + suspended_by: any; + silenced_by: any; + tl3_requirements: Tl3Requirements; + groups: Group[]; +} +export interface AssociatedAccount { + name: string; + description: string; +} +export interface PenaltyCounts { + silenced: number; + suspended: number; +} +export interface UserFields { + "1": string; + "2": string; + "3": string; + "4": string; + "5": string; +} +export interface ExternalIds { + google_oauth2: string; +} +export interface ApprovedBy { + id: number; + username: string; + name: string; + avatar_template: string; +} +export interface Tl3Requirements { + time_period: number; + requirements_met: boolean; + requirements_lost: boolean; + trust_level_locked: boolean; + on_grace_period: boolean; + days_visited: number; + min_days_visited: number; + num_topics_replied_to: number; + min_topics_replied_to: number; + topics_viewed: number; + min_topics_viewed: number; + posts_read: number; + min_posts_read: number; + topics_viewed_all_time: number; + min_topics_viewed_all_time: number; + posts_read_all_time: number; + min_posts_read_all_time: number; + num_flagged_posts: number; + max_flagged_posts: number; + num_flagged_by_users: number; + max_flagged_by_users: number; + num_likes_given: number; + min_likes_given: number; + num_likes_received: number; + min_likes_received: number; + num_likes_received_days: number; + min_likes_received_days: number; + num_likes_received_users: number; + min_likes_received_users: number; + penalty_counts: PenaltyCounts2; +} +export interface PenaltyCounts2 { + silenced: number; + suspended: number; + total: number; +} +export interface Group { + id: number; + automatic: boolean; + name: string; + display_name?: string; + user_count: number; + mentionable_level: number; + messageable_level: number; + visibility_level: number; + primary_group: boolean; + title: any; + grant_trust_level?: number; + incoming_email: any; + has_messages: boolean; + flair_url: any; + flair_bg_color?: string; + flair_color?: string; + bio_raw?: string; + bio_cooked?: string; + bio_excerpt?: string; + public_admission: boolean; + public_exit: boolean; + allow_membership_requests: boolean; + full_name?: string; + default_notification_level: number; + membership_request_template: any; + members_visibility_level: number; + can_see_members: boolean; + can_admin_group: boolean; + publish_read_state: boolean; + can_edit_group?: boolean; +} +export type TPostStatus = 'visible' | 'archived' | 'pinned' | 'closed'; +export interface TPostStatusUpdate { + success: string; + topic_status_update: any; +} +export interface UserPreferencesUpdate { + bio_raw?: string; + website?: string; + location?: string; + custom_fields?: CustomFields; + timezone?: string; + default_calendar?: string; + profile_background_upload_url?: string; + card_background_upload_url?: string; +} +export interface CustomFields { + geo_location: GeoLocation; +} +export interface GeoLocation { + lat: string; + lon: string; + address: string; + countrycode: string; + city: string; + state: string; + country: string; + postalcode: string; + boundingbox: string[]; + type: string; +} diff --git a/packages/discourse/dist/src/lib/discourse/types.js b/packages/discourse/dist/src/lib/discourse/types.js new file mode 100644 index 00000000..041980b6 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/types.js @@ -0,0 +1,4 @@ +// Attempt at TypeScript Types for the Discourse API +// https://docs.discourse.org +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/discourse/types.js.map b/packages/discourse/dist/src/lib/discourse/types.js.map new file mode 100644 index 00000000..6972b2c0 --- /dev/null +++ b/packages/discourse/dist/src/lib/discourse/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/discourse/types.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,6BAA6B"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/index.d.ts b/packages/discourse/dist/src/lib/index.d.ts new file mode 100644 index 00000000..88a7f208 --- /dev/null +++ b/packages/discourse/dist/src/lib/index.d.ts @@ -0,0 +1,2 @@ +export * from './discourse/index.js'; +export * from './discourse/types.js'; diff --git a/packages/discourse/dist/src/lib/index.js b/packages/discourse/dist/src/lib/index.js new file mode 100644 index 00000000..08c21793 --- /dev/null +++ b/packages/discourse/dist/src/lib/index.js @@ -0,0 +1,3 @@ +export * from './discourse/index.js'; +export * from './discourse/types.js'; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/index.js.map b/packages/discourse/dist/src/lib/index.js.map new file mode 100644 index 00000000..4d62e5c6 --- /dev/null +++ b/packages/discourse/dist/src/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/Pattern.d.ts b/packages/discourse/dist/src/lib/markdown/Pattern.d.ts new file mode 100644 index 00000000..91de1407 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Pattern.d.ts @@ -0,0 +1,7 @@ +import { RegExCallback } from './types.js'; +export declare class Pattern { + regex: RegExp; + replacement: RegExCallback; + constructor(regex: RegExp, replacement: any); + apply(raw: string): string; +} diff --git a/packages/discourse/dist/src/lib/markdown/Pattern.js b/packages/discourse/dist/src/lib/markdown/Pattern.js new file mode 100644 index 00000000..9d9303a2 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Pattern.js @@ -0,0 +1,12 @@ +export class Pattern { + regex; + replacement; + constructor(regex, replacement) { + this.regex = regex; + this.replacement = replacement; + } + apply(raw) { + return raw.replace(this.regex, this.replacement); + } +} +//# sourceMappingURL=Pattern.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/Pattern.js.map b/packages/discourse/dist/src/lib/markdown/Pattern.js.map new file mode 100644 index 00000000..f8747339 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Pattern.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Pattern.js","sourceRoot":"","sources":["../../../../src/lib/markdown/Pattern.ts"],"names":[],"mappings":"AACA,MAAM,OAAO,OAAO;IAClB,KAAK,CAAS;IACd,WAAW,CAAe;IAC1B,YAAY,KAAa,EAAE,WAAgB;QACzC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;IAClD,CAAC;CACF"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/Rule.d.ts b/packages/discourse/dist/src/lib/markdown/Rule.d.ts new file mode 100644 index 00000000..a3f0beae --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Rule.d.ts @@ -0,0 +1,7 @@ +import { Pattern } from './Pattern.js'; +export declare class Rule { + name: string; + patterns: Pattern[]; + constructor(name: string, patterns: Pattern[]); + apply(raw: string): string; +} diff --git a/packages/discourse/dist/src/lib/markdown/Rule.js b/packages/discourse/dist/src/lib/markdown/Rule.js new file mode 100644 index 00000000..5526e648 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Rule.js @@ -0,0 +1,12 @@ +export class Rule { + name; + patterns; + constructor(name, patterns) { + this.name = name; + this.patterns = patterns; + } + apply(raw) { + return this.patterns.reduce((result, pattern) => pattern.apply(result), raw); + } +} +//# sourceMappingURL=Rule.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/Rule.js.map b/packages/discourse/dist/src/lib/markdown/Rule.js.map new file mode 100644 index 00000000..18afff7d --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/Rule.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Rule.js","sourceRoot":"","sources":["../../../../src/lib/markdown/Rule.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,IAAI;IACf,IAAI,CAAS;IACb,QAAQ,CAAY;IACpB,YAAY,IAAY,EAAE,QAAmB;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAC1C,GAAG,CACJ,CAAC;IACJ,CAAC;CACF"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/index.d.ts b/packages/discourse/dist/src/lib/markdown/index.d.ts new file mode 100644 index 00000000..2ab820f4 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/index.d.ts @@ -0,0 +1,14 @@ +import { Rule } from './Rule.js'; +import { RMarkOptions } from './types.js'; +export declare const RE_IMAGES: RegExp; +export declare const RE_LINKS: RegExp; +export declare class RMark { + constructor(options: RMarkOptions); + private rules; + addRuleBefore(rule: Rule, before: string): RMark; + addRule(rule: Rule): RMark; + render(raw: string): string; +} +export { Rule } from './Rule.js'; +export { Pattern } from './Pattern.js'; +export declare const toHTML: (content: any) => string; diff --git a/packages/discourse/dist/src/lib/markdown/index.js b/packages/discourse/dist/src/lib/markdown/index.js new file mode 100644 index 00000000..9d18e9eb --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/index.js @@ -0,0 +1,98 @@ +import { Rule } from './Rule.js'; +import { Pattern } from './Pattern.js'; +export const RE_IMAGES = /\!\[([^\]]+)\]\((\S+)\)/g; +export const RE_LINKS = /\[([^\n]+)\]\(([^\n]+)\)/g; +import markdown from 'markdown-it'; +const defaultRules = [ + new Rule('header', [ + new Pattern(/^#{6}\s?([^\n]+)/gm, '
$1
'), + new Pattern(/^#{5}\s?([^\n]+)/gm, '
$1
'), + new Pattern(/^#{4}\s?([^\n]+)/gm, '

$1

'), + new Pattern(/^#{3}\s?([^\n]+)/gm, '

$1

'), + new Pattern(/^#{2}\s?([^\n]+)/gm, '

$1

'), + new Pattern(/^#{1}\s?([^\n]+)/gm, '

$1

'), + ]), + new Rule('bold', [ + new Pattern(/\*\*\s?([^\n]+)\*\*/g, '$1'), + new Pattern(/\_\_\s?([^\n]+)\_\_/g, '$1'), + ]), + new Rule('italic', [ + new Pattern(/\*\s?([^\n]+)\*/g, '$1'), + new Pattern(/\_\s?([^\n]+)\_/g, '$1'), + ]), + new Rule('image', [ + new Pattern(/\!\[([^\]]+)\]\((\S+)\)/g, '$1'), + ]), + new Rule('link', [ + new Pattern(/\[([^\n]+)\]\(([^\n]+)\)/g, '$1'), + ]), + new Rule('paragraph', [ + // this regex can't skip processed HTML + new Pattern(/([^\n]+\n?)/g, '\n

$1

\n'), + // another possible regex that can't skip processed HTML + // new Pattern(/(?:^|\n)([^\n\<]+(?:\n[^\n\>]+)*)(?:\n|$)/gm, '\n

$1

\n'), + ]) +]; +const defaultRulesDiscourse = (images, links) => { + return [ + new Rule('image', [ + new Pattern(RE_LINKS, images) + ]) /*, + new Rule('link', [ + new Pattern( + RE_LINKS, + links + ) + ])*/ + ]; +}; +export class RMark { + constructor(options) { + this.rules = defaultRulesDiscourse(options.images, options.links); + } + rules; + addRuleBefore(rule, before) { + const index = this.rules.findIndex((r) => r.name === before); + if (index !== -1) { + this.rules.splice(index, 0, rule); + } + return this; + } + addRule(rule) { + this.addRuleBefore(rule, 'paragraph'); + return this; + } + render(raw) { + let result = raw; + this.rules.forEach((rule) => { + result = rule.apply(result); + }); + return result; + } +} +export { Rule } from './Rule.js'; +export { Pattern } from './Pattern.js'; +// export const find = (content:string, reg:RegExp) => content.match(reg) +export const toHTML = (content) => { + const md = new markdown({ + html: true, + breaks: true + }); + return md.render(content); +}; +function image_urls(input) { + const regex = /https?:\/\/(?:[a-z0-9\-]+\.)+[a-z]{2,}(?:\/[^\/#\s]*)*\.(?:jpe?g|gif|png|webp)/g; + const matches = input.match(regex); + return matches || []; +} +function image_urls_local(input) { + const regex = /\/(?:[^\/#\s]+\/)*[^\/#\s]+\.(?:jpe?g|gif|png|webp)/g; + const matches = input.match(regex); + return matches || []; +} +function findUploadImageUrls(input) { + const regex = /upload:\/\/[^\s]+?\.(?:jpe?g|gif|png)/gi; + const matches = input.match(regex); + return matches || []; +} +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/index.js.map b/packages/discourse/dist/src/lib/markdown/index.js.map new file mode 100644 index 00000000..6f408084 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/markdown/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/index.test.d.ts b/packages/discourse/dist/src/lib/markdown/index.test.d.ts new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/index.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/discourse/src/lib/markdown/index.test.ts b/packages/discourse/dist/src/lib/markdown/index.test.js similarity index 51% rename from packages/discourse/src/lib/markdown/index.test.ts rename to packages/discourse/dist/src/lib/markdown/index.test.js index 929727f5..11e6c7da 100644 --- a/packages/discourse/src/lib/markdown/index.test.ts +++ b/packages/discourse/dist/src/lib/markdown/index.test.js @@ -1,5 +1,4 @@ -import { Pattern, RMark, Rule } from './index'; - +import { Pattern, RMark, Rule } from './index'; const sampleText = `# Header 1 ## Header 2 ### Header 3 @@ -19,8 +18,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat fac Sed pellentesque nulla sit amet tincidunt sagittis. Phasellus eget justo nulla. Cras nisi odio, lobortis nec ante eget, commodo euismod turpis. Cras id orci dolor. Etiam auctor, nisl luctus volutpat lacinia, turpis orci euismod magna, pharetra eleifend massa metus aliquet -`; - +`; const sampleHtml = `

Header 1

@@ -68,77 +66,47 @@ const sampleHtml = `

turpis. Cras id orci dolor. Etiam auctor, nisl luctus volutpat lacinia, turpis orci euismod magna, pharetra eleifend massa metus aliquet

-`; - -describe('testing index file', () => { - test('empty string should render nothing', () => { - expect(new RMark().render('')).toBe(''); - }); - test('should render paragraph', () => { - expect( - new RMark().render( - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.' - ) - ).toBe( - '\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\n' - ); - }); - test('should render header', () => { - expect(new RMark().render('# Header 1')).toBe( - '\n

Header 1

\n' - ); - expect(new RMark().render('## Header 2')).toBe( - '\n

Header 2

\n' - ); - expect(new RMark().render('### Header 3')).toBe( - '\n

Header 3

\n' - ); - expect(new RMark().render('#### Header 4')).toBe( - '\n

Header 4

\n' - ); - expect(new RMark().render('##### Header 5')).toBe( - '\n

Header 5

\n' - ); - expect(new RMark().render('###### Header 6')).toBe( - '\n

Header 6

\n' - ); - }); - test('should render bold', () => { - expect(new RMark().render('**Bold**')).toBe('\n

Bold

\n'); - expect(new RMark().render('__Bold__')).toBe('\n

Bold

\n'); - expect(new RMark().render('This is **Bold**')).toBe( - '\n

This is Bold

\n' - ); - }); - test('should render italic', () => { - expect(new RMark().render('*Italic*')).toBe('\n

Italic

\n'); - expect(new RMark().render('_Italic_')).toBe('\n

Italic

\n'); - }); - test('should render image', () => { - expect( - new RMark().render( - '![Image](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png)' - ) - ).toBe( - '\n

Image

\n' - ); - }); - test('should render link', () => { - expect(new RMark().render('[Link](https://github.com)')).toBe( - '\n

Link

\n' - ); - }); - test('should render paragraph with multiple lines', () => { - expect(new RMark().render(sampleText)).toBe(sampleHtml); - }); - test('should work with adding rules', () => { - const rmark = new RMark(); - rmark.addRule( - new Rule('horizontal', [ - new Pattern(/^(-{3})/gm, '
'), - new Pattern(/^(_{3})/gm, '
'), - ]) - ); - expect(rmark.render('---')).toBe('\n


\n'); - }); -}); +`; +describe('testing index file', () => { + test('empty string should render nothing', () => { + expect(new RMark().render('')).toBe(''); + }); + test('should render paragraph', () => { + expect(new RMark().render('Lorem ipsum dolor sit amet, consectetur adipiscing elit.')).toBe('\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

\n'); + }); + test('should render header', () => { + expect(new RMark().render('# Header 1')).toBe('\n

Header 1

\n'); + expect(new RMark().render('## Header 2')).toBe('\n

Header 2

\n'); + expect(new RMark().render('### Header 3')).toBe('\n

Header 3

\n'); + expect(new RMark().render('#### Header 4')).toBe('\n

Header 4

\n'); + expect(new RMark().render('##### Header 5')).toBe('\n

Header 5

\n'); + expect(new RMark().render('###### Header 6')).toBe('\n

Header 6

\n'); + }); + test('should render bold', () => { + expect(new RMark().render('**Bold**')).toBe('\n

Bold

\n'); + expect(new RMark().render('__Bold__')).toBe('\n

Bold

\n'); + expect(new RMark().render('This is **Bold**')).toBe('\n

This is Bold

\n'); + }); + test('should render italic', () => { + expect(new RMark().render('*Italic*')).toBe('\n

Italic

\n'); + expect(new RMark().render('_Italic_')).toBe('\n

Italic

\n'); + }); + test('should render image', () => { + expect(new RMark().render('![Image](https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png)')).toBe('\n

Image

\n'); + }); + test('should render link', () => { + expect(new RMark().render('[Link](https://github.com)')).toBe('\n

Link

\n'); + }); + test('should render paragraph with multiple lines', () => { + expect(new RMark().render(sampleText)).toBe(sampleHtml); + }); + test('should work with adding rules', () => { + const rmark = new RMark(); + rmark.addRule(new Rule('horizontal', [ + new Pattern(/^(-{3})/gm, '
'), + new Pattern(/^(_{3})/gm, '
'), + ])); + expect(rmark.render('---')).toBe('\n


\n'); + }); +}); +//# sourceMappingURL=index.test.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/index.test.js.map b/packages/discourse/dist/src/lib/markdown/index.test.js.map new file mode 100644 index 00000000..b15c82bc --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/index.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/lib/markdown/index.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/page.d.ts b/packages/discourse/dist/src/lib/markdown/page.d.ts new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/page.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/discourse/src/lib/markdown/page.ts b/packages/discourse/dist/src/lib/markdown/page.js similarity index 90% rename from packages/discourse/src/lib/markdown/page.ts rename to packages/discourse/dist/src/lib/markdown/page.js index 049c2ee4..79c9e1af 100644 --- a/packages/discourse/src/lib/markdown/page.ts +++ b/packages/discourse/dist/src/lib/markdown/page.js @@ -1,5 +1,4 @@ -import { RMark } from '.'; - +import { RMark } from './index.js'; const sampleText = `# Header 1 ## Header 2 ### Header 3 @@ -19,10 +18,9 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat fac Sed pellentesque nulla sit amet tincidunt sagittis. Phasellus eget justo nulla. Cras nisi odio, lobortis nec ante eget, commodo euismod turpis. Cras id orci dolor. Etiam auctor, nisl luctus volutpat lacinia, turpis orci euismod magna, pharetra eleifend massa metus aliquet -`; - -const page = document.getElementById('page'); - -if (page) { - page.innerHTML = new RMark().render(sampleText); -} +`; +const page = document.getElementById('page'); +if (page) { + page.innerHTML = new RMark().render(sampleText); +} +//# sourceMappingURL=page.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/page.js.map b/packages/discourse/dist/src/lib/markdown/page.js.map new file mode 100644 index 00000000..a0e1d7c9 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/page.js.map @@ -0,0 +1 @@ +{"version":3,"file":"page.js","sourceRoot":"","sources":["../../../../src/lib/markdown/page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBlB,CAAC;AAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAE7C,IAAI,IAAI,EAAE;IACR,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;CACjD"} \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/types.d.ts b/packages/discourse/dist/src/lib/markdown/types.d.ts new file mode 100644 index 00000000..912a5295 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/types.d.ts @@ -0,0 +1,5 @@ +export type RegExCallback = (match: any, capture: any, arg1: any, arg2: any) => string; +export interface RMarkOptions { + images: RegExCallback; + links?: RegExCallback; +} diff --git a/packages/discourse/dist/src/lib/markdown/types.js b/packages/discourse/dist/src/lib/markdown/types.js new file mode 100644 index 00000000..4513f1e0 --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/types.js @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/lib/markdown/types.js.map b/packages/discourse/dist/src/lib/markdown/types.js.map new file mode 100644 index 00000000..339df4cb --- /dev/null +++ b/packages/discourse/dist/src/lib/markdown/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/markdown/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/discourse/dist/src/main.d.ts b/packages/discourse/dist/src/main.d.ts new file mode 100644 index 00000000..d1ebc9c7 --- /dev/null +++ b/packages/discourse/dist/src/main.d.ts @@ -0,0 +1,2 @@ +#!/usr/bin/env node +export {}; diff --git a/packages/discourse/dist/src/main.js b/packages/discourse/dist/src/main.js new file mode 100644 index 00000000..ac1481f9 --- /dev/null +++ b/packages/discourse/dist/src/main.js @@ -0,0 +1,14 @@ +#!/usr/bin/env node +process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; +import { defaults } from './_cli.js'; +defaults(); +import { cli } from './cli.js'; +const argv = cli.argv; +if (argv.help) { + cli.showHelp(); + process.exit(); +} +else if (argv.v || argv.version) { + process.exit(); +} +//# sourceMappingURL=main.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/main.js.map b/packages/discourse/dist/src/main.js.map new file mode 100644 index 00000000..4e0dfc52 --- /dev/null +++ b/packages/discourse/dist/src/main.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AACA,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAAC,QAAQ,EAAE,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,MAAM,IAAI,GAAQ,GAAG,CAAC,IAAI,CAAC;AAE3B,IAAI,IAAI,CAAC,IAAI,EAAE;IACX,GAAG,CAAC,QAAQ,EAAE,CAAC;IACf,OAAO,CAAC,IAAI,EAAE,CAAC;CAClB;KAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE;IAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;CAClB"} \ No newline at end of file diff --git a/packages/discourse/dist/src/options.d.ts b/packages/discourse/dist/src/options.d.ts new file mode 100644 index 00000000..3cbe1c97 --- /dev/null +++ b/packages/discourse/dist/src/options.d.ts @@ -0,0 +1,3 @@ +export * from './lib/index.js'; +import { IOptions } from './types.js'; +export declare const parse: (options: IOptions, argv: any) => IOptions; diff --git a/packages/discourse/dist/src/options.js b/packages/discourse/dist/src/options.js new file mode 100644 index 00000000..2c836b9d --- /dev/null +++ b/packages/discourse/dist/src/options.js @@ -0,0 +1,21 @@ +import { resolveConfig } from '@polymech/core'; +export * from './lib/index.js'; +export const parse = (options, argv) => { + for (const k in argv) { + if (!(k in options.variables) && k !== '_' + && k !== '$0' + && k !== 'variables' + && k !== 'src' + && k !== 'format' + && k !== 'profile' + && k !== 'output') { + options.variables[k] = argv[k]; + } + } + options.variables['cwd'] = options.variables['cwd'] ? options.variables['cwd'] : options.cwd; + resolveConfig(options.variables); + let variables = {}; + options.pathVariables = variables; + return options; +}; +//# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/options.js.map b/packages/discourse/dist/src/options.js.map new file mode 100644 index 00000000..32034a0f --- /dev/null +++ b/packages/discourse/dist/src/options.js.map @@ -0,0 +1 @@ +{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,cAAc,gBAAgB,CAAA;AAK9B,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,OAAiB,EAAE,IAAS,EAAY,EAAE;IAE5D,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;QAClB,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG;eACnC,CAAC,KAAK,IAAI;eACV,CAAC,KAAK,WAAW;eACjB,CAAC,KAAK,KAAK;eACX,CAAC,KAAK,QAAQ;eACd,CAAC,KAAK,SAAS;eACf,CAAC,KAAK,QAAQ,EAAE;YACnB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;SAClC;KACJ;IAED,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAA;IAC5F,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAChC,IAAI,SAAS,GAAG,EAAE,CAAA;IAClB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAA;IACjC,OAAO,OAAO,CAAA;AAClB,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/src/types.d.ts b/packages/discourse/dist/src/types.d.ts new file mode 100644 index 00000000..216f5eb7 --- /dev/null +++ b/packages/discourse/dist/src/types.d.ts @@ -0,0 +1,157 @@ +import { PATH_INFO, SRC_VARIABLES } from '@polymech/commons'; +import { EDiscourseConfigKey } from './lib/discourse/constants.js'; +import { IProcessingNode } from '@polymech/fs/interfaces'; +export type TFindFilter = (path: string) => any; +export interface Hash { + [id: string]: T; +} +export type IOptions = { + src: string; + id: string; + cat: string; + track: string; + variables: Hash; + cwd: string; + env: string; + verb: string; + debug: boolean; + disabled: boolean; + dry?: boolean; + all?: boolean; + stdout: boolean; + pathVariables: Hash; +}; +/** + * An enumeration to narrow a conflict resolve to a single item or for all following conflicts. + * + * @export + * @enum {number} + */ +export declare enum EResolve { + /** + * Always will use the chose conflict settings for all following conflicts. + */ + ALWAYS = 0, + /** + * 'This' will use the conflict settings for a single conflict so the conflict callback will be triggered again for the next conflict. + */ + THIS = 1 +} +/** + * The possible modes to resolve a conflict during a sync + * + * @export + * @enum {number} + */ +export declare enum EResolveMode { + SKIP = 0, + OVERWRITE = 1, + IF_NEWER = 2, + IF_SIZE_DIFFERS = 3, + THROW = 4, + RETRY = 5, + ABORT = 6 +} +export interface IConflictSettings { + /** + * How to resolve this conflict/error. + * + * @type {EResolveMode} + * @memberOf IConflictSettings + */ + overwrite: EResolveMode; + /** + * The scope of this conflict resolver: always or this. + * + * @type {EResolve} + * @memberOf IConflictSettings + */ + mode: EResolve; + /** + * Track the origin error type for this settings. + * + * @type {string} + * @memberOf IConflictSettings + */ + error?: string; +} +export type EMergeConflictMode = 'theirs' | 'mine'; +export type EPostType = 'post' | 'reply'; +export type ISyncNodeReport = IProcessingNode & {}; +export interface IDiscoursePostBaseOptions { + title?: string; + id?: string; + cat?: string | number; + tags?: string; + owner?: string | number; + timestamp?: string | number | Date; + uploadLocal?: boolean; + uploadRemote?: boolean; + yaml?: boolean; + post_id?: number; + topic_id?: number; + type?: EPostType; + user_name?: string; +} +export type IOptionsSync = IDiscoursePostBaseOptions & { + debug?: boolean; + verbose?: boolean; + logLevel?: string; + skip?: boolean; + alt?: boolean; + src?: string; + verb: string; + cache?: boolean; + filter?: TFindFilter | string; + config?: string | EDiscourseConfigKey; + pathVariables?: Hash; + variables?: SRC_VARIABLES; + repo?: string; + root?: string; + product_root?: string; + srcInfo?: PATH_INFO; + post_id?: number; + topic_id?: number; +}; +export type IOptionsSyncComponent = IOptionsSync & { + format?: string; + module?: string; + plugins?: string; + onCompiled?: () => void; + onCompileDone?: () => void; + cache?: boolean; + skip?: boolean; +}; +export interface IDBConfig { + user: string; + password: string; + database: string; + host: string; + prefix: string; +} +export interface IDiscourseUser { + id: number; + username: string; + name: string; + avatar_template: string; + active: boolean; + admin: boolean; + moderator: boolean; + last_seen_at: any; + last_emailed_at: string; + created_at: string; + last_seen_age: any; + last_emailed_age: number; + created_at_age: number; + trust_level: number; + manual_locked_trust_level: any; + flag_level: number; + title: any; + time_read: number; + staged: boolean; + days_visited: number; + posts_read_count: number; + topics_entered: number; + post_count: number; + detail: any; +} diff --git a/packages/discourse/dist/src/types.js b/packages/discourse/dist/src/types.js new file mode 100644 index 00000000..be91ef3e --- /dev/null +++ b/packages/discourse/dist/src/types.js @@ -0,0 +1,38 @@ +/////////////////////////////////////////////////////// +// +// Sync Types +// +/** + * An enumeration to narrow a conflict resolve to a single item or for all following conflicts. + * + * @export + * @enum {number} + */ +export var EResolve; +(function (EResolve) { + /** + * Always will use the chose conflict settings for all following conflicts. + */ + EResolve[EResolve["ALWAYS"] = 0] = "ALWAYS"; + /** + * 'This' will use the conflict settings for a single conflict so the conflict callback will be triggered again for the next conflict. + */ + EResolve[EResolve["THIS"] = 1] = "THIS"; +})(EResolve = EResolve || (EResolve = {})); +/** + * The possible modes to resolve a conflict during a sync + * + * @export + * @enum {number} + */ +export var EResolveMode; +(function (EResolveMode) { + EResolveMode[EResolveMode["SKIP"] = 0] = "SKIP"; + EResolveMode[EResolveMode["OVERWRITE"] = 1] = "OVERWRITE"; + EResolveMode[EResolveMode["IF_NEWER"] = 2] = "IF_NEWER"; + EResolveMode[EResolveMode["IF_SIZE_DIFFERS"] = 3] = "IF_SIZE_DIFFERS"; + EResolveMode[EResolveMode["THROW"] = 4] = "THROW"; + EResolveMode[EResolveMode["RETRY"] = 5] = "RETRY"; + EResolveMode[EResolveMode["ABORT"] = 6] = "ABORT"; +})(EResolveMode = EResolveMode || (EResolveMode = {})); +//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/packages/discourse/dist/src/types.js.map b/packages/discourse/dist/src/types.js.map new file mode 100644 index 00000000..bc1d419e --- /dev/null +++ b/packages/discourse/dist/src/types.js.map @@ -0,0 +1 @@ +{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA6BA,uDAAuD;AACvD,EAAE;AACF,aAAa;AACb,EAAE;AAEF;;;;;GAKG;AACH,MAAM,CAAN,IAAY,QASX;AATD,WAAY,QAAQ;IAChB;;OAEG;IACH,2CAAM,CAAA;IACN;;OAEG;IACH,uCAAI,CAAA;AACR,CAAC,EATW,QAAQ,GAAR,QAAQ,KAAR,QAAQ,QASnB;AAED;;;;;GAKG;AACH,MAAM,CAAN,IAAY,YAQX;AARD,WAAY,YAAY;IACpB,+CAAQ,CAAA;IACR,yDAAS,CAAA;IACT,uDAAQ,CAAA;IACR,qEAAe,CAAA;IACf,iDAAK,CAAA;IACL,iDAAK,CAAA;IACL,iDAAK,CAAA;AACT,CAAC,EARW,YAAY,GAAZ,YAAY,KAAZ,YAAY,QAQvB"} \ No newline at end of file diff --git a/packages/discourse/dist/tests/commons.d.ts b/packages/discourse/dist/tests/commons.d.ts new file mode 100644 index 00000000..bc8eaf53 --- /dev/null +++ b/packages/discourse/dist/tests/commons.d.ts @@ -0,0 +1,4 @@ +import { Discourser } from '../src/lib/discourse/index.js'; +import { IDiscourseConfig } from '@polymech/commons/types'; +export declare const getDiscourseConfig: () => IDiscourseConfig; +export declare const getClient: () => Discourser; diff --git a/packages/discourse/dist/tests/commons.js b/packages/discourse/dist/tests/commons.js new file mode 100644 index 00000000..7de28be5 --- /dev/null +++ b/packages/discourse/dist/tests/commons.js @@ -0,0 +1,15 @@ +process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; +import { Discourser } from '../src/lib/discourse/index.js'; +export const getDiscourseConfig = () => { + return { + host: process.env.DISCOURSE_HOST || 'https://forum.polymech.info', + key: process.env.DISCOURSE_API_KEY || 'e8b4adf4770b85cf94ea5e0aacb517ad25ddeb338efa3946559c06c2cdbab2e8', + username: process.env.DISCOURSE_USERNAME || 'jerom', + rateLimitConcurrency: 1 + }; +}; +export const getClient = () => { + const config = getDiscourseConfig(); + return new Discourser(config); +}; +//# sourceMappingURL=commons.js.map \ No newline at end of file diff --git a/packages/discourse/dist/tests/commons.js.map b/packages/discourse/dist/tests/commons.js.map new file mode 100644 index 00000000..774c8c35 --- /dev/null +++ b/packages/discourse/dist/tests/commons.js.map @@ -0,0 +1 @@ +{"version":3,"file":"commons.js","sourceRoot":"","sources":["../../tests/commons.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,GAAG,GAAG,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAG1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAqB,EAAE;IACrD,OAAO;QACH,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,6BAA6B;QACjE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,kEAAkE;QACxG,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO;QACnD,oBAAoB,EAAE,CAAC;KAC1B,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAA;IACnC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;AACjC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/tests/posts.test.d.ts b/packages/discourse/dist/tests/posts.test.d.ts new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/packages/discourse/dist/tests/posts.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/discourse/dist/tests/posts.test.js b/packages/discourse/dist/tests/posts.test.js new file mode 100644 index 00000000..e695aa3f --- /dev/null +++ b/packages/discourse/dist/tests/posts.test.js @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest'; +import { getClient } from './commons.js'; +describe('Discourse Posts', () => { + const client = getClient(); + it('should fetch posts', async () => { + try { + const posts = await client.getPostItems(); + expect(posts).toBeDefined(); + expect(Array.isArray(posts)).toBe(true); + } + catch (e) { + console.warn('Skipping test due to connection error or config', e); + } + }); +}); +//# sourceMappingURL=posts.test.js.map \ No newline at end of file diff --git a/packages/discourse/dist/tests/posts.test.js.map b/packages/discourse/dist/tests/posts.test.js.map new file mode 100644 index 00000000..e881abfa --- /dev/null +++ b/packages/discourse/dist/tests/posts.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"posts.test.js","sourceRoot":"","sources":["../../tests/posts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAChC,IAAI;YACA,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAA;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAC1C;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAA;SACrE;IACL,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/tests/topics.test.d.ts b/packages/discourse/dist/tests/topics.test.d.ts new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/packages/discourse/dist/tests/topics.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/discourse/dist/tests/topics.test.js b/packages/discourse/dist/tests/topics.test.js new file mode 100644 index 00000000..75c44610 --- /dev/null +++ b/packages/discourse/dist/tests/topics.test.js @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest'; +import { getClient } from './commons.js'; +describe('Discourse Topics', () => { + const client = getClient(); + it('should fetch latest topics', async () => { + try { + const topics = await client.getTopicItems(); + expect(topics).toBeDefined(); + expect(Array.isArray(topics)).toBe(true); + if (topics.length > 0) { + expect(topics[0].id).toBeDefined(); + } + } + catch (e) { + console.warn('Skipping test due to connection error or config', e); + } + }); + it('should fetch a specific topic', async () => { + try { + // we need a valid ID, assume we have one from the previous list or a known one + const topics = await client.getTopicItems({ page: 0 }); + if (topics && topics.length > 0) { + const topicId = topics[0].id; + const topic = await client.getTopic(topicId); + expect(topic).toBeDefined(); + expect(topic.id).toBe(topicId); + } + else { + console.warn('No topics found to test getTopic'); + } + } + catch (e) { + console.warn('Skipping test due to connection error or config', e); + } + }, 15000); +}); +//# sourceMappingURL=topics.test.js.map \ No newline at end of file diff --git a/packages/discourse/dist/tests/topics.test.js.map b/packages/discourse/dist/tests/topics.test.js.map new file mode 100644 index 00000000..e9f96c5f --- /dev/null +++ b/packages/discourse/dist/tests/topics.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"topics.test.js","sourceRoot":"","sources":["../../tests/topics.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QACxC,IAAI;YACA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;YAC5B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;aACrC;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAA;SACrE;IACL,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC3C,IAAI;YACA,+EAA+E;YAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YACtD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC5B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;gBAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;aACjC;iBAAM;gBACH,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;aACnD;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAA;SACrE;IACL,CAAC,EAAE,KAAK,CAAC,CAAA;AACb,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/dist/tests/users.test.d.ts b/packages/discourse/dist/tests/users.test.d.ts new file mode 100644 index 00000000..509db186 --- /dev/null +++ b/packages/discourse/dist/tests/users.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/discourse/dist/tests/users.test.js b/packages/discourse/dist/tests/users.test.js new file mode 100644 index 00000000..e4d176ea --- /dev/null +++ b/packages/discourse/dist/tests/users.test.js @@ -0,0 +1,28 @@ +import { describe, it, expect } from 'vitest'; +import { getClient } from './commons.js'; +describe('Discourse Users', () => { + const client = getClient(); + it('should fetch active users', async () => { + try { + const users = await client.getUsers(0); + expect(users).toBeDefined(); + // Depending on response structure, checking properties + // expect(users).toHaveProperty('users') + } + catch (e) { + console.warn('Skipping test due to connection error or config', e); + } + }); + it('should fetch a specific user by username', async () => { + try { + const username = 'system'; + const user = await client.getUserByUsername(username); + expect(user).toBeDefined(); + expect(user.username.toLowerCase()).toBe(username); + } + catch (e) { + console.warn('Skipping test due to connection error or config', e); + } + }); +}); +//# sourceMappingURL=users.test.js.map \ No newline at end of file diff --git a/packages/discourse/dist/tests/users.test.js.map b/packages/discourse/dist/tests/users.test.js.map new file mode 100644 index 00000000..241299e3 --- /dev/null +++ b/packages/discourse/dist/tests/users.test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"users.test.js","sourceRoot":"","sources":["../../tests/users.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;IAE1B,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACvC,IAAI;YACA,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3B,uDAAuD;YACvD,wCAAwC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAA;SACrE;IACL,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACtD,IAAI;YACA,MAAM,QAAQ,GAAG,QAAQ,CAAA;YACzB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;YAC1B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACrD;QAAC,OAAO,CAAC,EAAE;YACR,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAA;SACrE;IACL,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"} \ No newline at end of file diff --git a/packages/discourse/package-lock.json b/packages/discourse/package-lock.json index b05cc984..3a54e43a 100644 --- a/packages/discourse/package-lock.json +++ b/packages/discourse/package-lock.json @@ -14,10 +14,11 @@ "@polymech/commons": "file:../commons", "@polymech/core": "file:../core", "@polymech/fs": "file:../fs", + "@polymech/log": "file:../log", "@polymech/media": "file:../media", "@polymech/registry": "file:../registry", "@types/markdown-it": "^12.2.3", - "@types/node": "^14.17.5", + "@types/node": "^25.0.3", "@types/yargs": "^17.0.11", "axios": "^0.27.2", "bluebird": "^3.7.2", @@ -30,6 +31,7 @@ "fast-glob": "^3.3.0", "filenamify": "^4.3.0", "find-up": "^5.0.0", + "form-data": "^4.0.0", "front-matter": "^4.0.2", "generate-password": "^1.7.0", "glob-base": "^0.3.0", @@ -43,7 +45,6 @@ "native-promise-pool": "^3.19.0", "pretty": "^2.0.0", "querystring": "^0.2.1", - "request": "^2.88.2", "sanitize-filename": "^1.6.3", "showdown": "^2.1.0", "simple-git": "^3.19.1", @@ -57,6 +58,9 @@ "bin": { "pm-discourse": "main.js" }, + "devDependencies": { + "vitest": "^3.0.0" + }, "engines": { "node": ">= 14.0.0" } @@ -158,6 +162,28 @@ "node": ">= 8.0.0" } }, + "../log": { + "name": "@polymech/log", + "version": "0.2.6", + "license": "BSD", + "dependencies": { + "@polymech/core": "file:../core", + "@repo/typescript-config": "file:../typescript-config", + "tslog": "^3.3.3", + "tsup": "^8.3.5", + "zod": "^3.24.1" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@types/node": "^22.10.9", + "eslint": "^8.57.1", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-regexp": "^2.7.0", + "ts-node": "^10.9.1", + "typescript": "^4.9.5", + "typescript-eslint": "^8.20.0" + } + }, "../media": { "name": "@polymech/media", "version": "0.3.0", @@ -232,6 +258,448 @@ "node": ">= 14.0.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@iarna/toml": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", @@ -255,6 +723,13 @@ "node": ">=12" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -343,6 +818,10 @@ "resolved": "../fs", "link": true }, + "node_modules/@polymech/log": { + "resolved": "../log", + "link": true + }, "node_modules/@polymech/media": { "resolved": "../media", "link": true @@ -351,6 +830,314 @@ "resolved": "../registry", "link": true }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/is": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", @@ -360,6 +1147,31 @@ "node": ">=4" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -383,10 +1195,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "license": "MIT" + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } }, "node_modules/@types/yargs": { "version": "17.0.35", @@ -403,6 +1219,121 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abbrev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", @@ -412,22 +1343,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -495,22 +1410,14 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=12" } }, "node_modules/asynckit": { @@ -534,21 +1441,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT" - }, "node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -585,15 +1477,6 @@ ], "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -710,6 +1593,16 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cacheable-request": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", @@ -790,11 +1683,22 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } }, "node_modules/chalk": { "version": "2.4.2", @@ -819,6 +1723,16 @@ "node": "*" } }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/cheerio": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", @@ -1128,18 +2042,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -1353,6 +2255,16 @@ "node": ">=0.10.0" } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -1496,16 +2408,6 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/editions": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/editions/-/editions-6.22.0.tgz", @@ -1607,6 +2509,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -1634,6 +2543,48 @@ "node": ">= 0.4" } }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1671,6 +2622,26 @@ "node": ">=4" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/ext-list": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", @@ -1696,12 +2667,6 @@ "node": ">=4" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, "node_modules/extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", @@ -1714,21 +2679,6 @@ "node": ">=0.10.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -1745,12 +2695,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -1906,15 +2850,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -2055,15 +2990,6 @@ "node": ">=6" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -2218,29 +3144,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2359,21 +3262,6 @@ "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "license": "BSD-2-Clause" }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -2566,12 +3454,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, "node_modules/is-whitespace": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", @@ -2603,12 +3485,6 @@ "unfetch": "^5.0.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, "node_modules/isurl": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", @@ -2673,6 +3549,13 @@ "node": ">=14" } }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", @@ -2686,36 +3569,12 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT" - }, "node_modules/json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "license": "MIT" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, "node_modules/json-to-pretty-yaml": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", @@ -2729,21 +3588,6 @@ "node": ">= 0.2.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/keyv": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", @@ -2789,6 +3633,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -2804,6 +3655,16 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -2986,6 +3847,25 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/native-promise-pool": { "version": "3.28.0", "resolved": "https://registry.npmjs.org/native-promise-pool/-/native-promise-pool-3.28.0.tgz", @@ -3089,15 +3969,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3286,17 +4157,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -3349,6 +4238,35 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -3384,18 +4302,6 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "license": "ISC" }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -3415,15 +4321,6 @@ "node": ">=6" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, "node_modules/query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", @@ -3516,52 +4413,6 @@ "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", "license": "MIT" }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3590,6 +4441,48 @@ "node": ">=0.10.0" } }, + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3742,6 +4635,13 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -3823,6 +4723,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -3839,30 +4749,19 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" }, "node_modules/strict-uri-encode": { "version": "1.1.0", @@ -3993,6 +4892,19 @@ "is-natural-number": "^4.0.1" } }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -4050,6 +4962,99 @@ "node": ">=0.10.0" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -4082,19 +5087,6 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -4128,18 +5120,6 @@ "node": ">=10" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/turndown": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", @@ -4149,12 +5129,6 @@ "@mixmark-io/domino": "^2.2.0" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -4207,6 +5181,12 @@ "node": ">=20.18.1" } }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, "node_modules/unfetch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz", @@ -4258,36 +5238,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, "node_modules/version-range": { "version": "4.15.0", "resolved": "https://registry.npmjs.org/version-range/-/version-range-4.15.0.tgz", @@ -4300,6 +5250,223 @@ "url": "https://bevry.me/fund" } }, + "node_modules/vite": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -4367,6 +5534,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", diff --git a/packages/discourse/package.json b/packages/discourse/package.json index 05211651..137a1173 100644 --- a/packages/discourse/package.json +++ b/packages/discourse/package.json @@ -18,10 +18,11 @@ "@polymech/commons": "file:../commons", "@polymech/core": "file:../core", "@polymech/fs": "file:../fs", + "@polymech/log": "file:../log", "@polymech/media": "file:../media", "@polymech/registry": "file:../registry", "@types/markdown-it": "^12.2.3", - "@types/node": "^14.17.5", + "@types/node": "^25.0.3", "@types/yargs": "^17.0.11", "axios": "^0.27.2", "bluebird": "^3.7.2", @@ -86,4 +87,4 @@ "keywords": [ "typescript" ] -} \ No newline at end of file +} diff --git a/packages/discourse/src/_cli.ts b/packages/discourse/src/_cli.ts index 5e136a74..62805226 100644 --- a/packages/discourse/src/_cli.ts +++ b/packages/discourse/src/_cli.ts @@ -1,8 +1,3 @@ -import { sync as exists } from '@polymech/fs/exists' -import { IOptions, IOptionsSync } from './types.js' -import { logger } from './index.js' -import * as path from 'path' - export const defaults = () => { // default command const DefaultCommand = 'info'; @@ -17,58 +12,3 @@ export const defaults = () => { console.error('Unhandled rejection, reason: ', reason); }); } - -export const sanitize = (argv: any): IOptionsSync | IOptions | boolean => { - - let ret: any = { - ...argv - } - - ret.src = argv.src - let srcInfo - let variables = {} - - /* - if (ret.src) { - ret.src = forward_slash(substitute(ret.alt,ret.src,variables)) - // in case a file with a glob pattern is provided, strip the glob - // this is a special case, enabling shared scripts in Alt-Tap Salamand - const glob_base = globBase(ret.src) - const file = ret.src.replace(glob_base.glob, '').replace(/\/$/, '') - - if(exists(file) && isFile(file)){ - ret.src = file - } - - srcInfo = pathInfo(resolve(ret.src, ret.alt, variables)) - - if (srcInfo && srcInfo.FILES && srcInfo.FILES.length) { - ret.srcInfo = srcInfo - for (const key in srcInfo) { - if (Object.prototype.hasOwnProperty.call(srcInfo, key)) { - variables['SRC_' + key] = srcInfo[key]; - } - } - } else { - ret.src = resolve(ret.src, ret.alt, variables) - } - } - */ - - if (argv.cwd) { - ret.cwd = path.resolve(argv.cwd); - if (!exists((ret.cwd))) { - logger.error(`Invalid working directory ${argv.cwd}`) - } - } else { - ret.cwd = process.cwd() - } - - ret = { - ...ret, - variables, - srcInfo - } - - return ret -} \ No newline at end of file diff --git a/packages/discourse/src/cli.ts b/packages/discourse/src/cli.ts new file mode 100644 index 00000000..35dcda2f --- /dev/null +++ b/packages/discourse/src/cli.ts @@ -0,0 +1,4 @@ +import yargs from 'yargs' +import { hideBin } from 'yargs/helpers' + +export const cli = yargs(hideBin(process.argv)) \ No newline at end of file diff --git a/packages/discourse/src/index.ts b/packages/discourse/src/index.ts index 35b158ce..656d33f8 100644 --- a/packages/discourse/src/index.ts +++ b/packages/discourse/src/index.ts @@ -1,19 +1,7 @@ export * from './constants.js' export * from './types.js' export * from './lib/index.js' -export * from './lib/oa/types.js' - -import { logger as _logger } from '@polymech/core/debug' - -import { MODULE_NAME } from './constants' -import { ISettingsParam, Logger, ILogObject } from "tslog" export { Logger } from 'tslog' - -let loggers = {}; -export const logger = _logger(MODULE_NAME) - import { substitute as _substitute, substituteAlt as _substituteAlt } from "@polymech/core/strings" - import { IObjectLiteral } from "@polymech/core" - export const substitute = (alt: boolean, template: string, vars: IObjectLiteral = {}) => alt ? _substituteAlt(template, vars) : _substitute(template, vars) diff --git a/packages/discourse/src/lib/discourse/index.ts b/packages/discourse/src/lib/discourse/index.ts index cf19b5d4..8a50c5af 100644 --- a/packages/discourse/src/lib/discourse/index.ts +++ b/packages/discourse/src/lib/discourse/index.ts @@ -4,9 +4,9 @@ import { CONFIG_DEFAULT } from '@polymech/commons' import { IOSRConfig, IDiscourseConfig } from '@polymech/commons/types' -import { logger as _logger } from '../index.js' +import { createLogger } from '@polymech/log' -export const logger: any = _logger(MODULE_NAME) +const logger = createLogger(MODULE_NAME) import { sync as write } from '@polymech/fs/write' import { sync as read } from '@polymech/fs/write' @@ -758,7 +758,7 @@ export class Discourser { - async upload(userId, file): Promise { + async upload(userId, file): Promise { // fetch whole posts const url = `${this.host}/uploads.json`; @@ -1086,78 +1086,6 @@ export class Discourser { }) } - /* - { - "bio_raw": "about me\n\ntest", - "website": "https://shop.osr-plastic.org", - "location": "Barcelona", - "custom_fields": { - "geo_location": { - "lat": "9.4170689", - "lon": "123.3351935", - "address": "Santander, Cebu, Central Visayas, 6026, Philippines", - "countrycode": "ph", - "city": "Santander", - "state": "Cebu", - "country": "Philippines", - "postalcode": "6026", - "boundingbox": [ - "9.3630227", - "9.491731", - "123.2684005", - "123.3642727" - ], - "type": "administrative" - } - }, - "timezone": "Europe/Berlin", - "default_calendar": "none_selected" - }*/ - /* - fetch("https://forum.osr-plastic.org/u/katharinaelleke.json", { - "headers": { - "content-type": "application/x-www-form-urlencoded; charset=UTF-8", - "discourse-logged-in": "true", - "discourse-present": "true", - "sec-ch-ua": "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Google Chrome\";v=\"114\"", - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": "\"Windows\"", - "x-csrf-token": "0Nau_ylBzR68D5OvfxfOHYii6GI_7gSrr_Ci_9S8ZDjqjy5mavF_O_INAPD8xfCQHgJkDH4rdgS0kPfjMAMBFw", - "x-requested-with": "XMLHttpRequest", - "Referer": "https://forum.osr-plastic.org/u/katharinaelleke/preferences/profile", - "Referrer-Policy": "strict-origin-when-cross-origin" - }, - "body": "bio_raw=Curious%2C+serious+and+not+so+serious+%3Aslight_smile%3A+%0A&website=https%3A%2F%2Fwww.theflipflopi.com%2F&custom_fields%5Bnotify_me_when_followed%5D=false&custom_fields%5Bnotify_followed_user_when_followed%5D=false&custom_fields%5Bnotify_me_when_followed_replies%5D=false&custom_fields%5Bnotify_me_when_followed_creates_topic%5D=false&custom_fields%5Ballow_people_to_follow_me%5D=false&custom_fields%5Bgeo_location%5D%5Blat%5D=-2.294164&custom_fields%5Bgeo_location%5D%5Blon%5D=40.91501&custom_fields%5Bgeo_location%5D%5Baddress%5D=African+Corner%2C+Lamu%2C+Coast%2C+Kenya&custom_fields%5Bgeo_location%5D%5Bcountrycode%5D=ke&custom_fields%5Bgeo_location%5D%5Bcity%5D=&custom_fields%5Bgeo_location%5D%5Bstate%5D=Coast&custom_fields%5Bgeo_location%5D%5Bcountry%5D=Kenya&custom_fields%5Bgeo_location%5D%5Bpostalcode%5D=&custom_fields%5Bgeo_location%5D%5Bboundingbox%5D%5B%5D=-2.294164&custom_fields%5Bgeo_location%5D%5Bboundingbox%5D%5B%5D=-2.294164&custom_fields%5Bgeo_location%5D%5Bboundingbox%5D%5B%5D=40.91501&custom_fields%5Bgeo_location%5D%5Bboundingbox%5D%5B%5D=40.91501&custom_fields%5Bgeo_location%5D%5Btype%5D=&user_fields%5B1%5D=https%3A%2F%2Fshop.osr-plastic.org%2Fafrica%2F&user_fields%5B2%5D=https%3A%2F%2Fwww.theflipflopi.com%2F&user_fields%5B3%5D=https%3A%2F%2Fwww.instagram.com%2Fkatatungo%2F&user_fields%5B4%5D=unknown&user_fields%5B5%5D=unknown&profile_background_upload_url=https%3A%2F%2Fforum.osr-plastic.org%2Fuploads%2Fdefault%2Foriginal%2F2X%2F0%2F0875e1aea65f41172b9c4ad60b1a372cbaa72b2b.jpeg&card_background_upload_url=https%3A%2F%2Fforum.osr-plastic.org%2Fuploads%2Fdefault%2Foriginal%2F2X%2F3%2F357088c493bd0f66e651211853fb18beee2ec2e4.jpeg&timezone=Africa%2FNairobi&default_calendar=none_selected", - "method": "PUT" - }); - - - fetch("https://forum.osr-plastic.org/u/admin-osr.json", { - "headers": { - "accept-language": "en-GB,en-US;q=0.9,en;q=0.8", - "content-type": "application/x-www-form-urlencoded; charset=UTF-8", - "discourse-logged-in": "true", - "discourse-present": "true", - "sec-ch-ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"", - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": "\"Windows\"", - "sec-fetch-dest": "empty", - "sec-fetch-mode": "cors", - "sec-fetch-site": "same-origin", - "x-csrf-token": "gjd-DOi_nULFDhLyUh4igqFZENxL6B4rufR3dfbY9H9Soc-YDwOQS1SYSwJlj6f2f7BpDf5CO9y-zyOPBj-E1Q", - "x-requested-with": "XMLHttpRequest", - "cookie": "_ga=GA1.1.983567986.1691921410; _t=onvQ4UWFfLfjFsFkmebQdDot6JXW8%2FAWgFEtJUZ51AqXbTKnI%2BPF80usnZkhYqyYYW9Q%2B1fuMyEy5bDXc9AJpwwkcVIg%2Fu1DTE39y3nGdpXMiiVsmkMqBkyGA%2FvpvZUrM23CDS0xT%2B09VSSlNUbu8lZY27hYWXio4ETx7DRTmBk0xY52d3R6bcmtofynfxldP5KceF0APNtl9AV6iUhWloQ32CK6PmzpSFq4E3hstsS1WPTf7SwLGvESWm4tn3M4EQ2v4RHuLiHaAj%2F0--mv8Byxo5aHGcgKPO--%2F9eiy%2B24FCNmiLF3%2FpGZag%3D%3D; _ga_GVR8PEPG6C=GS1.1.1691940751.2.1.1691940775.0.0.0; _forum_session=bLbNekWpq6fkdK%2B19Nw6ZoKeEk9Ijp8LPfmQAjBiGK0TcnIYzMhZ5LJmLrxmG39e85SgUz%2F7NMI3NXZM9j%2F35eJuO3hxnUAkFvBNwjwwS9LGhDB4kB3ebAjjcBpoLPzUMWqyslQuR9RM8JcjZ%2FfX%2FWw0E61l9jhfrG0dr8Ds97IW7XedjKCmI7x7xinv10R2bRb51%2F72t2Z4dVG86wyCAtI5Spom0yjHoWPHwWBZ7VPYtOCmSBVygusuF%2FW5hpO9wgn1oqc0ZZ%2BXj%2FPiFc0FsADEcKYh3Q%3D%3D--xdEsXmADtTKkFGSc--x%2Fd9m02lRNk0uH%2BPxZTNwQ%3D%3D", - "Referer": "https://forum.osr-plastic.org/u/admin-osr/preferences/profile", - "Referrer-Policy": "strict-origin-when-cross-origin" - }, - "body": "bio_raw=%23%23+Test%0A%0A%60%60%60js%0Aconst+t+%3D+0%0A%60%60%60%0A%0A%5Btest%5D(www.test.com)%0A%0A&website=www.test-site.com&location=test-loc&profile_background_upload_url=https%3A%2F%2Fforum.osr-plastic.org%2Fuploads%2Fdefault%2Foriginal%2F2X%2Fd%2Fd097423e34a6c677cdb0933d091fb84bcfbcec2e.jpeg&card_background_upload_url=https%3A%2F%2Fforum.osr-plastic.org%2Fuploads%2Fdefault%2Foriginal%2F2X%2Fb%2Fb4c30d1b981964fd6f936ebaac0f86ad4dc01209.png&timezone=Europe%2FBerlin&default_calendar=none_selected", - "method": "PUT" -}); - - - */ - - } diff --git a/packages/discourse/src/lib/markdown/Pattern.ts b/packages/discourse/src/lib/markdown/Pattern.ts index a1bfc465..4ca4fd0f 100644 --- a/packages/discourse/src/lib/markdown/Pattern.ts +++ b/packages/discourse/src/lib/markdown/Pattern.ts @@ -1,4 +1,4 @@ -import { RegExCallback } from './types' +import { RegExCallback } from './types.js' export class Pattern { regex: RegExp; replacement: RegExCallback diff --git a/packages/discourse/src/lib/markdown/Rule.ts b/packages/discourse/src/lib/markdown/Rule.ts index 73c296cc..10e00541 100644 --- a/packages/discourse/src/lib/markdown/Rule.ts +++ b/packages/discourse/src/lib/markdown/Rule.ts @@ -1,4 +1,4 @@ -import { Pattern } from './Pattern'; +import { Pattern } from './Pattern.js'; export class Rule { name: string; diff --git a/packages/discourse/src/lib/markdown/index.ts b/packages/discourse/src/lib/markdown/index.ts index 02014e13..da282178 100644 --- a/packages/discourse/src/lib/markdown/index.ts +++ b/packages/discourse/src/lib/markdown/index.ts @@ -1,14 +1,12 @@ -import { Rule } from './Rule' -import { Pattern } from './Pattern' +import { Rule } from './Rule.js' +import { Pattern } from './Pattern.js' -import { RMarkOptions } from './types' +import { RMarkOptions } from './types.js' export const RE_IMAGES: RegExp = /\!\[([^\]]+)\]\((\S+)\)/g export const RE_LINKS: RegExp = /\[([^\n]+)\]\(([^\n]+)\)/g -import * as markdown from 'markdown-it' -import Token from "markdown-it/lib/token" -import Renderer from "markdown-it/lib/renderer" +import markdown from 'markdown-it' const defaultRules: Rule[] = [ new Rule('header', [ @@ -88,8 +86,8 @@ export class RMark { } } -export { Rule } from './Rule'; -export { Pattern } from './Pattern'; +export { Rule } from './Rule.js'; +export { Pattern } from './Pattern.js'; // export const find = (content:string, reg:RegExp) => content.match(reg) @@ -100,7 +98,7 @@ export const toHTML = (content) => { const md = new markdown({ html: true, - breaks:true + breaks: true }) return md.render(content) diff --git a/packages/discourse/src/main.ts b/packages/discourse/src/main.ts index 5d757bef..05921708 100644 --- a/packages/discourse/src/main.ts +++ b/packages/discourse/src/main.ts @@ -1,17 +1,7 @@ #!/usr/bin/env node process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; - -import { defaults } from './_cli'; defaults(); -import * as cli from 'yargs'; -import { register as registerInfo } from './commands/info.js'; registerInfo(cli) -import { register as registerQuery } from './commands/query.js'; registerQuery(cli) - -import { register as registerOAImport } from './commands/import-oa-users.js'; registerOAImport(cli) -import { register as registerOAImportHowtos } from './commands/import-oa-howtos.js'; registerOAImportHowtos(cli) - -import { register as registerSync } from './commands/sync-file.js'; registerSync(cli) -import { register as registerSyncComponent } from './commands/sync-component.js'; registerSyncComponent(cli) - +import { defaults } from './_cli.js'; defaults(); +import { cli } from './cli.js' const argv: any = cli.argv; if (argv.help) { diff --git a/packages/discourse/tests/commons.ts b/packages/discourse/tests/commons.ts new file mode 100644 index 00000000..972eaa52 --- /dev/null +++ b/packages/discourse/tests/commons.ts @@ -0,0 +1,17 @@ +process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; +import { Discourser } from '../src/lib/discourse/index.js' +import { IDiscourseConfig } from '@polymech/commons/types' + +export const getDiscourseConfig = (): IDiscourseConfig => { + return { + host: process.env.DISCOURSE_HOST || 'https://forum.polymech.info', + key: process.env.DISCOURSE_API_KEY || 'e8b4adf4770b85cf94ea5e0aacb517ad25ddeb338efa3946559c06c2cdbab2e8', + username: process.env.DISCOURSE_USERNAME || 'jerom', + rateLimitConcurrency: 1 + } +} + +export const getClient = () => { + const config = getDiscourseConfig() + return new Discourser(config) +} diff --git a/packages/discourse/tests/posts.test.ts b/packages/discourse/tests/posts.test.ts new file mode 100644 index 00000000..4c181852 --- /dev/null +++ b/packages/discourse/tests/posts.test.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from 'vitest' +import { getClient } from './commons.js' + +describe('Discourse Posts', () => { + const client = getClient() + + it('should fetch posts', async () => { + try { + const posts = await client.getPostItems() + expect(posts).toBeDefined() + expect(Array.isArray(posts)).toBe(true) + } catch (e) { + console.warn('Skipping test due to connection error or config', e) + } + }) +}) diff --git a/packages/discourse/tests/topics.test.ts b/packages/discourse/tests/topics.test.ts new file mode 100644 index 00000000..5a042553 --- /dev/null +++ b/packages/discourse/tests/topics.test.ts @@ -0,0 +1,36 @@ +import { describe, it, expect } from 'vitest' +import { getClient } from './commons.js' + +describe('Discourse Topics', () => { + const client = getClient() + + it('should fetch latest topics', async () => { + try { + const topics = await client.getTopicItems() + expect(topics).toBeDefined() + expect(Array.isArray(topics)).toBe(true) + if (topics.length > 0) { + expect(topics[0].id).toBeDefined() + } + } catch (e) { + console.warn('Skipping test due to connection error or config', e) + } + }) + + it('should fetch a specific topic', async () => { + try { + // we need a valid ID, assume we have one from the previous list or a known one + const topics = await client.getTopicItems({ page: 0 }) + if (topics && topics.length > 0) { + const topicId = topics[0].id + const topic = await client.getTopic(topicId) + expect(topic).toBeDefined() + expect(topic.id).toBe(topicId) + } else { + console.warn('No topics found to test getTopic') + } + } catch (e) { + console.warn('Skipping test due to connection error or config', e) + } + }, 15000) +}) diff --git a/packages/discourse/tests/users.test.ts b/packages/discourse/tests/users.test.ts new file mode 100644 index 00000000..56cade6f --- /dev/null +++ b/packages/discourse/tests/users.test.ts @@ -0,0 +1,28 @@ +import { describe, it, expect } from 'vitest' +import { getClient } from './commons.js' + +describe('Discourse Users', () => { + const client = getClient() + + it('should fetch active users', async () => { + try { + const users = await client.getUsers(0) + expect(users).toBeDefined() + // Depending on response structure, checking properties + // expect(users).toHaveProperty('users') + } catch (e) { + console.warn('Skipping test due to connection error or config', e) + } + }) + + it('should fetch a specific user by username', async () => { + try { + const username = 'system' + const user = await client.getUserByUsername(username) + expect(user).toBeDefined() + expect(user.username.toLowerCase()).toBe(username) + } catch (e) { + console.warn('Skipping test due to connection error or config', e) + } + }) +}) diff --git a/packages/discourse/tsconfig.json b/packages/discourse/tsconfig.json index b3b9584d..044600b2 100644 --- a/packages/discourse/tsconfig.json +++ b/packages/discourse/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../typescript-config/base.json", "include": [ - "src/**/*.ts" + "src/**/*.ts", + "tests/**/*.ts" ], "files": [ "src/index.ts"