From 36f46ca29294d15059d8abd3b919eef7cbfd6612 Mon Sep 17 00:00:00 2001
From: babayaga
Date: Tue, 30 Dec 2025 20:21:59 +0100
Subject: [PATCH] discourse 2/3
---
packages/discourse-legacy/.gitignore | 5 +
packages/discourse-legacy/.npmignore | 4 +
packages/discourse-legacy/README.md | 161 +
packages/discourse-legacy/dist/_cli.d.ts | 3 +
packages/discourse-legacy/dist/_cli.js | 66 +
packages/discourse-legacy/dist/_cli.js.map | 1 +
.../dist/commands/import-oa-howtos.d.ts | 2 +
.../dist/commands/import-oa-howtos.js | 49 +
.../dist/commands/import-oa-howtos.js.map | 1 +
.../dist/commands/import-oa-users.d.ts | 2 +
.../dist/commands/import-oa-users.js | 84 +
.../dist/commands/import-oa-users.js.map | 1 +
.../discourse-legacy/dist/commands/info.d.ts | 2 +
.../discourse-legacy/dist/commands/info.js | 23 +
.../dist/commands/info.js.map | 1 +
.../discourse-legacy/dist/commands/query.d.ts | 2 +
.../discourse-legacy/dist/commands/query.js | 52 +
.../dist/commands/query.js.map | 1 +
.../dist/commands/sync-component.d.ts | 4 +
.../dist/commands/sync-component.js | 119 +
.../dist/commands/sync-component.js.map | 1 +
.../dist/commands/sync-directory.d.ts | 4 +
.../dist/commands/sync-directory.js | 118 +
.../dist/commands/sync-directory.js.map | 1 +
.../dist/commands/sync-file.d.ts | 2 +
.../dist/commands/sync-file.js | 51 +
.../dist/commands/sync-file.js.map | 1 +
packages/discourse-legacy/dist/constants.d.ts | 1 +
packages/discourse-legacy/dist/constants.js | 2 +
.../discourse-legacy/dist/constants.js.map | 1 +
packages/discourse-legacy/dist/index.d.ts | 8 +
packages/discourse-legacy/dist/index.js | 70 +
packages/discourse-legacy/dist/index.js.map | 1 +
.../dist/lib/discourse/cache.d.ts | 9 +
.../dist/lib/discourse/cache.js | 112 +
.../dist/lib/discourse/cache.js.map | 1 +
.../dist/lib/discourse/constants.d.ts | 70 +
.../dist/lib/discourse/constants.js | 94 +
.../dist/lib/discourse/constants.js.map | 1 +
.../dist/lib/discourse/index.d.ts | 181 +
.../dist/lib/discourse/index.js | 935 ++++
.../dist/lib/discourse/index.js.map | 1 +
.../dist/lib/discourse/types.d.ts | 697 +++
.../dist/lib/discourse/types.js | 4 +
.../dist/lib/discourse/types.js.map | 1 +
.../discourse-legacy/dist/lib/git/index.d.ts | 5 +
.../discourse-legacy/dist/lib/git/index.js | 34 +
.../dist/lib/git/index.js.map | 1 +
packages/discourse-legacy/dist/lib/index.d.ts | 2 +
packages/discourse-legacy/dist/lib/index.js | 3 +
.../discourse-legacy/dist/lib/index.js.map | 1 +
.../dist/lib/markdown/Pattern.d.ts | 7 +
.../dist/lib/markdown/Pattern.js | 12 +
.../dist/lib/markdown/Pattern.js.map | 1 +
.../dist/lib/markdown/Rule.d.ts | 7 +
.../dist/lib/markdown/Rule.js | 12 +
.../dist/lib/markdown/Rule.js.map | 1 +
.../dist/lib/markdown/index.d.ts | 14 +
.../dist/lib/markdown/index.js | 98 +
.../dist/lib/markdown/index.js.map | 1 +
.../dist/lib/markdown/index.test.d.ts | 1 +
.../dist/lib/markdown/index.test.js | 112 +
.../dist/lib/markdown/index.test.js.map | 1 +
.../dist/lib/markdown/page.d.ts | 1 +
.../dist/lib/markdown/page.js | 26 +
.../dist/lib/markdown/page.js.map | 1 +
.../dist/lib/markdown/types.d.ts | 5 +
.../dist/lib/markdown/types.js | 2 +
.../dist/lib/markdown/types.js.map | 1 +
.../discourse-legacy/dist/lib/oa/commons.d.ts | 27 +
.../discourse-legacy/dist/lib/oa/commons.js | 88 +
.../dist/lib/oa/commons.js.map | 1 +
.../discourse-legacy/dist/lib/oa/howtos.d.ts | 9 +
.../discourse-legacy/dist/lib/oa/howtos.js | 464 ++
.../dist/lib/oa/howtos.js.map | 1 +
.../discourse-legacy/dist/lib/oa/index.d.ts | 3 +
.../discourse-legacy/dist/lib/oa/index.js | 4 +
.../discourse-legacy/dist/lib/oa/index.js.map | 1 +
.../discourse-legacy/dist/lib/oa/lib.d.ts | 3 +
packages/discourse-legacy/dist/lib/oa/lib.js | 191 +
.../discourse-legacy/dist/lib/oa/lib.js.map | 1 +
.../discourse-legacy/dist/lib/oa/types.d.ts | 91 +
.../discourse-legacy/dist/lib/oa/types.js | 2 +
.../discourse-legacy/dist/lib/oa/types.js.map | 1 +
.../discourse-legacy/dist/lib/oa/users.d.ts | 29 +
.../discourse-legacy/dist/lib/oa/users.js | 906 ++++
.../discourse-legacy/dist/lib/oa/users.js.map | 1 +
.../discourse-legacy/dist/lib/oa/utils.d.ts | 25 +
.../discourse-legacy/dist/lib/oa/utils.js | 150 +
.../discourse-legacy/dist/lib/oa/utils.js.map | 1 +
.../discourse-legacy/dist/lib/osr/index.d.ts | 1 +
.../discourse-legacy/dist/lib/osr/index.js | 2 +
.../dist/lib/osr/index.js.map | 1 +
.../discourse-legacy/dist/lib/osr/urls.d.ts | 1 +
.../discourse-legacy/dist/lib/osr/urls.js | 2 +
.../discourse-legacy/dist/lib/osr/urls.js.map | 1 +
.../dist/lib/sync/commons.d.ts | 11 +
.../discourse-legacy/dist/lib/sync/commons.js | 164 +
.../dist/lib/sync/commons.js.map | 1 +
.../dist/lib/sync/component.d.ts | 4 +
.../dist/lib/sync/component.js | 366 ++
.../dist/lib/sync/component.js.map | 1 +
.../dist/lib/sync/directory.d.ts | 4 +
.../dist/lib/sync/directory.js | 313 ++
.../dist/lib/sync/directory.js.map | 1 +
.../dist/lib/sync/download.d.ts | 5 +
.../dist/lib/sync/download.js | 40 +
.../dist/lib/sync/download.js.map | 1 +
.../discourse-legacy/dist/lib/sync/file.d.ts | 4 +
.../discourse-legacy/dist/lib/sync/file.js | 246 +
.../dist/lib/sync/file.js.map | 1 +
.../discourse-legacy/dist/lib/sync/index.js | 29 +
.../dist/lib/sync/index.js.map | 1 +
.../discourse-legacy/dist/lib/sync/osrl.d.ts | 3 +
.../discourse-legacy/dist/lib/sync/osrl.js | 70 +
.../dist/lib/sync/osrl.js.map | 1 +
packages/discourse-legacy/dist/main.d.ts | 2 +
packages/discourse-legacy/dist/main.js | 26 +
packages/discourse-legacy/dist/main.js.map | 1 +
packages/discourse-legacy/dist/options.d.ts | 2 +
packages/discourse-legacy/dist/options.js | 21 +
packages/discourse-legacy/dist/options.js.map | 1 +
packages/discourse-legacy/dist/types.d.ts | 158 +
packages/discourse-legacy/dist/types.js | 38 +
packages/discourse-legacy/dist/types.js.map | 1 +
packages/discourse-legacy/docs/data.md | 22 +
packages/discourse-legacy/index.md | 146 +
packages/discourse-legacy/package-lock.json | 4606 +++++++++++++++++
packages/discourse-legacy/package.json | 85 +
packages/discourse-legacy/src/_cli.ts | 81 +
.../src/commands/import-oa-howtos.ts | 0
.../src/commands/import-oa-users.ts | 0
.../src/commands/info.ts | 0
.../src/commands/query.ts | 0
.../src/commands/sync-component.ts | 0
.../src/commands/sync-directory.ts | 0
.../src/commands/sync-file.ts | 0
packages/discourse-legacy/src/constants.ts | 1 +
packages/discourse-legacy/src/index.ts | 19 +
.../src/lib/discourse/cache.ts | 192 +
.../src/lib/discourse/constants.ts | 119 +
.../src/lib/discourse/index.ts | 1295 +++++
.../src/lib/discourse/types.ts | 761 +++
.../src/lib/git/index.ts | 0
packages/discourse-legacy/src/lib/index.ts | 3 +
.../src/lib/markdown/Pattern.ts | 13 +
.../discourse-legacy/src/lib/markdown/Rule.ts | 17 +
.../src/lib/markdown/index.test.ts | 144 +
.../src/lib/markdown/index.ts | 125 +
.../discourse-legacy/src/lib/markdown/page.ts | 28 +
.../src/lib/markdown/types.ts | 6 +
.../src/lib/oa/commons.ts | 0
.../src/lib/oa/howtos.ts | 0
.../src/lib/oa/index.ts | 0
.../src/lib/oa/lib.ts | 0
.../src/lib/oa/types.ts | 0
.../src/lib/oa/users.ts | 0
.../src/lib/oa/utils.ts | 0
.../src/lib/osr/index.ts | 0
.../src/lib/osr/urls.ts | 0
.../src/lib/sync/commons.ts | 0
.../src/lib/sync/component.ts | 0
.../src/lib/sync/directory.ts | 0
.../src/lib/sync/download.ts | 0
.../src/lib/sync/file.ts | 0
.../src/lib/sync/index.ts | 0
.../src/lib/sync/osrl.ts | 0
packages/discourse-legacy/src/main.ts | 22 +
packages/discourse-legacy/src/options.ts | 28 +
packages/discourse-legacy/src/types.ts | 205 +
.../templates/discourse/machines/debug.osr | 6 +
.../templates/discourse/machines/global.json | 33 +
.../discourse/machines/header_jekyll.osr | 95 +
.../discourse/machines/plugins/html.js | 50 +
.../templates/discourse/machines/root.html | 54 +
.../discourse/machines/variables.osr | 56 +
.../discourse/machines/widgets/authors.osr | 10 +
.../machines/widgets/authors_html.osr | 8 +
.../machines/widgets/extra_resources.md | 0
.../discourse/machines/widgets/forum.osr | 25 +
.../discourse/machines/widgets/gallery.osr | 10 +
.../discourse/machines/widgets/howtos.osr | 12 +
.../machines/widgets/other_products.osr | 25 +
.../machines/widgets/overview_drawings.osr | 27 +
.../discourse/machines/widgets/parts.osr | 7 +
.../discourse/machines/widgets/resources.osr | 45 +
.../discourse/machines/widgets/showreel.osr | 7 +
.../machines/widgets/social_links.osr | 38 +
.../discourse/machines/widgets/specs.osr | 18 +
.../discourse/machines/widgets/table.osr | 16 +
packages/discourse-legacy/tsconfig.json | 16 +
packages/discourse/dist/_cli.d.ts | 3 +
packages/discourse/dist/_cli.js | 65 +
packages/discourse/dist/_cli.js.map | 1 +
.../dist/commands/import-oa-howtos.d.ts | 2 +
.../dist/commands/import-oa-howtos.js | 49 +
.../dist/commands/import-oa-howtos.js.map | 1 +
.../dist/commands/import-oa-users.d.ts | 2 +
.../dist/commands/import-oa-users.js | 84 +
.../dist/commands/import-oa-users.js.map | 1 +
packages/discourse/dist/commands/info.d.ts | 2 +
packages/discourse/dist/commands/info.js | 23 +
packages/discourse/dist/commands/info.js.map | 1 +
packages/discourse/dist/commands/query.d.ts | 2 +
packages/discourse/dist/commands/query.js | 52 +
packages/discourse/dist/commands/query.js.map | 1 +
.../dist/commands/sync-component.d.ts | 4 +
.../discourse/dist/commands/sync-component.js | 119 +
.../dist/commands/sync-component.js.map | 1 +
.../dist/commands/sync-directory.d.ts | 4 +
.../discourse/dist/commands/sync-directory.js | 118 +
.../dist/commands/sync-directory.js.map | 1 +
.../discourse/dist/commands/sync-file.d.ts | 2 +
packages/discourse/dist/commands/sync-file.js | 51 +
.../discourse/dist/commands/sync-file.js.map | 1 +
packages/discourse/dist/constants.d.ts | 1 +
packages/discourse/dist/constants.js | 2 +
packages/discourse/dist/constants.js.map | 1 +
packages/discourse/dist/index.d.ts | 8 +
packages/discourse/dist/index.js | 12 +
packages/discourse/dist/index.js.map | 1 +
.../discourse/dist/lib/discourse/cache.d.ts | 10 +
.../discourse/dist/lib/discourse/cache.js | 110 +
.../discourse/dist/lib/discourse/cache.js.map | 1 +
.../dist/lib/discourse/constants.d.ts | 70 +
.../discourse/dist/lib/discourse/constants.js | 94 +
.../dist/lib/discourse/constants.js.map | 1 +
.../discourse/dist/lib/discourse/index.d.ts | 181 +
.../discourse/dist/lib/discourse/index.js | 831 +++
.../discourse/dist/lib/discourse/index.js.map | 1 +
.../discourse/dist/lib/discourse/types.d.ts | 697 +++
.../discourse/dist/lib/discourse/types.js | 4 +
.../discourse/dist/lib/discourse/types.js.map | 1 +
packages/discourse/dist/lib/git/index.d.ts | 5 +
packages/discourse/dist/lib/git/index.js | 34 +
packages/discourse/dist/lib/git/index.js.map | 1 +
packages/discourse/dist/lib/index.d.ts | 2 +
packages/discourse/dist/lib/index.js | 3 +
packages/discourse/dist/lib/index.js.map | 1 +
.../discourse/dist/lib/markdown/Pattern.d.ts | 7 +
.../discourse/dist/lib/markdown/Pattern.js | 12 +
.../dist/lib/markdown/Pattern.js.map | 1 +
.../discourse/dist/lib/markdown/Rule.d.ts | 7 +
packages/discourse/dist/lib/markdown/Rule.js | 12 +
.../discourse/dist/lib/markdown/Rule.js.map | 1 +
.../discourse/dist/lib/markdown/index.d.ts | 14 +
packages/discourse/dist/lib/markdown/index.js | 98 +
.../discourse/dist/lib/markdown/index.js.map | 1 +
.../dist/lib/markdown/index.test.d.ts | 1 +
.../discourse/dist/lib/markdown/index.test.js | 112 +
.../dist/lib/markdown/index.test.js.map | 1 +
.../discourse/dist/lib/markdown/page.d.ts | 1 +
packages/discourse/dist/lib/markdown/page.js | 26 +
.../discourse/dist/lib/markdown/page.js.map | 1 +
.../discourse/dist/lib/markdown/types.d.ts | 5 +
packages/discourse/dist/lib/markdown/types.js | 2 +
.../discourse/dist/lib/markdown/types.js.map | 1 +
packages/discourse/dist/lib/oa/commons.d.ts | 27 +
packages/discourse/dist/lib/oa/commons.js | 88 +
packages/discourse/dist/lib/oa/commons.js.map | 1 +
packages/discourse/dist/lib/oa/howtos.d.ts | 9 +
packages/discourse/dist/lib/oa/howtos.js | 464 ++
packages/discourse/dist/lib/oa/howtos.js.map | 1 +
packages/discourse/dist/lib/oa/index.d.ts | 3 +
packages/discourse/dist/lib/oa/index.js | 4 +
packages/discourse/dist/lib/oa/index.js.map | 1 +
packages/discourse/dist/lib/oa/lib.d.ts | 3 +
packages/discourse/dist/lib/oa/lib.js | 191 +
packages/discourse/dist/lib/oa/lib.js.map | 1 +
packages/discourse/dist/lib/oa/types.d.ts | 91 +
packages/discourse/dist/lib/oa/types.js | 2 +
packages/discourse/dist/lib/oa/types.js.map | 1 +
packages/discourse/dist/lib/oa/users.d.ts | 29 +
packages/discourse/dist/lib/oa/users.js | 906 ++++
packages/discourse/dist/lib/oa/users.js.map | 1 +
packages/discourse/dist/lib/oa/utils.d.ts | 25 +
packages/discourse/dist/lib/oa/utils.js | 150 +
packages/discourse/dist/lib/oa/utils.js.map | 1 +
packages/discourse/dist/lib/osr/index.d.ts | 1 +
packages/discourse/dist/lib/osr/index.js | 2 +
packages/discourse/dist/lib/osr/index.js.map | 1 +
packages/discourse/dist/lib/osr/urls.d.ts | 1 +
packages/discourse/dist/lib/osr/urls.js | 2 +
packages/discourse/dist/lib/osr/urls.js.map | 1 +
packages/discourse/dist/lib/sync/commons.d.ts | 11 +
packages/discourse/dist/lib/sync/commons.js | 164 +
.../discourse/dist/lib/sync/commons.js.map | 1 +
.../discourse/dist/lib/sync/component.d.ts | 4 +
packages/discourse/dist/lib/sync/component.js | 366 ++
.../discourse/dist/lib/sync/component.js.map | 1 +
.../discourse/dist/lib/sync/directory.d.ts | 4 +
packages/discourse/dist/lib/sync/directory.js | 313 ++
.../discourse/dist/lib/sync/directory.js.map | 1 +
.../discourse/dist/lib/sync/download.d.ts | 5 +
packages/discourse/dist/lib/sync/download.js | 40 +
.../discourse/dist/lib/sync/download.js.map | 1 +
packages/discourse/dist/lib/sync/file.d.ts | 4 +
packages/discourse/dist/lib/sync/file.js | 246 +
packages/discourse/dist/lib/sync/file.js.map | 1 +
packages/discourse/dist/lib/sync/index.js | 29 +
packages/discourse/dist/lib/sync/index.js.map | 1 +
packages/discourse/dist/lib/sync/osrl.d.ts | 3 +
packages/discourse/dist/lib/sync/osrl.js | 70 +
packages/discourse/dist/lib/sync/osrl.js.map | 1 +
packages/discourse/dist/main.d.ts | 2 +
packages/discourse/dist/main.js | 26 +
packages/discourse/dist/main.js.map | 1 +
packages/discourse/dist/options.d.ts | 3 +
packages/discourse/dist/options.js | 21 +
packages/discourse/dist/options.js.map | 1 +
packages/discourse/dist/types.d.ts | 157 +
packages/discourse/dist/types.js | 38 +
packages/discourse/dist/types.js.map | 1 +
packages/discourse/package.json | 10 +-
packages/discourse/src/_cli.ts | 11 +-
packages/discourse/src/lib/discourse/cache.ts | 38 +-
packages/discourse/src/lib/discourse/index.ts | 188 +-
packages/discourse/src/lib/index.ts | 4 +-
318 files changed, 21841 insertions(+), 196 deletions(-)
create mode 100644 packages/discourse-legacy/.gitignore
create mode 100644 packages/discourse-legacy/.npmignore
create mode 100644 packages/discourse-legacy/README.md
create mode 100644 packages/discourse-legacy/dist/_cli.d.ts
create mode 100644 packages/discourse-legacy/dist/_cli.js
create mode 100644 packages/discourse-legacy/dist/_cli.js.map
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-howtos.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-howtos.js
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-howtos.js.map
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-users.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-users.js
create mode 100644 packages/discourse-legacy/dist/commands/import-oa-users.js.map
create mode 100644 packages/discourse-legacy/dist/commands/info.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/info.js
create mode 100644 packages/discourse-legacy/dist/commands/info.js.map
create mode 100644 packages/discourse-legacy/dist/commands/query.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/query.js
create mode 100644 packages/discourse-legacy/dist/commands/query.js.map
create mode 100644 packages/discourse-legacy/dist/commands/sync-component.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/sync-component.js
create mode 100644 packages/discourse-legacy/dist/commands/sync-component.js.map
create mode 100644 packages/discourse-legacy/dist/commands/sync-directory.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/sync-directory.js
create mode 100644 packages/discourse-legacy/dist/commands/sync-directory.js.map
create mode 100644 packages/discourse-legacy/dist/commands/sync-file.d.ts
create mode 100644 packages/discourse-legacy/dist/commands/sync-file.js
create mode 100644 packages/discourse-legacy/dist/commands/sync-file.js.map
create mode 100644 packages/discourse-legacy/dist/constants.d.ts
create mode 100644 packages/discourse-legacy/dist/constants.js
create mode 100644 packages/discourse-legacy/dist/constants.js.map
create mode 100644 packages/discourse-legacy/dist/index.d.ts
create mode 100644 packages/discourse-legacy/dist/index.js
create mode 100644 packages/discourse-legacy/dist/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/discourse/cache.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/discourse/cache.js
create mode 100644 packages/discourse-legacy/dist/lib/discourse/cache.js.map
create mode 100644 packages/discourse-legacy/dist/lib/discourse/constants.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/discourse/constants.js
create mode 100644 packages/discourse-legacy/dist/lib/discourse/constants.js.map
create mode 100644 packages/discourse-legacy/dist/lib/discourse/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/discourse/index.js
create mode 100644 packages/discourse-legacy/dist/lib/discourse/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/discourse/types.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/discourse/types.js
create mode 100644 packages/discourse-legacy/dist/lib/discourse/types.js.map
create mode 100644 packages/discourse-legacy/dist/lib/git/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/git/index.js
create mode 100644 packages/discourse-legacy/dist/lib/git/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/index.js
create mode 100644 packages/discourse-legacy/dist/lib/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Pattern.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Pattern.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Pattern.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Rule.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Rule.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/Rule.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.test.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.test.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/index.test.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/page.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/page.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/page.js.map
create mode 100644 packages/discourse-legacy/dist/lib/markdown/types.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/markdown/types.js
create mode 100644 packages/discourse-legacy/dist/lib/markdown/types.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/commons.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/commons.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/commons.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/howtos.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/howtos.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/howtos.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/index.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/lib.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/lib.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/lib.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/types.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/types.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/types.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/users.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/users.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/users.js.map
create mode 100644 packages/discourse-legacy/dist/lib/oa/utils.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/oa/utils.js
create mode 100644 packages/discourse-legacy/dist/lib/oa/utils.js.map
create mode 100644 packages/discourse-legacy/dist/lib/osr/index.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/osr/index.js
create mode 100644 packages/discourse-legacy/dist/lib/osr/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/osr/urls.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/osr/urls.js
create mode 100644 packages/discourse-legacy/dist/lib/osr/urls.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/commons.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/commons.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/commons.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/component.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/component.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/component.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/directory.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/directory.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/directory.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/download.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/download.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/download.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/file.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/file.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/file.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/index.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/index.js.map
create mode 100644 packages/discourse-legacy/dist/lib/sync/osrl.d.ts
create mode 100644 packages/discourse-legacy/dist/lib/sync/osrl.js
create mode 100644 packages/discourse-legacy/dist/lib/sync/osrl.js.map
create mode 100644 packages/discourse-legacy/dist/main.d.ts
create mode 100644 packages/discourse-legacy/dist/main.js
create mode 100644 packages/discourse-legacy/dist/main.js.map
create mode 100644 packages/discourse-legacy/dist/options.d.ts
create mode 100644 packages/discourse-legacy/dist/options.js
create mode 100644 packages/discourse-legacy/dist/options.js.map
create mode 100644 packages/discourse-legacy/dist/types.d.ts
create mode 100644 packages/discourse-legacy/dist/types.js
create mode 100644 packages/discourse-legacy/dist/types.js.map
create mode 100644 packages/discourse-legacy/docs/data.md
create mode 100644 packages/discourse-legacy/index.md
create mode 100644 packages/discourse-legacy/package-lock.json
create mode 100644 packages/discourse-legacy/package.json
create mode 100644 packages/discourse-legacy/src/_cli.ts
rename packages/{discourse => discourse-legacy}/src/commands/import-oa-howtos.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/import-oa-users.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/info.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/query.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/sync-component.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/sync-directory.ts (100%)
rename packages/{discourse => discourse-legacy}/src/commands/sync-file.ts (100%)
create mode 100644 packages/discourse-legacy/src/constants.ts
create mode 100644 packages/discourse-legacy/src/index.ts
create mode 100644 packages/discourse-legacy/src/lib/discourse/cache.ts
create mode 100644 packages/discourse-legacy/src/lib/discourse/constants.ts
create mode 100644 packages/discourse-legacy/src/lib/discourse/index.ts
create mode 100644 packages/discourse-legacy/src/lib/discourse/types.ts
rename packages/{discourse => discourse-legacy}/src/lib/git/index.ts (100%)
create mode 100644 packages/discourse-legacy/src/lib/index.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/Pattern.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/Rule.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/index.test.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/index.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/page.ts
create mode 100644 packages/discourse-legacy/src/lib/markdown/types.ts
rename packages/{discourse => discourse-legacy}/src/lib/oa/commons.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/howtos.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/index.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/lib.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/types.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/users.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/oa/utils.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/osr/index.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/osr/urls.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/commons.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/component.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/directory.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/download.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/file.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/index.ts (100%)
rename packages/{discourse => discourse-legacy}/src/lib/sync/osrl.ts (100%)
create mode 100644 packages/discourse-legacy/src/main.ts
create mode 100644 packages/discourse-legacy/src/options.ts
create mode 100644 packages/discourse-legacy/src/types.ts
create mode 100644 packages/discourse-legacy/templates/discourse/machines/debug.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/global.json
create mode 100644 packages/discourse-legacy/templates/discourse/machines/header_jekyll.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/plugins/html.js
create mode 100644 packages/discourse-legacy/templates/discourse/machines/root.html
create mode 100644 packages/discourse-legacy/templates/discourse/machines/variables.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/authors.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/authors_html.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/extra_resources.md
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/forum.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/gallery.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/howtos.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/other_products.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/overview_drawings.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/parts.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/resources.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/showreel.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/social_links.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/specs.osr
create mode 100644 packages/discourse-legacy/templates/discourse/machines/widgets/table.osr
create mode 100644 packages/discourse-legacy/tsconfig.json
create mode 100644 packages/discourse/dist/_cli.d.ts
create mode 100644 packages/discourse/dist/_cli.js
create mode 100644 packages/discourse/dist/_cli.js.map
create mode 100644 packages/discourse/dist/commands/import-oa-howtos.d.ts
create mode 100644 packages/discourse/dist/commands/import-oa-howtos.js
create mode 100644 packages/discourse/dist/commands/import-oa-howtos.js.map
create mode 100644 packages/discourse/dist/commands/import-oa-users.d.ts
create mode 100644 packages/discourse/dist/commands/import-oa-users.js
create mode 100644 packages/discourse/dist/commands/import-oa-users.js.map
create mode 100644 packages/discourse/dist/commands/info.d.ts
create mode 100644 packages/discourse/dist/commands/info.js
create mode 100644 packages/discourse/dist/commands/info.js.map
create mode 100644 packages/discourse/dist/commands/query.d.ts
create mode 100644 packages/discourse/dist/commands/query.js
create mode 100644 packages/discourse/dist/commands/query.js.map
create mode 100644 packages/discourse/dist/commands/sync-component.d.ts
create mode 100644 packages/discourse/dist/commands/sync-component.js
create mode 100644 packages/discourse/dist/commands/sync-component.js.map
create mode 100644 packages/discourse/dist/commands/sync-directory.d.ts
create mode 100644 packages/discourse/dist/commands/sync-directory.js
create mode 100644 packages/discourse/dist/commands/sync-directory.js.map
create mode 100644 packages/discourse/dist/commands/sync-file.d.ts
create mode 100644 packages/discourse/dist/commands/sync-file.js
create mode 100644 packages/discourse/dist/commands/sync-file.js.map
create mode 100644 packages/discourse/dist/constants.d.ts
create mode 100644 packages/discourse/dist/constants.js
create mode 100644 packages/discourse/dist/constants.js.map
create mode 100644 packages/discourse/dist/index.d.ts
create mode 100644 packages/discourse/dist/index.js
create mode 100644 packages/discourse/dist/index.js.map
create mode 100644 packages/discourse/dist/lib/discourse/cache.d.ts
create mode 100644 packages/discourse/dist/lib/discourse/cache.js
create mode 100644 packages/discourse/dist/lib/discourse/cache.js.map
create mode 100644 packages/discourse/dist/lib/discourse/constants.d.ts
create mode 100644 packages/discourse/dist/lib/discourse/constants.js
create mode 100644 packages/discourse/dist/lib/discourse/constants.js.map
create mode 100644 packages/discourse/dist/lib/discourse/index.d.ts
create mode 100644 packages/discourse/dist/lib/discourse/index.js
create mode 100644 packages/discourse/dist/lib/discourse/index.js.map
create mode 100644 packages/discourse/dist/lib/discourse/types.d.ts
create mode 100644 packages/discourse/dist/lib/discourse/types.js
create mode 100644 packages/discourse/dist/lib/discourse/types.js.map
create mode 100644 packages/discourse/dist/lib/git/index.d.ts
create mode 100644 packages/discourse/dist/lib/git/index.js
create mode 100644 packages/discourse/dist/lib/git/index.js.map
create mode 100644 packages/discourse/dist/lib/index.d.ts
create mode 100644 packages/discourse/dist/lib/index.js
create mode 100644 packages/discourse/dist/lib/index.js.map
create mode 100644 packages/discourse/dist/lib/markdown/Pattern.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/Pattern.js
create mode 100644 packages/discourse/dist/lib/markdown/Pattern.js.map
create mode 100644 packages/discourse/dist/lib/markdown/Rule.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/Rule.js
create mode 100644 packages/discourse/dist/lib/markdown/Rule.js.map
create mode 100644 packages/discourse/dist/lib/markdown/index.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/index.js
create mode 100644 packages/discourse/dist/lib/markdown/index.js.map
create mode 100644 packages/discourse/dist/lib/markdown/index.test.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/index.test.js
create mode 100644 packages/discourse/dist/lib/markdown/index.test.js.map
create mode 100644 packages/discourse/dist/lib/markdown/page.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/page.js
create mode 100644 packages/discourse/dist/lib/markdown/page.js.map
create mode 100644 packages/discourse/dist/lib/markdown/types.d.ts
create mode 100644 packages/discourse/dist/lib/markdown/types.js
create mode 100644 packages/discourse/dist/lib/markdown/types.js.map
create mode 100644 packages/discourse/dist/lib/oa/commons.d.ts
create mode 100644 packages/discourse/dist/lib/oa/commons.js
create mode 100644 packages/discourse/dist/lib/oa/commons.js.map
create mode 100644 packages/discourse/dist/lib/oa/howtos.d.ts
create mode 100644 packages/discourse/dist/lib/oa/howtos.js
create mode 100644 packages/discourse/dist/lib/oa/howtos.js.map
create mode 100644 packages/discourse/dist/lib/oa/index.d.ts
create mode 100644 packages/discourse/dist/lib/oa/index.js
create mode 100644 packages/discourse/dist/lib/oa/index.js.map
create mode 100644 packages/discourse/dist/lib/oa/lib.d.ts
create mode 100644 packages/discourse/dist/lib/oa/lib.js
create mode 100644 packages/discourse/dist/lib/oa/lib.js.map
create mode 100644 packages/discourse/dist/lib/oa/types.d.ts
create mode 100644 packages/discourse/dist/lib/oa/types.js
create mode 100644 packages/discourse/dist/lib/oa/types.js.map
create mode 100644 packages/discourse/dist/lib/oa/users.d.ts
create mode 100644 packages/discourse/dist/lib/oa/users.js
create mode 100644 packages/discourse/dist/lib/oa/users.js.map
create mode 100644 packages/discourse/dist/lib/oa/utils.d.ts
create mode 100644 packages/discourse/dist/lib/oa/utils.js
create mode 100644 packages/discourse/dist/lib/oa/utils.js.map
create mode 100644 packages/discourse/dist/lib/osr/index.d.ts
create mode 100644 packages/discourse/dist/lib/osr/index.js
create mode 100644 packages/discourse/dist/lib/osr/index.js.map
create mode 100644 packages/discourse/dist/lib/osr/urls.d.ts
create mode 100644 packages/discourse/dist/lib/osr/urls.js
create mode 100644 packages/discourse/dist/lib/osr/urls.js.map
create mode 100644 packages/discourse/dist/lib/sync/commons.d.ts
create mode 100644 packages/discourse/dist/lib/sync/commons.js
create mode 100644 packages/discourse/dist/lib/sync/commons.js.map
create mode 100644 packages/discourse/dist/lib/sync/component.d.ts
create mode 100644 packages/discourse/dist/lib/sync/component.js
create mode 100644 packages/discourse/dist/lib/sync/component.js.map
create mode 100644 packages/discourse/dist/lib/sync/directory.d.ts
create mode 100644 packages/discourse/dist/lib/sync/directory.js
create mode 100644 packages/discourse/dist/lib/sync/directory.js.map
create mode 100644 packages/discourse/dist/lib/sync/download.d.ts
create mode 100644 packages/discourse/dist/lib/sync/download.js
create mode 100644 packages/discourse/dist/lib/sync/download.js.map
create mode 100644 packages/discourse/dist/lib/sync/file.d.ts
create mode 100644 packages/discourse/dist/lib/sync/file.js
create mode 100644 packages/discourse/dist/lib/sync/file.js.map
create mode 100644 packages/discourse/dist/lib/sync/index.js
create mode 100644 packages/discourse/dist/lib/sync/index.js.map
create mode 100644 packages/discourse/dist/lib/sync/osrl.d.ts
create mode 100644 packages/discourse/dist/lib/sync/osrl.js
create mode 100644 packages/discourse/dist/lib/sync/osrl.js.map
create mode 100644 packages/discourse/dist/main.d.ts
create mode 100644 packages/discourse/dist/main.js
create mode 100644 packages/discourse/dist/main.js.map
create mode 100644 packages/discourse/dist/options.d.ts
create mode 100644 packages/discourse/dist/options.js
create mode 100644 packages/discourse/dist/options.js.map
create mode 100644 packages/discourse/dist/types.d.ts
create mode 100644 packages/discourse/dist/types.js
create mode 100644 packages/discourse/dist/types.js.map
diff --git a/packages/discourse-legacy/.gitignore b/packages/discourse-legacy/.gitignore
new file mode 100644
index 00000000..74490cf0
--- /dev/null
+++ b/packages/discourse-legacy/.gitignore
@@ -0,0 +1,5 @@
+/node_modules
+/coverage
+*.log
+.DS_Store
+tmp
diff --git a/packages/discourse-legacy/.npmignore b/packages/discourse-legacy/.npmignore
new file mode 100644
index 00000000..4c9addac
--- /dev/null
+++ b/packages/discourse-legacy/.npmignore
@@ -0,0 +1,4 @@
+./docs
+./scripts
+./tests
+./incoming
\ No newline at end of file
diff --git a/packages/discourse-legacy/README.md b/packages/discourse-legacy/README.md
new file mode 100644
index 00000000..204fe53e
--- /dev/null
+++ b/packages/discourse-legacy/README.md
@@ -0,0 +1,161 @@
+# Discourse library and CLI for OSR content
+
+## Commands
+
+### `info`
+
+#### Print configuration and commands
+
+```
+osr-discourse info
+```
+
+### `deploy`
+
+Create/Update post from directory, using OSR-Specs
+
+**usage**
+
+```sh
+
+osr-discourse deploy --src="./*"
+
+```
+
+### `sync `
+
+Sync file
+
+**usage**
+
+```sh
+
+osr-discourse sync
+
+ --src=""
+ --cat=
+ --owner="user_name|user_id"
+ --config=
+ --timestamp=
+ --download-assets=true|false
+ --tags=
+
+```
+
+### `sync-kb`
+
+Create/Update/Sync kb from directory
+
+**usage**
+
+```sh
+
+osr-discourse sync --src="./*"
+
+```
+
+### `list`
+
+List posts per category or search query
+
+**usage**
+
+```sh
+
+osr-discourse list --query="discourse-query" --dst="output.[json|xls|csv]" --fields="[post-fields]"
+
+```
+
+### `oa-user-import`
+
+Imports oa-users from dump file
+
+**usage**
+
+```sh
+
+osr-discourse oa-user --src="raw.json"
+
+```
+
+### `ig-user-sync`
+
+Imports IG users from dump file
+
+**usage**
+
+```sh
+
+osr-discourse ig-user sync --src="raw.json"
+
+```
+
+### `osr-commons-sync`
+
+Sync all osr-commons ( taxonomy )
+
+**usage**
+
+```sh
+
+osr-discourse osr-sync --src="path to commons (JSON)"
+
+```
+
+### `pm`
+
+Notify all users, using Discourse private message
+
+**usage**
+
+```sh
+
+osr-discourse pm --src="path to message (MD|HTML)" --groups="osr groups"
+
+```
+
+### `invite`
+
+Send invite to a list of users, common MC/OSR CSV format
+
+**usage**
+
+```sh
+
+osr-discourse invite --src="path to message (MD|HTML)" --src="path to CSV"
+
+```
+
+## Library / API
+
+## References
+
+- [ts-json-schema-generator - issue - functions](https://github.com/loopingz/webda.io/blob/main/packages/shell/src/code/compiler.ts#L154-243)
+
+### Todos
+
+////////////////////////
+ //
+ // 1. Fetch Tags
+ // 2. Populate Tags
+ // 3. Download (oa-bot)
+ // 4. Sync - Assets (osr-machines)
+ // 5. Ensure/Find user
+ //
+ // Content
+ //
+ // Body (descr full)
+ // each step
+ // footer (refs)
+ // set tags
+ // set ts
+ //
+ // Post
+ // -> sync lib
+ // -> translate -> lib
+ // -> digest
+ // -> notifications
+ // -> index
+ // -> update ext refs
+ // -> market place
+ // -> sync externals (git, ...)
diff --git a/packages/discourse-legacy/dist/_cli.d.ts b/packages/discourse-legacy/dist/_cli.d.ts
new file mode 100644
index 00000000..f700ffb5
--- /dev/null
+++ b/packages/discourse-legacy/dist/_cli.d.ts
@@ -0,0 +1,3 @@
+import { IOptions, IOptionsSync } from './types';
+export declare const defaults: () => void;
+export declare const sanitize: (argv: any) => IOptionsSync | IOptions | boolean;
diff --git a/packages/discourse-legacy/dist/_cli.js b/packages/discourse-legacy/dist/_cli.js
new file mode 100644
index 00000000..8e1ab9a3
--- /dev/null
+++ b/packages/discourse-legacy/dist/_cli.js
@@ -0,0 +1,66 @@
+import { sync as exists } from '@polymech/fs/exists';
+import { logger } from './';
+import * as path from 'path';
+const globBase = require('glob-base');
+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);
+ });
+};
+export const sanitize = (argv) => {
+ let ret = {
+ ...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;
+};
+//# sourceMappingURL=_cli.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/_cli.js.map b/packages/discourse-legacy/dist/_cli.js.map
new file mode 100644
index 00000000..72b36fca
--- /dev/null
+++ b/packages/discourse-legacy/dist/_cli.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"_cli.js","sourceRoot":"","sources":["../src/_cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAO5B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAErC,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;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAS,EAAqC,EAAE;IAErE,IAAI,GAAG,GAAQ;QACX,GAAG,IAAI;KACV,CAAA;IAED,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;IAClB,IAAI,OAAO,CAAA;IACX,IAAI,SAAS,GAAG,EAAE,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;MAyBE;IAEF,IAAI,IAAI,CAAC,GAAG,EAAE;QACV,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;YACpB,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;SACxD;KACJ;SAAM;QACH,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;KAC1B;IAED,GAAG,GAAG;QACF,GAAG,GAAG;QACN,SAAS;QACT,OAAO;KACV,CAAA;IAED,OAAO,GAAG,CAAA;AACd,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/import-oa-howtos.d.ts b/packages/discourse-legacy/dist/commands/import-oa-howtos.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-howtos.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/import-oa-howtos.js b/packages/discourse-legacy/dist/commands/import-oa-howtos.js
new file mode 100644
index 00000000..eea3c28d
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-howtos.js
@@ -0,0 +1,49 @@
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+import { read_howtos, filter_valid } from '../lib/oa/commons';
+import { importHowtos, updateHowtos } from '../lib/oa/howtos';
+import * as path from 'path';
+import { resolve } from '@polymech/commons';
+const KB_ROOT = '${KB_ROOT}';
+import { OA_LATEST } from '@polymech/commons';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: true,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('src', {
+ default: OA_LATEST,
+ type: 'string',
+ }).option('track', {
+ default: '${OA_ROOT}/oa-data/howtos/latest_track.json',
+ type: 'string',
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('import-howtos', 'Import oa-howtos', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = argv;
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ const discourse = Instance();
+ const _opts = {
+ src: path.resolve(resolve(options.src)),
+ track: path.resolve(resolve(options.track))
+ };
+ let howtos = read_howtos(_opts.src);
+ howtos = filter_valid(howtos);
+ await importHowtos(discourse, _opts, howtos);
+ await updateHowtos(discourse, _opts, howtos);
+ });
+};
+//# sourceMappingURL=import-oa-howtos.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/import-oa-howtos.js.map b/packages/discourse-legacy/dist/commands/import-oa-howtos.js.map
new file mode 100644
index 00000000..a447c3d3
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-howtos.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"import-oa-howtos.js","sourceRoot":"","sources":["../../src/commands/import-oa-howtos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAe,MAAM,UAAU,CAAA;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAe3C,OAAO,EAEH,WAAW,EAEX,YAAY,EACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACH,YAAY,EAAE,YAAY,EAC7B,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG3C,MAAM,OAAO,GAAG,YAAY,CAAA;AAQ5B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,gBAAgB;QAC1B,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,qCAAqC;KAClD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QAC3F,QAAQ,EAAE,CAAA;QACV,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,IAAI,OAAO,GAAI,IAAwB,CAAA;QAEvC,IAAI,CAAC,OAAO,EAAE;YACV,OAAM;SACT;QACD,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAElD,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;QAE5B,MAAM,KAAK,GAAG;YACV,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClC,CAAA;QAEb,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/import-oa-users.d.ts b/packages/discourse-legacy/dist/commands/import-oa-users.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-users.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/import-oa-users.js b/packages/discourse-legacy/dist/commands/import-oa-users.js
new file mode 100644
index 00000000..d9027609
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-users.js
@@ -0,0 +1,84 @@
+import { defaults, sanitize } from '../_cli';
+import { parse } from '../options';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+import { sync as write } from '@polymech/fs/write';
+import { read_users, filter_invalid, filter_email_missing, filter_email_only, importUsers, filter_valid, oa_user_email, getDataPath, updateUsers, indexUsers } from '../lib/oa/users';
+import * as path from 'path';
+import { resolve } from '@polymech/commons';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: false,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('src', {
+ default: '${OA_ROOT}/data/latest.json',
+ type: 'string',
+ }).option('track', {
+ default: '${OSR_ROOT}/osr-directory/pp/merged.json',
+ type: 'string',
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('import-users ', 'Import oa-users', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ let opts = parse(options, args);
+ const discourse = Instance();
+ const _opts = {
+ verb: argv.verb,
+ src: path.resolve(resolve(options.src)),
+ track: path.resolve(resolve(options.track))
+ };
+ let users = read_users(_opts.src);
+ users = filter_valid(users);
+ //////////////////////////
+ //
+ // store invalid
+ let usersInvalid = read_users(_opts.src);
+ usersInvalid = filter_email_only(usersInvalid);
+ usersInvalid = filter_invalid(usersInvalid);
+ logger.debug('write invalidUsers.json : ', getDataPath('/invalidUsers.json'));
+ write(getDataPath('/invalidUsers.json'), usersInvalid.map((u) => {
+ return {
+ ...u.detail,
+ id: u._id,
+ email: oa_user_email(u)
+ };
+ }));
+ let usersInvalidEmail = read_users(_opts.src);
+ usersInvalidEmail = filter_email_missing(usersInvalidEmail);
+ logger.debug('write invalidUsersEMail.json : ', getDataPath('/invalidUsersEMail.json'));
+ write(getDataPath('./invalidUsersEMail.json'), usersInvalidEmail.map((u) => {
+ return {
+ ...u.detail,
+ id: u._id
+ };
+ }));
+ logger.debug('invalid users email : ', usersInvalidEmail.length);
+ logger.debug('invalid users : ', usersInvalid.length);
+ if (opts.verb == 'index') {
+ await indexUsers(discourse, options, users);
+ }
+ if (opts.verb == 'import') {
+ await importUsers(discourse, options, users);
+ }
+ if (opts.verb == 'update') {
+ await updateUsers(discourse, options, users);
+ }
+ return;
+ });
+};
+//# sourceMappingURL=import-oa-users.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/import-oa-users.js.map b/packages/discourse-legacy/dist/commands/import-oa-users.js.map
new file mode 100644
index 00000000..6c8b4776
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/import-oa-users.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"import-oa-users.js","sourceRoot":"","sources":["../../src/commands/import-oa-users.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/info.d.ts b/packages/discourse-legacy/dist/commands/info.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/info.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/info.js b/packages/discourse-legacy/dist/commands/info.js
new file mode 100644
index 00000000..c96d4d7c
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/info.js
@@ -0,0 +1,23 @@
+import { CONFIG_DEFAULT } from '@polymech/commons';
+import { logger } from '../index';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: 'false',
+ describe: 'debug messages'
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('info', 'info', options, async (argv) => {
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ const src = CONFIG_DEFAULT(args.env_key);
+ logger.debug(`Reading OSR Config with key "${argv.env_key}"`, src);
+ });
+};
+//# sourceMappingURL=info.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/info.js.map b/packages/discourse-legacy/dist/commands/info.js.map
new file mode 100644
index 00000000..02665063
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/info.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,gBAAgB;KAC7B,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,oCAAoC;KACjD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QACtE,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,MAAM,IAAI,GAAQ,IAAI,CAAA;QACtB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/query.d.ts b/packages/discourse-legacy/dist/commands/query.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/query.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/query.js b/packages/discourse-legacy/dist/commands/query.js
new file mode 100644
index 00000000..6c22833c
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/query.js
@@ -0,0 +1,52 @@
+import { defaults, sanitize } from '../_cli';
+import { parse } from '../options';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: false,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('short', {
+ default: 'true',
+ describe: 'Emit short info only',
+ type: 'boolean'
+ }).option('disabled', {
+ default: 'false',
+ describe: 'Enumerate disabled products',
+ type: 'boolean'
+ }).option('dry', {
+ default: 'false',
+ describe: 'Process files for debug purposes only.'
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('query ', 'Search namespace', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ let opts = parse(options, args);
+ if (!opts.verb) {
+ logger.error('No verb specified');
+ return;
+ }
+ const discourse = Instance();
+ if (opts.verb == 'tags') {
+ const items = await discourse.search('Sheetpress - Cell', 'tags:sheetpress');
+ logger.info('items', items);
+ }
+ return;
+ });
+};
+//# sourceMappingURL=query.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/query.js.map b/packages/discourse-legacy/dist/commands/query.js.map
new file mode 100644
index 00000000..d6bf0328
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/query.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,gBAAgB;QAC1B,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;QAClB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,6BAA6B;QACvC,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,wCAAwC;KACrD,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,qCAAqC;KAClD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QAC1F,QAAQ,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,MAAM,IAAI,GAAQ,IAAI,CAAA;QAEtB,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAW,CAAa,CAAA;QAE/C,IAAI,CAAC,OAAO,EAAE;YACV,OAAM;SACT;QACD,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAE/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACjC,OAAO;SACV;QACD,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;QAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;YACrB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAC,iBAAiB,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC,KAAK,CAAC,CAAA;SAC7B;QACD,OAAM;IACV,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-component.d.ts b/packages/discourse-legacy/dist/commands/sync-component.d.ts
new file mode 100644
index 00000000..1d55e593
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-component.d.ts
@@ -0,0 +1,4 @@
+import * as CLI from 'yargs';
+import { IOptionsSyncComponent } from '../types';
+export declare const parse: (argv: any) => IOptionsSyncComponent | boolean;
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/sync-component.js b/packages/discourse-legacy/dist/commands/sync-component.js
new file mode 100644
index 00000000..8d43b1df
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-component.js
@@ -0,0 +1,119 @@
+import * as path from 'path';
+import { forward_slash, pathInfo } from "@polymech/commons";
+import { resolve, isFile } from '@polymech/commons';
+import { sync as exists } from '@polymech/fs/exists';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { syncComponent } from '../lib/sync/component';
+import { PFilterValid } from '@plastichub/osr-fs-utils';
+const globBase = require('glob-base');
+export const parse = (argv) => {
+ let ret = {
+ ...argv
+ };
+ let srcInfo;
+ let variables = {};
+ ret.src = argv.src;
+ ret.source = resolve(forward_slash(ret.source), ret.alt, variables);
+ ret.root = resolve(forward_slash(ret.root), ret.alt, variables);
+ ret.product_root = resolve(forward_slash(ret.product_root), ret.alt, variables);
+ if (ret.src) {
+ ret.src = resolve(ret.src, ret.alt, 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(/\/$/, '');
+ // case : single file
+ if (exists(file) && isFile(file)) {
+ ret.src = file;
+ }
+ const src = resolve(forward_slash(ret.src), ret.alt, variables);
+ srcInfo = pathInfo(src);
+ // case : glob pattern
+ 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;
+};
+const defaultOptions = (yargs) => {
+ return yargs
+ //standard options
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ //discourse
+ .option('yaml', { type: 'boolean', default: false, describe: 'Parse options from YAML header' })
+ .option('skip', { type: 'boolean', default: true, describe: 'Skip existing' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ //osrl
+ .option('src', {
+ default: '${OSR_ROOT}/osr-machines/injection/**/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('src2', {
+ default: '${OSR_ROOT}/osr-machines/sheetpress/cassandra-light/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('env', { type: 'string', default: 'forum' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/base.json" })
+ .option('format', { type: 'string', default: 'md' })
+ .option('source', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/root.html" })
+ .option('language', { type: 'string', default: 'osr' })
+ .option('plugins', { type: 'string', default: '${root}/osr/plugins' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('product_root', { type: 'string', default: '${PRODUCT_ROOT}/products' })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('module', { type: 'string', default: 'osr-lib-components' })
+ .option('filter', { type: 'string', default: PFilterValid.library_component })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync-component', 'Sync OSR Component', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = parse(argv);
+ if (!options) {
+ return;
+ }
+ logger.setSettings({ minLevel: argv.logLevel });
+ // options.debug && logger.debug(`CLI Args In`, argv)
+ logger.debug('Options', options);
+ let ret = syncComponent(options);
+ return ret;
+ });
+};
+//# sourceMappingURL=sync-component.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-component.js.map b/packages/discourse-legacy/dist/commands/sync-component.js.map
new file mode 100644
index 00000000..2c9db04f
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-component.js","sourceRoot":"","sources":["../../src/commands/sync-component.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-directory.d.ts b/packages/discourse-legacy/dist/commands/sync-directory.d.ts
new file mode 100644
index 00000000..1d55e593
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-directory.d.ts
@@ -0,0 +1,4 @@
+import * as CLI from 'yargs';
+import { IOptionsSyncComponent } from '../types';
+export declare const parse: (argv: any) => IOptionsSyncComponent | boolean;
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/sync-directory.js b/packages/discourse-legacy/dist/commands/sync-directory.js
new file mode 100644
index 00000000..e9344e1e
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-directory.js
@@ -0,0 +1,118 @@
+import * as path from 'path';
+import { forward_slash, pathInfo } from "@polymech/commons";
+import { resolve, isFile } from '@polymech/commons';
+import { sync as exists } from '@polymech/fs/exists';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { syncComponent } from '../lib/sync/component';
+import { PFilterValid } from '@plastichub/osr-fs-utils';
+const globBase = require('glob-base');
+export const parse = (argv) => {
+ let ret = {
+ ...argv
+ };
+ ret.src = argv.src;
+ let srcInfo;
+ let variables = {};
+ ret.source = resolve(forward_slash(ret.source), ret.alt, variables);
+ ret.root = resolve(forward_slash(ret.root), ret.alt, variables);
+ if (ret.src) {
+ ret.src = resolve(ret.src, ret.alt, 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(/\/$/, '');
+ // case : single file
+ if (exists(file) && isFile(file)) {
+ ret.src = file;
+ }
+ const src = resolve(forward_slash(ret.src), ret.alt, variables);
+ srcInfo = pathInfo(src);
+ // case : glob pattern
+ 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;
+};
+const defaultOptions = (yargs) => {
+ return yargs
+ //standard options
+ .option('debug', { type: 'boolean', default: true, describe: 'debug messages' })
+ .option('verbose', { type: 'boolean', default: true, describe: 'even more debug messages' })
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ //discourse
+ .option('yaml', { type: 'boolean', default: false, describe: 'Parse options from YAML header' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ //osrl
+ .option('src2', {
+ default: '${OSR_ROOT}/osr-machines/injection/**/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('src', {
+ default: '${OSR_ROOT}/osr-machines/sheetpress/cassandra-light/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('env', { type: 'string', default: 'forum' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/base.json" })
+ .option('format', { type: 'string', default: 'md' })
+ .option('source', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/root.html" })
+ .option('language', { type: 'string', default: 'osr' })
+ .option('plugins', { type: 'string', default: '${root}/osr/plugins' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('product_root', { type: 'string', default: '${PRODUCT_ROOT}/products' })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('module', { type: 'string', default: 'osr-lib-components' })
+ .option('filter', { type: 'string', default: PFilterValid.library_component })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync-component', 'Sync OSR Component', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = parse(argv);
+ if (!options) {
+ return;
+ }
+ // options.debug && logger.debug(`CLI Args In`, argv)
+ // logger.debug('Options', options)
+ let ret = syncComponent(options);
+ return ret;
+ });
+};
+//# sourceMappingURL=sync-directory.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-directory.js.map b/packages/discourse-legacy/dist/commands/sync-directory.js.map
new file mode 100644
index 00000000..0b250b25
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-directory.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-directory.js","sourceRoot":"","sources":["../../src/commands/sync-directory.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-file.d.ts b/packages/discourse-legacy/dist/commands/sync-file.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-file.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse-legacy/dist/commands/sync-file.js b/packages/discourse-legacy/dist/commands/sync-file.js
new file mode 100644
index 00000000..91192ba1
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-file.js
@@ -0,0 +1,51 @@
+import { defaults, sanitize } from '../_cli';
+import { logger } from '../index';
+import { syncYAML } from '../lib/sync/file';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+const defaultOptions = (yargs) => {
+ return yargs
+ .option('debug', { type: 'boolean', default: true, describe: 'debug messages' })
+ .option('verbose', { type: 'boolean', default: true, describe: 'even more debug messages' })
+ .option('yaml', { type: 'boolean', default: true, describe: 'Parse options from YAML header' })
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('src', {
+ default: './tests/**/*.md',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('config', { type: 'string', default: 'osr_admin' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ .option('env', { type: 'string', default: 'test-import' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-profiles/osr/base.json" })
+ .option('format', { type: 'string', default: 'html' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync ', 'Sync file', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ if (!options.verb) {
+ logger.error('No verb specified');
+ return;
+ }
+ return syncYAML(options);
+ });
+};
+//# sourceMappingURL=sync-file.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/commands/sync-file.js.map b/packages/discourse-legacy/dist/commands/sync-file.js.map
new file mode 100644
index 00000000..2058ce64
--- /dev/null
+++ b/packages/discourse-legacy/dist/commands/sync-file.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-file.js","sourceRoot":"","sources":["../../src/commands/sync-file.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/constants.d.ts b/packages/discourse-legacy/dist/constants.d.ts
new file mode 100644
index 00000000..ca2c1318
--- /dev/null
+++ b/packages/discourse-legacy/dist/constants.d.ts
@@ -0,0 +1 @@
+export declare const MODULE_NAME = "OSR-DISCOURSE";
diff --git a/packages/discourse-legacy/dist/constants.js b/packages/discourse-legacy/dist/constants.js
new file mode 100644
index 00000000..df4d533d
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/constants.js.map b/packages/discourse-legacy/dist/constants.js.map
new file mode 100644
index 00000000..40113118
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/index.d.ts b/packages/discourse-legacy/dist/index.d.ts
new file mode 100644
index 00000000..7b0f9866
--- /dev/null
+++ b/packages/discourse-legacy/dist/index.d.ts
@@ -0,0 +1,8 @@
+export * from './constants';
+export * from './types';
+export * from './lib';
+export * from './lib/oa/types';
+export { Logger } from 'tslog';
+export declare const logger: any;
+import { IObjectLiteral } from "@polymech/core";
+export declare const substitute: (alt: boolean, template: string, vars?: IObjectLiteral) => any;
diff --git a/packages/discourse-legacy/dist/index.js b/packages/discourse-legacy/dist/index.js
new file mode 100644
index 00000000..f0e2fa0a
--- /dev/null
+++ b/packages/discourse-legacy/dist/index.js
@@ -0,0 +1,70 @@
+export * from './constants';
+export * from './types';
+export * from './lib';
+export * from './lib/oa/types';
+import { logger as _logger } from '@polymech/core/debug';
+import { MODULE_NAME } from './constants';
+export { Logger } from 'tslog';
+let loggers = {};
+/*
+const _logger = new Logger({
+ prettyLogTemplate: "{{yyyy}}.{{mm}}.{{dd}} {{hh}}:{{MM}}:{{ss}}:{{ms}}\t{{logLevelName}}\t[{{filePathWithLine}}{{name}}]\t",
+ prettyErrorTemplate: "\n{{errorName}} {{errorMessage}}\nerror stack:\n{{errorStack}}",
+ prettyErrorStackTemplate: " • {{fileName}}\t{{method}}\n\t{{filePathWithLine}}",
+ prettyErrorParentNamesSeparator: ":",
+ prettyErrorLoggerNameDelimiter: "\t",
+ stylePrettyLogs: true,
+ prettyLogTimeZone: "UTC",
+ prettyLogStyles: {
+ logLevelName: {
+ "*": ["bold", "black", "bgWhiteBright", "dim"],
+ SILLY: ["bold", "white"],
+ TRACE: ["bold", "whiteBright"],
+ DEBUG: ["bold", "green"],
+ INFO: ["bold", "blue"],
+ WARN: ["bold", "yellow"],
+ ERROR: ["bold", "red"],
+ FATAL: ["bold", "redBright"],
+ },
+ dateIsoStr: "white",
+ filePathWithLine: "white",
+ name: ["white", "bold"],
+ nameWithDelimiterPrefix: ["white", "bold"],
+ nameWithDelimiterSuffix: ["white", "bold"],
+ errorName: ["bold", "bgRedBright", "whiteBright"],
+ fileName: ["yellow"],
+ fileNameWithLine: "white",
+ },
+ });
+ */
+/*
+export const __logger = (name: string = MODULE_NAME, options: ISettingsParam = {}): Logger => {
+ if (!loggers[name]) {
+ const logger: Logger = new Logger({
+ name: name,
+ type: 'pretty',
+ ...options
+ });
+ // const trans = (transportLogger: LogObj & ILogObjMet)
+ (logger as any).attachTransport((logObj) => {
+ debugger
+ //transports.push(logObj);
+ });
+
+ logger.debug('test')
+
+ loggers[name] = logger;
+ }
+ return loggers[name]
+}*/
+export const logger = _logger(MODULE_NAME);
+/*
+export const log = (msg: string, ...args: any) => logger().info(msg, ...args);
+export const info = (msg: string, ...args: any) => logger().info(msg, ...args);
+export const error = (msg: string, ...args: any) => logger().error(msg, ...args);
+export const warn = (msg: string, ...args: any) => logger().warn(msg, ...args);
+export const debug = (msg: string, ...args: any) => logger().debug(msg, ...args);
+*/
+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-legacy/dist/index.js.map b/packages/discourse-legacy/dist/index.js.map
new file mode 100644
index 00000000..721615b0
--- /dev/null
+++ b/packages/discourse-legacy/dist/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,OAAO,CAAA;AACrB,cAAc,gBAAgB,CAAA;AAE9B,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9B,IAAI,OAAO,GAAG,EAAE,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8BI;AACJ;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAE1C;;;;;;EAME;AAGF,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAInG,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-legacy/dist/lib/discourse/cache.d.ts b/packages/discourse-legacy/dist/lib/discourse/cache.d.ts
new file mode 100644
index 00000000..b14e27a2
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/discourse/cache.d.ts
@@ -0,0 +1,9 @@
+///
+import { IDiscourseUser } from '../../';
+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-legacy/dist/lib/discourse/cache.js b/packages/discourse-legacy/dist/lib/discourse/cache.js
new file mode 100644
index 00000000..35319b9c
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/discourse/cache.js
@@ -0,0 +1,112 @@
+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';
+import * as path from 'path';
+const escapeHtml = require('escape-html');
+const pretty = require('pretty');
+export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-");
+import { get_cached, set_cached } from '@plastichub/osr-cache/lib';
+import { OSR_CACHE } from '@polymech/commons';
+import { MODULE_NAME } from '../../constants';
+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-legacy/dist/lib/discourse/cache.js.map b/packages/discourse-legacy/dist/lib/discourse/cache.js.map
new file mode 100644
index 00000000..8a3846b3
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/constants.d.ts b/packages/discourse-legacy/dist/lib/discourse/constants.d.ts
new file mode 100644
index 00000000..49a2ce1c
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/constants.js b/packages/discourse-legacy/dist/lib/discourse/constants.js
new file mode 100644
index 00000000..51dac7ba
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/constants.js.map b/packages/discourse-legacy/dist/lib/discourse/constants.js.map
new file mode 100644
index 00000000..1cbb6395
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/index.d.ts b/packages/discourse-legacy/dist/lib/discourse/index.d.ts
new file mode 100644
index 00000000..10ecb173
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/discourse/index.d.ts
@@ -0,0 +1,181 @@
+import { IDiscourseConfig } from '@polymech/commons/types';
+export declare const logger: any;
+import PromisePool from 'native-promise-pool';
+export declare const escape: (path: string) => string;
+import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types';
+import { Category, CategoriesResponse, PostsResponse, PostResponse, TopicResponse, TopicItem, CategoryResponse, PostItem, PostUpdateItem, IDiscourserConfig, Thread, PostModifier, FetchConfig, FetchOptions, ISearchResult, ICreateUserResponse, IUserDetail, TagsResponse, Tag, TopicUpdateBasicTopic } from './types';
+import { IDiscourseUser } from '@polymech/commons';
+import { IDImage } from '../oa/index';
+/**
+ * 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-legacy/dist/lib/discourse/index.js b/packages/discourse-legacy/dist/lib/discourse/index.js
new file mode 100644
index 00000000..3d30a7d9
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/discourse/index.js
@@ -0,0 +1,935 @@
+import { MODULE_NAME } from '../../constants';
+import { CONFIG_DEFAULT } from '@polymech/commons';
+import { logger as _logger } from '@polymech/core/debug';
+export const logger = _logger(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 axios from 'axios';
+import * as fs from 'fs';
+import * as path from 'path';
+import * as FormData from 'form-data';
+const https = require('https');
+const request = require("request");
+const fetch = require('isomorphic-unfetch');
+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`;
+ let ret = await fetch(url, {
+ "headers": {
+ "accept-language": "en-GB,en-US;q=0.9,en;q=0.8,de;q=0.7,es;q=0.6,fr;q=0.5",
+ "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
+ "x-csrf-token": token,
+ "x-requested-with": "XMLHttpRequest",
+ "cookie": "_bypass_cache=true; _ga_MBZGKNMDWC=GS1.1.1685892974.20.1.1685893082.0.0.0; _ga_P4SR15V1XR=GS1.1.1687459978.51.1.1687460537.0.0.0; _ga_H8W78Y3P2B=GS1.1.1687604701.23.0.1687604701.0.0.0; _ga=GA1.1.401826746.1678337758; _t=xQ05qW5JFxLM9Pq0lIwG6ez74Z1q2OLpak0DzRx8VdFYE5eI3oJXhLURPrdm2zIcHmYcBj9q%2BKdHhGz5N6j9mXitYzcMwkXHL3K9GYKdO4gJ8tBQimpmd1HFaRhB9Ml9aJ8WviqQWDZDOYwEUKFcWw3wbAalfQtbdIbUSX8gH9sG6DLFU3HiEg7tWModRy%2BoFrTm6QOalDuajRW3nBazau%2FiY8ZCVm2g30Y10CBDfqJHL1ztV8XM4kEIeulLNTzGVtSb7uuO1OcjZRSb--aDgCPEalq7SIpnH5--HWCNf5readaeij3oDl9b9w%3D%3D; __profilin=p%3Dt%2Ca%3Deef38e031f99cc8240f3518e1b8811cf; _forum_session=RkEWuzKI1QXBYCnP6KRamD8mweZ3h9%2B6G%2Fi23gAWUgy8gp8FuiyQD5lKU0Fbx3FzzaM4SiQcvnIiEAnb5P4OYjlvstqwWlfRp%2B9is7iX8StwYGiYsncHQ5LrzSbV3y9mR7sj%2F8JZ8evQOe2ZZjZB3iEkppsGrmyFrw5PsUgSphRTZm70SKIw96JrW17yK4hhLqtk%2BaQPgNu4oJl42YfXAr%2FCBldcBUKXFeHppYmv61WECV0531hCo7GcA4t06B9QpSr%2BeoiM1Ok9tpQrAlZf36Ka4lVCTyXXu3SNvbtvfd9tZMJCWDYv69jdMsezuOaEP870pk9qYPaL4x6nAY5EXO3u9usCggqQ1B1EydCK9uMy7ZUCIo9wONw7QOIgEQ%3D%3D--GMqYSb2H7xXVDky6--R9gVciBqwC0IL9LefywrFw%3D%3D; _ga_GVR8PEPG6C=GS1.1.1687710574.106.1.1687710599.0.0.0",
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ "body": `timestamp=${time}`,
+ "method": "PUT"
+ });
+ if (ret && ret.status === 200) {
+ return true;
+ }
+ return;
+ /*
+ let data = new FormData();
+ data.append('timestamp', time);
+
+ try {
+ let ret = await axios.put(url, data, {
+ headers: {
+ //'Accept-Language': 'en-US,en;q=0.8',
+ //'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ //'Content-Type': `multipart/form-data; boundary=${data._boundary}`,
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ }
+ });
+ debugger
+ } catch (error) {
+ debugger
+ }
+
+
+ return
+ */
+ /*
+ var options = {
+ method: 'PUT',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body: `timestamp=${time}`
+ };
+
+ new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+ */
+ /*
+ var options = {
+ method: 'POST',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body
+ }
+
+
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+*/
+ // 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`;
+ let data = new FormData();
+ data.append('topic_id', '' + postId);
+ data.append('raw', raw);
+ data.append('nested_post', 'true');
+ data.append('category', category);
+ var options = {
+ method: 'POST',
+ url: url,
+ headers: {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ "body": `raw=${raw}&unlist_topic=false&category=${category}&topic_id=${postId}&is_warning=false&archetype=regular&featured_link=&shared_draft=false&nested_post=true`,
+ };
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ }
+ else {
+ resolve(body);
+ }
+ });
+ });
+ }
+ async changeOwner(postId, topicId, owner) {
+ const url = `${this.host}/t/${topicId}/change-owner.json`;
+ var options = {
+ method: 'POST',
+ url: url,
+ headers: {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body: `post_ids%5B%5D=${postId}&username=${owner}`
+ };
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ }
+ else {
+ resolve(body);
+ }
+ });
+ });
+ }
+ 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
+ }
+ });
+ }
+ 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
+ }
+ });
+ }
+ // =================================
+ // 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-legacy/dist/lib/discourse/index.js.map b/packages/discourse-legacy/dist/lib/discourse/index.js.map
new file mode 100644
index 00000000..810c7506
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/discourse/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/discourse/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/discourse/types.d.ts b/packages/discourse-legacy/dist/lib/discourse/types.d.ts
new file mode 100644
index 00000000..717972e6
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/types.js b/packages/discourse-legacy/dist/lib/discourse/types.js
new file mode 100644
index 00000000..041980b6
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/discourse/types.js.map b/packages/discourse-legacy/dist/lib/discourse/types.js.map
new file mode 100644
index 00000000..2aefd62f
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/git/index.d.ts b/packages/discourse-legacy/dist/lib/git/index.d.ts
new file mode 100644
index 00000000..3dd29ec2
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/git/index.d.ts
@@ -0,0 +1,5 @@
+export declare function git_status(cwd: any, dir: any): Promise;
+export declare function git_log(cwd: any, dir: any): Promise<{
+ files: any;
+ last: any;
+}>;
diff --git a/packages/discourse-legacy/dist/lib/git/index.js b/packages/discourse-legacy/dist/lib/git/index.js
new file mode 100644
index 00000000..8a8b36cd
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/git/index.js
@@ -0,0 +1,34 @@
+import { logger } from '../../index';
+const GIT_CHANGELOG_MESSAGE_PREFIX = '';
+import * as simpleGit from 'simple-git/promise';
+import * as moment from 'moment';
+export async function git_status(cwd, dir) {
+ const git = simpleGit(cwd);
+ let statusSummary = null;
+ try {
+ statusSummary = await git.log(['--stat', dir]);
+ }
+ catch (e) {
+ logger.error('Error Git', e);
+ }
+ return statusSummary;
+}
+export async function git_log(cwd, dir) {
+ const stats = await git_status(cwd, dir);
+ logger.info(`Reading Git log at ${cwd}/${dir}`);
+ let changelogs = stats.all.filter((e) => e.message.trim().toLowerCase().startsWith(GIT_CHANGELOG_MESSAGE_PREFIX.toLowerCase()));
+ if (!changelogs.length) {
+ return { files: [], last: stats.latest };
+ }
+ let pretty = changelogs.map((e) => {
+ return {
+ files: e.diff.files.map((f) => { return { path: f.file }; }),
+ msg: e.message.toLowerCase().replace(GIT_CHANGELOG_MESSAGE_PREFIX.toLowerCase(), '').trim(),
+ hash: e.hash,
+ date: moment(e.date).format('LLLL')
+ };
+ });
+ return { files: pretty, last: stats.latest };
+}
+;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/git/index.js.map b/packages/discourse-legacy/dist/lib/git/index.js.map
new file mode 100644
index 00000000..3ed2841d
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/git/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/git/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,MAAM,4BAA4B,GAAG,EAAE,CAAA;AAIvC,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAG,EAAE,GAAG;IAErC,MAAM,GAAG,GAAc,SAAS,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,aAAa,GAAO,IAAI,CAAC;IAC7B,IAAI;QACA,aAAa,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;KAClD;IACD,OAAO,CAAC,EAAE;QACN,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;KAChC;IACD,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAG,EAAE,GAAG;IAClC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,4BAA4B,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACpB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC,KAAK,CAAC,MAAM,EAAE,CAAA;KAC1C;IACD,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,OAAO;YACH,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,CAAC,CAAC;YAC3D,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC3F,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;SACtC,CAAA;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjD,CAAC;AAAA,CAAC"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/index.d.ts b/packages/discourse-legacy/dist/lib/index.d.ts
new file mode 100644
index 00000000..f34b2558
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/index.d.ts
@@ -0,0 +1,2 @@
+export * from './discourse';
+export * from './discourse/types';
diff --git a/packages/discourse-legacy/dist/lib/index.js b/packages/discourse-legacy/dist/lib/index.js
new file mode 100644
index 00000000..fe023451
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/index.js
@@ -0,0 +1,3 @@
+export * from './discourse';
+export * from './discourse/types';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/index.js.map b/packages/discourse-legacy/dist/lib/index.js.map
new file mode 100644
index 00000000..bbc1ec41
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,mBAAmB,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/markdown/Pattern.d.ts b/packages/discourse-legacy/dist/lib/markdown/Pattern.d.ts
new file mode 100644
index 00000000..dd02b1a1
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/Pattern.d.ts
@@ -0,0 +1,7 @@
+import { RegExCallback } from './types';
+export declare class Pattern {
+ regex: RegExp;
+ replacement: RegExCallback;
+ constructor(regex: RegExp, replacement: any);
+ apply(raw: string): string;
+}
diff --git a/packages/discourse-legacy/dist/lib/markdown/Pattern.js b/packages/discourse-legacy/dist/lib/markdown/Pattern.js
new file mode 100644
index 00000000..9d9303a2
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/Pattern.js.map b/packages/discourse-legacy/dist/lib/markdown/Pattern.js.map
new file mode 100644
index 00000000..d9892c3a
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/Rule.d.ts b/packages/discourse-legacy/dist/lib/markdown/Rule.d.ts
new file mode 100644
index 00000000..f19edcd8
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/Rule.d.ts
@@ -0,0 +1,7 @@
+import { Pattern } from './Pattern';
+export declare class Rule {
+ name: string;
+ patterns: Pattern[];
+ constructor(name: string, patterns: Pattern[]);
+ apply(raw: string): string;
+}
diff --git a/packages/discourse-legacy/dist/lib/markdown/Rule.js b/packages/discourse-legacy/dist/lib/markdown/Rule.js
new file mode 100644
index 00000000..5526e648
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/Rule.js.map b/packages/discourse-legacy/dist/lib/markdown/Rule.js.map
new file mode 100644
index 00000000..9fc1b1b8
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/index.d.ts b/packages/discourse-legacy/dist/lib/markdown/index.d.ts
new file mode 100644
index 00000000..59be8be6
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/index.d.ts
@@ -0,0 +1,14 @@
+import { Rule } from './Rule';
+import { RMarkOptions } from './types';
+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';
+export { Pattern } from './Pattern';
+export declare const toHTML: (content: any) => any;
diff --git a/packages/discourse-legacy/dist/lib/markdown/index.js b/packages/discourse-legacy/dist/lib/markdown/index.js
new file mode 100644
index 00000000..685fc5f6
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/index.js
@@ -0,0 +1,98 @@
+import { Rule } from './Rule';
+import { Pattern } from './Pattern';
+export const RE_IMAGES = /\!\[([^\]]+)\]\((\S+)\)/g;
+export const RE_LINKS = /\[([^\n]+)\]\(([^\n]+)\)/g;
+import * as 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, ' '),
+ ]),
+ 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';
+export { Pattern } from './Pattern';
+// 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-legacy/dist/lib/markdown/index.js.map b/packages/discourse-legacy/dist/lib/markdown/index.js.map
new file mode 100644
index 00000000..2e698a4e
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/index.test.d.ts b/packages/discourse-legacy/dist/lib/markdown/index.test.d.ts
new file mode 100644
index 00000000..509db186
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/index.test.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/discourse-legacy/dist/lib/markdown/index.test.js b/packages/discourse-legacy/dist/lib/markdown/index.test.js
new file mode 100644
index 00000000..11e6c7da
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/index.test.js
@@ -0,0 +1,112 @@
+import { Pattern, RMark, Rule } from './index';
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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
+
+
+
Header 2
+
+
+
Header 3
+
+
+
Header 4
+
+
+
Header 5
+
+
+
Header 6
+
+
+
+Bold
+
+
+Italic
+
+
+
+Link
+
+
+
+
+
+
+This is Bold and this is Italic .
+
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+
+
+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
+
+`;
+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('\nLorem 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('\nBold
\n');
+ expect(new RMark().render('__Bold__')).toBe('\nBold
\n');
+ expect(new RMark().render('This is **Bold**')).toBe('\nThis is Bold
\n');
+ });
+ test('should render italic', () => {
+ expect(new RMark().render('*Italic*')).toBe('\nItalic
\n');
+ expect(new RMark().render('_Italic_')).toBe('\nItalic
\n');
+ });
+ test('should render image', () => {
+ expect(new RMark().render('')).toBe('\n
\n');
+ });
+ test('should render link', () => {
+ expect(new RMark().render('[Link](https://github.com)')).toBe('\nLink
\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-legacy/dist/lib/markdown/index.test.js.map b/packages/discourse-legacy/dist/lib/markdown/index.test.js.map
new file mode 100644
index 00000000..2a1d789d
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/page.d.ts b/packages/discourse-legacy/dist/lib/markdown/page.d.ts
new file mode 100644
index 00000000..509db186
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/page.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/discourse-legacy/dist/lib/markdown/page.js b/packages/discourse-legacy/dist/lib/markdown/page.js
new file mode 100644
index 00000000..1ec0eeb9
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/page.js
@@ -0,0 +1,26 @@
+import { RMark } from '.';
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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);
+}
+//# sourceMappingURL=page.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/markdown/page.js.map b/packages/discourse-legacy/dist/lib/markdown/page.js.map
new file mode 100644
index 00000000..2bd15c8f
--- /dev/null
+++ b/packages/discourse-legacy/dist/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,GAAG,CAAC;AAE1B,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-legacy/dist/lib/markdown/types.d.ts b/packages/discourse-legacy/dist/lib/markdown/types.d.ts
new file mode 100644
index 00000000..912a5295
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/markdown/types.js b/packages/discourse-legacy/dist/lib/markdown/types.js
new file mode 100644
index 00000000..4513f1e0
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/markdown/types.js
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/markdown/types.js.map b/packages/discourse-legacy/dist/lib/markdown/types.js.map
new file mode 100644
index 00000000..ececb0df
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/lib/oa/commons.d.ts b/packages/discourse-legacy/dist/lib/oa/commons.d.ts
new file mode 100644
index 00000000..bc98fa98
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/commons.d.ts
@@ -0,0 +1,27 @@
+import { IUploadedFileMeta } from '@polymech/commons';
+import { IOACategory, IOATags, IOAHowtoImport } from '../../';
+export declare const DEFAULT_HT_CATEGORY: {
+ _modified: string;
+ label: string;
+ _id: string;
+ _created: string;
+ _deleted: boolean;
+};
+export declare const LATEST_TRACK = "${OSR_ROOT}/oa-data/howtos/latest_track.json";
+export declare const LATEST_TEST = "./latest_test.json";
+export declare const DEFAULT_USER = "katharinaelleke";
+export declare const getDataPath: (_path?: string) => string;
+export declare const getHowtosPath: () => string;
+export declare const getHowtos: () => IOAHowtoImport[];
+export declare const read_howtos: (src: string) => IOAHowtoImport[];
+export declare const read_categories: (src: string) => IOACategory[];
+export declare const read_tags: (src: string) => IOATags[];
+export declare const filter_valid: (users: IOAHowtoImport[]) => IOAHowtoImport[];
+export declare const kb_howto_folder: (howto: any) => string;
+export declare const kb_howto_file: (howto: any, filename: any) => string;
+export declare const getHowtoUser: (howto: IOAHowto) => any;
+export declare const toMDImage: (image: IUploadedFileMeta) => string;
+export declare const md_edit_wrap: (content: any, f: any, prefix?: string, context?: string) => any;
+export declare const removeEmojis: (string: any) => any;
+export declare const toHTML: (path: any, markdown: any) => any;
+export declare const createTextLinks_: (text: any) => any;
diff --git a/packages/discourse-legacy/dist/lib/oa/commons.js b/packages/discourse-legacy/dist/lib/oa/commons.js
new file mode 100644
index 00000000..89b26cd2
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/commons.js
@@ -0,0 +1,88 @@
+import { sanitize } from './lib';
+import * as path from 'path';
+import { sync as read } from '@polymech/fs/read';
+import { resolve } from '@polymech/commons';
+import { getUsers } from './users';
+import { html_beautify } from 'js-beautify';
+import { Converter } from 'showdown';
+var escapeHtml = require('escape-html');
+const pretty = require('pretty');
+const TEST = false;
+export const DEFAULT_HT_CATEGORY = {
+ "_modified": "2022-09-18T08:51:47.196Z",
+ "label": "Guides",
+ "_id": "CrZjHORWfxEl6iDrrPIO",
+ "_created": "2022-09-18T08:51:47.196Z",
+ "_deleted": false
+};
+export const LATEST_TRACK = '${OSR_ROOT}/oa-data/howtos/latest_track.json';
+export const LATEST_TEST = './latest_test.json';
+export const DEFAULT_USER = 'katharinaelleke';
+export const getDataPath = (_path = '') => path.resolve(path.join(resolve('${OSR_ROOT}/oa-data/howtos/'), _path));
+export const getHowtosPath = () => path.resolve(resolve(TEST ? LATEST_TEST : LATEST_TRACK));
+export const getHowtos = () => read(path.resolve(getHowtosPath()), 'json') || [];
+export const read_howtos = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_howtos;
+};
+export const read_categories = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_categories;
+};
+export const read_tags = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_tags;
+};
+export const filter_valid = (users) => {
+ return users.filter((user) => {
+ if (user.title === 'Build a Fishing Canoe') {
+ //debugger
+ }
+ if (user.moderation.toLowerCase() !== 'accepted') {
+ return false;
+ }
+ return true;
+ });
+};
+export const kb_howto_folder = (howto) => path.resolve(path.join(resolve("${KB_ROOT}/src/howtos/"), howto.slug));
+export const kb_howto_file = (howto, filename) => path.resolve(path.join(resolve("${KB_ROOT}/src/howtos/"), howto.slug, sanitize(filename)));
+export const getHowtoUser = (howto) => {
+ const users = getUsers();
+ let user = users.find((u) => u._id == howto._createdBy);
+ if (user && user.f_id) {
+ return user;
+ }
+ else {
+ user = users.find((u) => u._id == DEFAULT_USER);
+ if (user && user.f_id) {
+ console.error('using default user : ' + DEFAULT_USER + ' : for' + howto.slug);
+ return user;
+ }
+ }
+};
+export const toMDImage = (image) => ``;
+export const md_edit_wrap = (content, f, prefix = '', context = '') => html_beautify(`${content}
`);
+export const removeEmojis = (string) => {
+ return string.replace(/([#0-9]\u20E3)|[\xA9\xAE\u203C\u2047-\u2049\u2122\u2139\u3030\u303D\u3297\u3299][\uFE00-\uFEFF]?|[\u2190-\u21FF][\uFE00-\uFEFF]?|[\u2300-\u23FF][\uFE00-\uFEFF]?|[\u2460-\u24FF][\uFE00-\uFEFF]?|[\u25A0-\u25FF][\uFE00-\uFEFF]?|[\u2600-\u27BF][\uFE00-\uFEFF]?|[\u2900-\u297F][\uFE00-\uFEFF]?|[\u2B00-\u2BF0][\uFE00-\uFEFF]?|(?:\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDEFF])[\uFE00-\uFEFF]?/g, '');
+};
+export const toHTML = (path, markdown) => {
+ const content = read(path, 'string');
+ if (!markdown) {
+ let converter = new Converter({ tables: true });
+ converter.setOption('literalMidWordUnderscores', 'true');
+ return converter.makeHtml(content);
+ }
+ else {
+ return content;
+ }
+};
+export const createTextLinks_ = (text) => {
+ return (text || "").replace(/([^\S]|^)(((https?\:\/\/)|(www\.))(\S+))/gi, function (match, space, url) {
+ var hyperlink = url;
+ if (!hyperlink.match('^https?:\/\/')) {
+ hyperlink = 'http://' + hyperlink;
+ }
+ return space + '' + url + ' ';
+ });
+};
+//# sourceMappingURL=commons.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/commons.js.map b/packages/discourse-legacy/dist/lib/oa/commons.js.map
new file mode 100644
index 00000000..1251d34f
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/commons.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/lib/oa/commons.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/howtos.d.ts b/packages/discourse-legacy/dist/lib/oa/howtos.d.ts
new file mode 100644
index 00000000..4fa1ec3a
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/howtos.d.ts
@@ -0,0 +1,9 @@
+import { IOAHowtoImport } from '../../';
+export declare const mergeLatest: (discorse: any, options: IOptions, oa_howtos: IOAHowtoImport[]) => IOAHowtoImport[];
+export declare const read_fragments: (src: any, config: any, prefix?: string, context?: string) => any;
+export declare function howto_content(howto: IOAHowtoImport, folder: string, fragments: any, templates: any): Promise;
+export declare const createHowtoTopic: (discourse: any, howto: IOAHowtoImport, create?: boolean) => Promise;
+export declare const importHowto: (discorse: any, howto: IOAHowtoImport) => Promise;
+export declare const importHowtos: (discorse: any, options: IOptions, howtos: IOAHowtoImport[]) => Promise;
+export declare const updateHowto: (discourse: Discourser, howto: IOAHowtoImport, options: IOptions) => Promise;
+export declare const updateHowtos: (discorse: any, options: IOptions, howtos: IOAHowtoImport[]) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/oa/howtos.js b/packages/discourse-legacy/dist/lib/oa/howtos.js
new file mode 100644
index 00000000..e5d882ae
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/howtos.js
@@ -0,0 +1,464 @@
+import { Promise as BPromise } from 'bluebird';
+import { forward_slash } from '@polymech/commons';
+import { resolveConfig } from '@polymech/core';
+import { substitute } from '@polymech/core/strings';
+import { logger } from '../../index';
+import { HT_CATS } from '../discourse/constants';
+import { sanitize } from './lib';
+import * as path from 'path';
+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 * as cheerio from 'cheerio';
+import { get_user_name } from './users';
+var escapeHtml = require('escape-html');
+import { sync as mkdir } from '@polymech/fs/dir';
+import { files } from '@polymech/commons';
+const FUCKING_TOKEN = 'j7oYrkQe5nbnikCNHcfoP2DGtXKV4iHHzDFip8gGatS145g3B65UU6mI09KeFday9mY5HNQnU2jXUTe7LLkP-w';
+import { kb_howto_file, kb_howto_folder, getHowtos, getHowtosPath, getHowtoUser, md_edit_wrap, toHTML, toMDImage, createTextLinks_, removeEmojis, DEFAULT_HT_CATEGORY, read_tags } from './commons';
+export const mergeLatest = (discorse, options, oa_howtos) => {
+ const howtos = getHowtos();
+ oa_howtos.forEach((h) => {
+ const howto = howtos.find((tu) => {
+ return tu._id === h._id;
+ });
+ if (!howto) {
+ howtos.push(h);
+ }
+ });
+ write(getHowtosPath(), howtos);
+ return howtos;
+};
+const updateHowtoFile = (howto) => {
+ const howtos = getHowtos();
+ const index = howtos.findIndex((u) => u._id == howto._id);
+ howtos[index] = howto;
+ write(getHowtosPath(), howtos);
+};
+const uploadImage = async (discourse, user, image, localPath) => {
+ if (image.data) {
+ return image;
+ }
+ logger.debug('uploading image:', image.name);
+ const upped = await discourse.uploadFile(user.f_id, localPath);
+ const data = upped.data;
+ if (data && data.id) {
+ image.data = data;
+ }
+ else {
+ logger.error('error uploading image');
+ }
+ return image;
+};
+export const read_fragments = (src, config, prefix = '', context = '') => {
+ if (!exists(src)) {
+ mkdir(src);
+ }
+ let fragments = files(src, '*.html');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, true), f, prefix, context);
+ });
+ fragments = files(src, '*.md');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, false), f, prefix, context);
+ });
+ return config;
+};
+export async function howto_content(howto, folder, fragments, templates) {
+ //const tags = data.v3_tags;
+ const howtoTags = [];
+ /*
+ for (const ht in howto.tags) {
+ const gt = tags.find((t) => t._id === ht);
+ if (gt) {
+ howtoTags.push(gt.label);
+ // logger.debug('resolved ' + ht + ' to ' + gt.label);
+ } else {
+ // logger.error('Cant resolve tag : ' + ht);
+ }
+ }
+*/
+ howto.slug = howto.slug.trim();
+ let s = '';
+ let step_template = "" + templates.step;
+ let invalid_step_images = false;
+ const step_image = (i) => {
+ if (!i.data || !i.data.short_url) {
+ logger.error('invalid image : ' + i.downloadUrl + ' : ' + howto.slug);
+ invalid_step_images = true;
+ return '\n';
+ }
+ return `\n${toMDImage(i)}`;
+ };
+ const step_file = (i) => {
+ const image = `/howtos/${howto.slug}/${encodeURIComponent(sanitize(i.name))}`;
+ return ``;
+ };
+ const step_files = (s) => {
+ const files = s.files.map(step_file).join('\n');
+ return `
+ ${files}
+
+ `;
+ };
+ const step_images = (s) => {
+ const images = s.images.map(step_image).join('\n');
+ return `${images}`;
+ };
+ const step_images_gallery = (s) => {
+ const images = s.images.map(step_image).join('');
+ return `\n${images}
`;
+ };
+ const step = (s, i) => {
+ const t = substitute(step_template, {
+ title: s.title,
+ text: createTextLinks_(escapeHtml(s.text.trim()).replace(/(?:\r\n|\r|\n)/g, '\n\n')),
+ step_number: i + 1,
+ images: s.images.length > 1 ? step_images_gallery(s) : step_images(s)
+ });
+ return t;
+ };
+ const steps = howto.steps.map((s, i) => step(s, i)).join('\n\n');
+ const attachments = howto.files.map((f) => {
+ return `[${sanitize(f.name)}](${f.downloadUrl})`;
+ });
+ howto.description = removeEmojis(howto.description);
+ howto.description = createTextLinks_(howto.description);
+ let authorName = (howto.user && howto.user.data && howto.user.data && howto.user.data.title) ? howto.user.data.title : (howto.user ? howto.user._id : 'OSR-Plastic');
+ if (authorName === 'Precious Plastic Headquarters') {
+ authorName = 'Precious Plastic Nantes';
+ }
+ let _3dFiles = [...files(path.resolve(`${folder}`), '**/**/*.step'), ...files(path.resolve(`${folder}`), '**/**/*.STEP'), ...files(path.resolve(`${folder}`), '**/**/*.stp')];
+ _3dFiles = _3dFiles.map((f) => {
+ return forward_slash(`${howto.slug}/${path.relative(path.resolve(folder), f)}`);
+ });
+ let previews = '';
+ if (_3dFiles.length) {
+ previews += '';
+ previews += '
';
+ _3dFiles = _3dFiles.map((f) => {
+ return `
+
+ 3D Step File: ${f.replace(howto.slug, '')} -
+
+ Preview
+
+ `;
+ });
+ previews += _3dFiles.join('');
+ previews += ' ';
+ }
+ if (invalid_step_images) {
+ return false;
+ }
+ let index = substitute(templates.howto, {
+ ...fragments,
+ image: `/howtos/${howto.slug}/${encodeURIComponent(sanitize(howto.cover_image.name))}`,
+ title: howto.title.trim(),
+ description: escapeHtml(howto.description.trim()) || "",
+ enabled: howto.moderation == "accepted" ? true : false,
+ steps: steps,
+ keywords: ['Precious plastic', 'Preciousplastic', 'plastichub', 'osr', ...howtoTags].join(','),
+ user: howto._createdBy,
+ files: `${attachments.join('\n')}`,
+ authorName: authorName,
+ authorUrl: `https://osr-plastic.org/users/${howto.user ? howto.user._id : 'https://osr-plastic.org/users/plastichub'}.html`,
+ // short: escapeHtml(howto.description.trim()).substring(0, 100) + '....',
+ slug: howto.slug,
+ previews3D: previews
+ });
+ const $ = cheerio.load(index, {
+ xmlMode: true
+ });
+ /*
+ $('a').each(function () {
+ const url = $(this).attr("href");
+ logger.debug('url : ' + url);
+ if(url.indexOf('dropbox')){
+
+ }
+ });*/
+ //write(index_md, pretty(index, { ocd: true }));
+ return removeEmojis(index);
+}
+export const createHowtoTopic = async (discourse, howto, create = true) => {
+ if (!howto.category || !howto.category.label) {
+ howto.category = DEFAULT_HT_CATEGORY;
+ logger.error(`create howto : invalid category: ${howto.category} : ${howto.slug}`);
+ }
+ const user = getHowtoUser(howto);
+ if (!user) {
+ logger.error(`create howto : invalid user : ${howto._createdBy} :: ${howto.title}`);
+ }
+ const howto_folder = kb_howto_folder(howto);
+ const howto_cover_image = kb_howto_file(howto, howto.cover_image.name);
+ if (!exists(howto_folder)) {
+ logger.error('howto folder doesnt exists', howto.title);
+ }
+ if (!exists(howto_cover_image)) {
+ logger.error('howto cover image doesnt exists', howto.title);
+ }
+ if (!user || !user.f_id) {
+ logger.error(`create howto : invalid user : ${howto._createdBy} :: ${howto.title}`);
+ return false;
+ }
+ howto.cover_image = await uploadImage(discourse, user, howto.cover_image, howto_cover_image);
+ updateHowtoFile(howto);
+ let invalid_images = false;
+ for (const step of howto.steps) {
+ let i = 0;
+ for await (const image of step.images) {
+ const image_name = sanitize(image.name);
+ const imagePath = path.resolve(path.join(howto_folder, sanitize(image_name)));
+ if (!exists(imagePath)) {
+ logger.error('step image doesnt exists : ' + image.name + ' in ' + howto.slug);
+ invalid_images = true;
+ continue;
+ }
+ step.images[i] = await uploadImage(discourse, user, step.images[i], imagePath);
+ updateHowtoFile(howto);
+ i++;
+ }
+ }
+ if (invalid_images) {
+ logger.error('invalid images : ' + howto.slug);
+ return false;
+ }
+ const cat = HT_CATS[howto.category.label];
+ if (!cat) {
+ logger.error('invalid kat');
+ return false;
+ }
+ const templatesRoot = path.resolve(resolve("${OSR_ROOT}/osr-templates/discourse"));
+ const cPath = path.resolve(`${templatesRoot}/base.json`);
+ logger.debug(`read config at ${cPath}`);
+ const config = read(cPath, 'json');
+ const templates = path.resolve(`${templatesRoot}/howto`);
+ if (!exists(templates)) {
+ logger.error(`\t Cant find templates at ${templates}, path doesn't exists`);
+ return;
+ }
+ let fragments = { ...config.variables };
+ read_fragments(templates, fragments, "product_rel_path_name", "machine");
+ let template = read(path.resolve(`${templates}/howto.md`), 'string');
+ let step = read(path.resolve(`${templates}/step.md`), 'string');
+ resolveConfig(fragments);
+ const content = await howto_content(howto, howto_folder, fragments, {
+ howto: template,
+ step: '' + step
+ });
+ if (!content) {
+ logger.error('invalid content : ' + howto.slug);
+ return;
+ }
+ let data;
+ if (create) {
+ data = await discourse.createPost(sanitize(howto.title), content, cat);
+ if (data) {
+ logger.debug('created topic : ' + howto.title + ' : ' + data.id);
+ if (data && data.id) {
+ howto.post_id = data.id;
+ howto.topic_id = data.topic_id;
+ updateHowtoFile(howto);
+ try {
+ logger.debug('change user to ', user._id);
+ await discourse.changeOwner(howto.post_id, howto.topic_id, get_user_name(user));
+ }
+ catch (e) {
+ logger.debug('changing owner ' + howto.title + ' failed!');
+ howto.oF = true;
+ updateHowtoFile(howto);
+ }
+ }
+ else {
+ logger.debug('creating ' + howto.title + ' failed!', data.errors);
+ howto.post_id = 'failed';
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + howto.slug);
+ howto.post_id = 'already';
+ }
+ }
+ updateHowtoFile(howto);
+ }
+ }
+ }
+ else {
+ data = await discourse.updatePost(howto.post_id, content);
+ howto._updatedContent1 = true;
+ updateHowtoFile(howto);
+ }
+};
+export const importHowto = async (discorse, howto) => {
+ //const howtos = getHowtos()
+ //const index = howtos.findIndex((u) => u._id == howto._id)
+ const ret = await createHowtoTopic(discorse, howto);
+ return ret;
+};
+export const importHowtos = async (discorse, options, howtos) => {
+ logger.debug('read howtos from ', path.resolve(getHowtosPath()));
+ howtos = mergeLatest(discorse, options, howtos);
+ howtos = howtos.filter((h) => {
+ if (h.title === 'Build a Fishing Canoe') {
+ //debugger
+ }
+ if (h.post_id || h.post_id < 0) {
+ return false;
+ }
+ if (h.post_id === 'failed') {
+ logger.debug('skip failed : ' + h.slug);
+ return false;
+ }
+ //if (u.alreadyExists || u.invalidData) {
+ // return false;
+ //}
+ return true;
+ });
+ return await BPromise.resolve(howtos).map((h) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = importHowto(discorse, h);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating howto ' + h._id, e);
+ }
+ }, { concurrency: 1 });
+};
+/////////////////////////////////////////////////////////////////////////
+//
+// Update Howtos
+//
+let _discorseTags;
+const getDiscourseTags = async (discourse) => {
+ if (!_discorseTags) {
+ _discorseTags = await discourse.getTags();
+ }
+ return _discorseTags;
+};
+export const updateHowto = async (discourse, howto, options) => {
+ const tags = read_tags(options.src);
+ let howtoTags = [];
+ for (const ht in howto.tags) {
+ const t = ht;
+ const gt = tags.find((t) => {
+ return t._id === ht;
+ });
+ if (gt) {
+ howtoTags.push(gt.label);
+ }
+ else {
+ // logger.error('Cant resolve tag : ' + ht);
+ }
+ }
+ howtoTags.push('oa-import');
+ let discorseTags = await getDiscourseTags(discourse);
+ const cat = HT_CATS[howto.category.label];
+ if (howtoTags && howtoTags.length) {
+ try {
+ const ret = await discourse.updateTopic(howto.topic_id, cat, sanitize(howto.title), howtoTags);
+ logger.debug('Updating howto tags : ' + howto.title);
+ }
+ catch (error) {
+ logger.error('Error updating post' + howto.title, howto.topic_id, cat, howtoTags, error);
+ howto['updateFailed1'] = 1;
+ updateHowtoFile(howto);
+ //debugger
+ }
+ }
+ howto.updatedTags = true;
+ updateHowtoFile(howto);
+ const _date = howto._modified || howto._created;
+ if (_date) {
+ let date = new Date(_date);
+ logger.debug('update ts ' + howto.slug + ' : ' + new Date(date).toLocaleDateString());
+ let offset = 0;
+ const valueOf = date.valueOf() - (offset) * 60000;
+ let ts = Math.floor(valueOf / 1000);
+ const tUpdate = await discourse.updateTopicTimestamp(howto.topic_id, ts, FUCKING_TOKEN);
+ if (tUpdate) {
+ howto.updatedTime8 = true;
+ updateHowtoFile(howto);
+ return true;
+ }
+ }
+ else {
+ logger.error('Have no ts : ' + howto.slug);
+ }
+};
+export const updateHowtos = async (discorse, options, howtos) => {
+ logger.debug('update howtos from ', path.resolve(getHowtosPath()));
+ howtos = mergeLatest(discorse, options, howtos);
+ const forceUpdateContent = true;
+ const forceUpdateMeta = true;
+ const updateContent = true;
+ const updateMeta = true;
+ howtos = howtos.filter((h) => {
+ if (!h.post_id || !h.topic_id) {
+ return false;
+ }
+ if (h.post_id === 'failed') {
+ logger.debug('skip failed : ' + h.slug);
+ return false;
+ }
+ if (forceUpdateContent || forceUpdateMeta) {
+ return true;
+ }
+ if (!h._updatedContent1) {
+ return true;
+ }
+ if (h.updatedTags && h.updatedTime8) {
+ return false;
+ }
+ if (!h.updatedTags || !h.updatedTime8) {
+ return true;
+ }
+ return true;
+ });
+ return await BPromise.resolve(howtos).map((h) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ if (updateContent) {
+ logger.debug('\t recook howto content', h.title);
+ let d = createHowtoTopic(discorse, h, false);
+ d.then(() => {
+ if (updateMeta) {
+ d = updateHowto(discorse, h, options);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }
+ else {
+ resolve(1);
+ }
+ });
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating howto ' + h._id, e);
+ }
+ }, { concurrency: 1 });
+};
+//# sourceMappingURL=howtos.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/howtos.js.map b/packages/discourse-legacy/dist/lib/oa/howtos.js.map
new file mode 100644
index 00000000..6f7996bc
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/howtos.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"howtos.js","sourceRoot":"","sources":["../../../src/lib/oa/howtos.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/index.d.ts b/packages/discourse-legacy/dist/lib/oa/index.d.ts
new file mode 100644
index 00000000..7966de83
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/index.d.ts
@@ -0,0 +1,3 @@
+export * from './lib';
+export * from './users';
+export * from './types';
diff --git a/packages/discourse-legacy/dist/lib/oa/index.js b/packages/discourse-legacy/dist/lib/oa/index.js
new file mode 100644
index 00000000..93399d18
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/index.js
@@ -0,0 +1,4 @@
+export * from './lib';
+export * from './users';
+export * from './types';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/index.js.map b/packages/discourse-legacy/dist/lib/oa/index.js.map
new file mode 100644
index 00000000..0bcd6c17
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/oa/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/lib.d.ts b/packages/discourse-legacy/dist/lib/oa/lib.d.ts
new file mode 100644
index 00000000..49c99ad8
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/lib.d.ts
@@ -0,0 +1,3 @@
+export declare const sanitize: (f: any) => string;
+export declare const getImageName: (url: any) => string;
+export declare const convert: (input: string) => any;
diff --git a/packages/discourse-legacy/dist/lib/oa/lib.js b/packages/discourse-legacy/dist/lib/oa/lib.js
new file mode 100644
index 00000000..cec1cfe1
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/lib.js
@@ -0,0 +1,191 @@
+const _sanitize = require("sanitize-filename");
+const URI = require("uri-js");
+import * as path from 'path';
+const filenamify = require('filenamify');
+var TurndownService = require('turndown');
+export const sanitize = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "");
+ if (str.startsWith('_')) {
+ str = str.substring(1);
+ }
+ return str;
+};
+export const getImageName = (url) => {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ const fileName = sanitize(decodeURIComponent(pParsed.base));
+ return fileName;
+};
+export const convert = (input) => {
+ var turndownService = new TurndownService();
+ return turndownService.turndown(input);
+};
+/*
+
+
+const getFUser = (users, user_name) => {
+ return users.find((u) => {
+ return u.name == user_name
+ })
+}
+
+
+const indexUsers = async (d, forum: string, detail) => {
+
+ const forumUsers = await getForumUsers(d, detail)
+ const raw = (read(path.resolve(forum + '/index.json'), 'json') as any)
+ const users_raw = raw.users
+ let users = []
+ for (let u in users_raw) {
+ const user = users_raw[u];
+ const avatar = getOAvatar(raw, u);
+ let aFileName = '';
+ let fUser = getFUser(forumUsers, u);
+ if (avatar) {
+ const parsed = URI.parse(avatar);
+ const pParsed = path.parse(parsed.path);
+ aFileName = pParsed.base;
+ }
+ users.push({
+ name: u,
+ avatar: avatar,
+ avatarFileName: aFileName,
+ user_id: fUser ? fUser.id : -1
+ });
+ }
+ write(path.resolve(forum + '/user.json'), users);
+}
+
+const _createUser = async (discorse, forum, name, email) => {
+
+ const users = getUsers()
+ const index = users.findIndex((u) => u.detail.name == name)
+ let user = await createUser(discorse, null)
+
+
+ if (user && users[index].upload_id) {
+ await discorse.setUserAvatar(name, users[index].upload_id);
+ //return users;
+ }
+
+ if (user > 0 && index) {
+ users[index].f_id = user;
+ console.log('created ' + name + ' ' + user);
+ write(getUsersPath(), users);
+ } else {
+ console.error('cant create user - error', name, user)
+ }
+}
+
+
+const _updateGroup = async (discorse, forum, name, id, forumUsers) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const index = users.findIndex((u) => u.name == name);
+ try {
+ const d = await discorse.updateGroup(name, pUserGroup);
+ console.log('updated user group for ' + name);
+ users[index].g_id = pUserGroup;
+ write(path.resolve(forum + '/user.json'), users);
+ if (users[index].upload_id) {
+ //await discorse.setUserAvatar(name, users[index].upload_id);
+ }
+ } catch (e) {
+ if (e.data && e.data.status == 422) {
+ users[index].g_id = pUserGroup;
+ write(path.resolve(forum + '/user.json'), users);
+ console.log('updated user group for ' + name);
+ }
+ }
+}
+
+const _updateAvatar = async (discorse, forum, name) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const index = users.findIndex((u) => u.name == name);
+ return new Promise((resolve, reject) => {
+ try {
+ setTimeout(() => {
+ discorse.setUserAvatar(name, users[index].upload_id).then(() => {
+ console.log('updated avatar for ' + name);
+ users[index].avatarSet = true;
+ write(path.resolve(forum + '/user.json'), users);
+ resolve(1);
+ });
+ }, 200);
+ } catch (e) {
+ console.error('-error setting avatar', e);
+ debugger;
+ }
+ });
+}
+
+
+const createUsers = async (d, forum) => {
+
+ const forumUsers = await getForumUsers(d, true)
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeCreated = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return false;
+ }
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+
+ console.log('Create Users ' + users.length + ' Total | Left: ' + toBeCreated.length);
+
+ return await BPromise.resolve(toBeCreated).map((u: any) => {
+ const t = _createUser(d, forum, u.name, u.email);
+ return t;
+ }, { concurrency: 1 })
+
+}
+
+const updateUserGroups = async (forum) => {
+ const forumUsers = (read(path.resolve(forum + '/fusers.json'), 'json') as any);
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeUpdated = users.filter((u) => {
+ if (u.g_id) {
+ return false;
+ }
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+ const d = getDiscourse();
+ console.log('Update Users ' + users.length + ' Total | Left: ' + toBeUpdated.length);
+ return await BPromise.resolve(toBeUpdated).map((u: any) => {
+ const t = _updateGroup(d, forum, u.name, u.f_id, forumUsers);
+ return t;
+ }, { concurrency: 1 })
+
+}
+
+const updateUserAvatars = async (forum) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeUpdated = users.filter((u) => {
+ if (!u.upload_id) {
+ return false;
+ }
+
+ if (u.avatarSet) {
+ return false;
+ }
+
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+ const d = getDiscourse();
+ console.log('Update User Avatar ' + users.length + ' Total | Left: ' + toBeUpdated.length);
+ return await BPromise.resolve(toBeUpdated).map((u: any) => {
+ const t = _updateAvatar(d, forum, u.name);
+ return t;
+ }, { concurrency: 1 })
+
+}
+*/
+//# sourceMappingURL=lib.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/lib.js.map b/packages/discourse-legacy/dist/lib/oa/lib.js.map
new file mode 100644
index 00000000..2ba90cb9
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/lib.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/lib/oa/lib.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AACxC,IAAI,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC1B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACrB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;KACzB;IACD,OAAO,GAAG,CAAA;AACd,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAI,CAAC,GAAG,EAAE,EAAE;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,OAAO,QAAQ,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;IACxC,IAAI,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IAC3C,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuKE"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/types.d.ts b/packages/discourse-legacy/dist/lib/oa/types.d.ts
new file mode 100644
index 00000000..166527cd
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/types.d.ts
@@ -0,0 +1,91 @@
+import { IUploadedFileMeta, I_OSR_USER } from '@polymech/commons';
+export interface IOACategory {
+ _created: string;
+ _id: string;
+ _deleted: boolean;
+ label: string;
+ _modified: string;
+}
+export interface IOATag {
+ categories: string[];
+ image: string;
+ _created: string;
+ _deleted: boolean;
+ label: string;
+ _createdBy: string;
+ _modified: string;
+ _id: string;
+}
+export type IOADifficultyLevel = 'Easy' | 'Medium' | 'Hard' | 'Very Hard';
+export interface IDImage {
+ id: number;
+ url: string;
+ original_filename: string;
+ filesize: number;
+ width: number;
+ height: number;
+ thumbnail_width: number;
+ thumbnail_height: number;
+ extension: string;
+ short_url: string;
+ short_path: string;
+ retain_hours: any;
+ human_filesize: string;
+}
+export interface IOAHowto {
+ moderation: string;
+ category: IOACategory;
+ previousSlugs: string[];
+ total_downloads: number;
+ _createdBy: string;
+ slug: string;
+ cover_image: IUploadedFileMeta;
+ _modified: string;
+ files: any[];
+ description: string;
+ mentions: any[];
+ time: string;
+ _created: string;
+ fileLink: string;
+ steps: IOAStep[];
+ creatorCountry: string;
+ title: string;
+ tags: IOATags;
+ _id: string;
+ _deleted: boolean;
+ total_views: number;
+ difficulty_level: IOADifficultyLevel;
+ comments: any[];
+ user: IImportUser;
+ pics?: string[];
+}
+export interface IOAStep {
+ _animationKey: string;
+ images: IUploadedFileMeta[];
+ text: string;
+ title: string;
+}
+export interface IOATags {
+ [key: string]: boolean;
+}
+export type IOAHowtoImport = IOAHowto & {
+ post_id?: number | string;
+ topic_id?: number;
+ oF?: boolean;
+ updatedTags?: boolean;
+ updatedTime8?: boolean;
+ _updatedContent1?: boolean;
+};
+export interface IImportUser extends I_OSR_USER {
+ f_id: number;
+ upload_id: number;
+ avatar: string;
+ _didSetAvatar: boolean;
+ _didSetGroup: boolean;
+ alreadyExists: boolean;
+ invalidData: boolean;
+ didUpdateName: boolean;
+ profileHeader?: IDImage;
+ cardBackground?: IDImage;
+ avatarImage?: IDImage;
+}
diff --git a/packages/discourse-legacy/dist/lib/oa/types.js b/packages/discourse-legacy/dist/lib/oa/types.js
new file mode 100644
index 00000000..4513f1e0
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/types.js
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/types.js.map b/packages/discourse-legacy/dist/lib/oa/types.js.map
new file mode 100644
index 00000000..8242903b
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/oa/types.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/users.d.ts b/packages/discourse-legacy/dist/lib/oa/users.d.ts
new file mode 100644
index 00000000..c5220331
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/users.d.ts
@@ -0,0 +1,29 @@
+import { I_OSR_USER } from '@polymech/commons';
+import { IImportUser, IDiscourseUser } from '../../';
+export declare const read_users: (src: string) => I_OSR_USER[];
+export declare const filter_valid: (users: IImportUser[]) => IImportUser[];
+export declare const filter_email_only: (users: any[]) => any[];
+export declare const filter_invalid: (users: any[]) => any[];
+export declare const filter_email_missing: (users: any[]) => any[];
+export declare const filter_accepted: (users: IImportUser[]) => IImportUser[];
+export declare const oa_user_email: (user: I_OSR_USER) => string | false;
+export declare const get_user_name: (user: IImportUser) => any;
+export declare const get_user_display_name: (user: IImportUser) => any;
+export declare const getDataPath: (_path?: string) => string;
+export declare const getUsersPath: () => string;
+export declare const getUsers: () => IImportUser[];
+export declare const _getForumUsers: (d: Discourser, page: any, detail: any) => any;
+export declare const getForumUsers: (d: any, detail: any) => Promise;
+export declare const createUser: (discourse: Discourser, oa_user: IImportUser) => Promise;
+export declare const uploadAvatar: (discourse: any, name: any, filePath: any) => Promise;
+export declare const updateUser: (discorse: Discourser, oa_user: IImportUser) => Promise;
+export declare const importUser: (discorse: Discourser, oa_user: IImportUser) => Promise;
+export declare const mergeLatestUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => IImportUser[];
+export declare const mergeLatestUsersTest: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => IImportUser[];
+export declare const importUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
+export declare const updateUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
+export declare const md_edit_wrap: (content: any, f: any, prefix?: string, context?: string) => any;
+export declare const toHTML: (path: any, markdown: any) => any;
+export declare const imageName: (url: any) => any;
+export declare const read_fragments: (src: any, config: any, prefix?: string, context?: string) => any;
+export declare const indexUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/oa/users.js b/packages/discourse-legacy/dist/lib/oa/users.js
new file mode 100644
index 00000000..34976f8f
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/users.js
@@ -0,0 +1,906 @@
+import { Promise as BPromise } from 'bluebird';
+import { getImageName, sanitize } from './lib';
+import { capitalize, replaceAll } from '@polymech/core/utils';
+import * as path from 'path';
+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 { logger } from '../../index';
+const slugify = require('slugify');
+import { substitute } from '@polymech/core';
+import { html_beautify } from 'js-beautify';
+import { sync as mkdir } from '@polymech/fs/dir';
+import { files } from '@polymech/commons';
+import { Converter } from 'showdown';
+const URI = require("uri-js");
+import { OA_USER_IMPORT_GROUP, LATEST_TEST, LATEST_TRACK, FETCH_DUSERS, F_USERS_ALL, F_USERS_NOW, DEFAULT_PASSWORD, DATA_PATH, OA_DIRECTORY_OVERVIEW_TOPIC } from '../discourse/constants';
+const filenamify = require('filenamify');
+const fg = require('fast-glob');
+const TEST = false;
+export const read_users = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_mappins.filter((f) => f.data != null);
+};
+export const filter_valid = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (!user.data.title) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.heroImageUrl) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ //return false
+ }
+ return true;
+ });
+};
+export const filter_email_only = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return false;
+ }
+ if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
+ return false;
+ }
+ return true;
+ });
+};
+export const filter_invalid = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return true;
+ }
+ if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
+ return true;
+ }
+ if (user.moderation !== 'accepted') {
+ return true;
+ }
+ return false;
+ });
+};
+export const filter_email_missing = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ return false;
+ }
+ if (!user.data.urls.find((l) => l.name == 'Email')) {
+ return true;
+ }
+ return false;
+ });
+};
+export const filter_accepted = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (!user.detail.heroImageUrl) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ return false;
+ }
+ return true;
+ });
+};
+export const oa_user_email = (user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ let u = user.data.urls.find((l) => l.name == 'Email');
+ if (u) {
+ return u.url.replace('mailto:', '');
+ }
+};
+export const get_user_name = (user) => {
+ let ret = replaceAll('--', '-', sanitize(filenamify(user._id)).replace(/^\-+/g, '').replace(/\-$/, ''));
+ ret = ret.replace(/\-$/, '');
+ ret = ret.replace(/\_$/, '');
+ if (!oa_user_email(user)) {
+ ret += '-uc';
+ }
+ return ret;
+};
+export const get_user_display_name = (user) => replaceAll('--', '-', sanitize(filenamify(user.data.title)).replace(/^\-+/g, '').replace(/\-$/, ''));
+export const getDataPath = (_path = '') => path.resolve(path.join(resolve(DATA_PATH), _path));
+export const getUsersPath = () => path.resolve(resolve(TEST ? LATEST_TEST : LATEST_TRACK));
+export const getUsers = () => read(path.resolve(getUsersPath()), 'json') || [];
+let uPage = 1;
+let usersAll = [];
+export const _getForumUsers = async (d, page, detail) => {
+ 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(path.resolve(F_USERS_NOW), usersAll);
+ let fUsers = read(path.resolve(F_USERS_ALL), '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) {
+ logger.debug('Retrieve User Detail ' + u.name);
+ setTimeout(() => {
+ d.getUser(fUser.id).then((detail) => {
+ if (detail) {
+ fUser.detail = detail;
+ }
+ write(path.resolve('./fusers-all.json'), 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) => {
+ if (!FETCH_DUSERS) {
+ return read(getDataPath(F_USERS_ALL), 'json') || [];
+ }
+ return _getForumUsers(d, uPage, detail);
+};
+export const createUser = async (discourse, oa_user) => {
+ /*
+ Bazar
+ https://shop.osr-plastic.org
+ Website
+ website2
+ Instagram
+ https://www.instagram.com/osr_plastic/
+ Directory / Map Url
+ https://www.google.com/maps/contrib/117674167598277014013
+ OSR - Marketplace Url
+ https://shop.osr-plastic.org/plastichub/
+ */
+ if (!oa_user.data.title) {
+ return -120;
+ }
+ let name = replaceAll('--', '-', get_user_display_name(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
+ let user_name = get_user_name(oa_user);
+ name = user_name.replace(/\-$/, '');
+ name = user_name.replace(/\_$/, '');
+ let opts = {
+ "name": name,
+ "email": oa_user_email(oa_user) || `${user_name}_uc@osr-plastic.org`,
+ "password": DEFAULT_PASSWORD(),
+ "username": user_name,
+ "active": true,
+ "approved": true,
+ "user_fields[1]": true
+ };
+ let user = await discourse.createUser(opts);
+ if (name.length < 4) {
+ return -120;
+ }
+ if (user_name.length > 50) {
+ return -120;
+ }
+ if (user && user.errors) {
+ if (user.message === "Username must be no more than 50 characters" ||
+ user.message === 'Username must not contain a sequence of 2 or more special chars (.-_)') {
+ return -120;
+ }
+ if (user.message === "Username must be unique" || user.message === "Primary email has already been taken") {
+ return -100;
+ }
+ if (user.errors.email && user.errors.username) {
+ user = await discourse.getUserByUsername(user_name);
+ if (user && user.id && !oa_user._didSetGroup) {
+ try {
+ let gret = await discourse.updateGroup(user_name, OA_USER_IMPORT_GROUP);
+ }
+ catch (e) {
+ logger.error('error adding to group', user_name);
+ }
+ return user.id;
+ }
+ ;
+ }
+ logger.error('Error creating user ' + user_name, user.errors);
+ }
+ if (user && user.user_id) {
+ try {
+ await discourse.updateGroup(user_name, OA_USER_IMPORT_GROUP);
+ return user.user_id;
+ }
+ catch (e) {
+ logger.error('error adding to group', user_name);
+ return user.user_id;
+ }
+ }
+ else {
+ if (user && user.message && user.message == 'Username must be unique\nPrimary email has already been taken') {
+ logger.error('already created', oa_user.detail.name);
+ return -10;
+ }
+ else if (user && user.message && user.message == 'Your account is activated and ready to use.') {
+ if (user.user_id) {
+ return user.user_id;
+ }
+ return -10;
+ }
+ else {
+ logger.debug('cant create user ' + oa_user.detail.name, user);
+ }
+ return null;
+ }
+ return null;
+};
+export const uploadAvatar = async (discourse, name, filePath) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u.detail.name == name);
+ try {
+ const upped = await discourse.upload(1, filePath);
+ const data = upped.data;
+ if (data && data.id) {
+ users[index].upload_id = data.id;
+ logger.debug('uploaded avatar ' + name + ' ' + data.id);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('upload - error', name);
+ }
+ return users;
+ }
+ catch (error) {
+ users[index].upload_id = -1;
+ logger.error('error uploading avatar', name);
+ write(getUsersPath(), users);
+ }
+};
+const uploadAvatars = async (discourse, users) => {
+ const toBeUploaded = users.filter((u) => {
+ if (u.upload_id) {
+ return false;
+ }
+ const hero = getImageName(u.detail.heroImageUrl);
+ const avatar = findAvatar(u, hero);
+ if (!avatar) {
+ logger.error('cant find avatar : ', u._id, hero);
+ return false;
+ }
+ u.avatar = avatar;
+ return true;
+ });
+ return await BPromise.resolve(toBeUploaded).map((u) => {
+ if (!u.detail.name) {
+ return;
+ }
+ logger.debug('upload avatar : ' + u._id);
+ const t = uploadAvatar(discourse, u.detail.name, u.avatar);
+ return t;
+ }, { concurrency: 1 });
+};
+const findAvatar = (user, filename) => {
+ const root = path.resolve(resolve(DATA_PATH));
+ const _path = path.resolve(`${root}/${user._id}/${filename}`);
+ if (exists(_path)) {
+ return _path;
+ }
+ const files = fg.sync('**/**/*' + filename + '*', { dot: true, cwd: root, absolute: true });
+ if (files.length == 0) {
+ return false;
+ }
+ return files[0];
+};
+/////////////////////////////////////////////////////
+//
+// users
+//
+export const updateUser = async (discorse, oa_user) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u.detail.name == oa_user.detail.name);
+ const user_name = replaceAll('--', '-', get_user_name(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
+ let ret = null;
+ try {
+ ret = await discorse.updateUser(user_name, {
+ name: oa_user.data.title
+ });
+ try {
+ let location;
+ if (oa_user.geo) {
+ location = `${oa_user.geo.continent} / ${oa_user.geo.countryName} / ${oa_user.geo.city} `;
+ }
+ let website;
+ if (oa_user.data) {
+ website = oa_user.data.urls.find((l) => l.name == 'Website');
+ if (website) {
+ website = website.url;
+ }
+ }
+ let description;
+ if (oa_user.data) {
+ if (oa_user.data.description) {
+ description += oa_user.data.description;
+ }
+ description += '\n';
+ if (oa_user.data.services) {
+ let services = `### Services \n`;
+ let hasServices = false;
+ for (let s in oa_user.data.services[0]) {
+ if (oa_user.data.services[0][s]) {
+ services += `- [x] ${capitalize(s)}\n`;
+ hasServices = true;
+ }
+ }
+ if (hasServices) {
+ description += services;
+ }
+ }
+ }
+ let links = '';
+ if (oa_user.data.urls) {
+ links = oa_user.data.urls.filter((r) => r.name !== 'Bazar' && r.name !== 'sponsor the work').map((l) => {
+ let label = '' + l.name;
+ if (label === 'Social media') {
+ if (l.url.indexOf('facebook') !== -1) {
+ label = 'Facebook';
+ }
+ if (l.url.indexOf('instagram') !== -1) {
+ label = 'Instagram';
+ }
+ }
+ label += " - " + l.url;
+ label = label.replace("https://", "");
+ label = label.replace("http://", "");
+ label = label.replace("mailto:", "");
+ return `${label} `;
+ }).join(" \n");
+ description += '\n### Links\n';
+ description += links;
+ }
+ if (oa_user.location) {
+ description += `\n\n Get Directions \n`;
+ }
+ let updatePrefs = await discorse.updateUserProfile(user_name, {
+ bio_raw: replaceAll('undefined', '', description),
+ location,
+ website
+ });
+ }
+ catch (error) {
+ logger.error(`Error updating user prefs : ${user_name}`);
+ }
+ }
+ catch (error) {
+ logger.error('error updating user', oa_user._id, error.message);
+ return;
+ }
+ if (ret.status === 200) {
+ users[index].didUpdateName = true;
+ logger.debug('did update user', oa_user._id, ' # ', oa_user.data.title);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('did update user failed ', oa_user._id);
+ }
+};
+export const importUser = async (discorse, oa_user) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u._id == oa_user._id);
+ let user = null;
+ try {
+ user = await createUser(discorse, oa_user);
+ }
+ catch (error) {
+ debugger;
+ logger.error('error creating user', error);
+ return false;
+ }
+ if (user === -100) {
+ users[index].alreadyExists = true;
+ write(getUsersPath(), users);
+ return;
+ }
+ if (user === -120) {
+ users[index].invalidData = true;
+ write(getUsersPath(), users);
+ return;
+ }
+ if (user && users[index].upload_id && !users[index]._didSetAvatar) {
+ try {
+ await discorse.setUserAvatar(get_user_name(oa_user), users[index].upload_id);
+ }
+ catch (e) {
+ logger.error('error setting avatar', get_user_name(oa_user));
+ }
+ }
+ const _t = users[index];
+ if (user > 0) {
+ users[index].f_id = user;
+ users[index]._didSetAvatar = true;
+ users[index]._didSetGroup = true;
+ logger.debug('\t created ' + oa_user.data.title);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('cant create user - error', oa_user.detail.name, user);
+ }
+ return users[index];
+};
+export const mergeLatestUsers = (discorse, options, oa_users) => {
+ const users = getUsers();
+ oa_users.forEach((u) => {
+ const tUser = users.find((tu) => {
+ return tu._id === u._id;
+ });
+ if (!tUser) {
+ users.push(u);
+ }
+ });
+ logger.debug(`Merged users to ${getUsersPath()}`);
+ write(getUsersPath(), users);
+ return users;
+};
+export const mergeLatestUsersTest = (discorse, options, oa_users) => {
+ const users = (read(LATEST_TEST, 'json') || []);
+ oa_users.forEach((u) => {
+ const tUser = users.find((u) => {
+ return u._id === u._id;
+ });
+ if (!tUser) {
+ users.push(u);
+ }
+ });
+ write(options.track, users);
+ return users;
+};
+export const importUsers = async (discorse, options, oa_users) => {
+ logger.debug('read users from ', path.resolve(getUsersPath()));
+ let users = mergeLatestUsers(discorse, options, oa_users);
+ //const users = mergeLatestUsersTest(discorse, options, oa_users)
+ users = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return false;
+ }
+ if (u.detail.name === 'plastichub' || u.detail.name === 'lu' || u.detail.name === 'timberstar' || u.detail.name === 'nickname') {
+ return false;
+ }
+ if (u.alreadyExists || u.invalidData) {
+ return false;
+ }
+ return true;
+ });
+ logger.debug('Create Users ' + users.length + ' Total | Left: ' + users.length);
+ await uploadAvatars(discorse, users);
+ return await BPromise.resolve(users).map((u) => {
+ logger.debug('import user ' + get_user_name(u));
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = importUser(discorse, u);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e);
+ }
+ }, { concurrency: 1 });
+};
+export const updateUsers = async (discorse, options, oa_users) => {
+ // https://forum.osr-plastic.org/u/easymoulds/preferences/profile
+ const users = mergeLatestUsers(discorse, options, oa_users);
+ //const users = mergeLatestUsersTest(discorse, options, oa_users)
+ let toBeCreated = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return true;
+ }
+ if (u.didUpdateName) {
+ return false;
+ }
+ return true;
+ });
+ const testUser = 'easymoulds';
+ const test = toBeCreated.find((u) => {
+ return u._id === testUser;
+ });
+ // toBeCreated = [test]
+ return await BPromise.resolve(toBeCreated).map((u) => {
+ /*
+ if (u.didUpdateName) {
+ return false
+ }
+ */
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = updateUser(discorse, u);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 200);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e);
+ }
+ }, { concurrency: 1 });
+};
+export const md_edit_wrap = (content, f, prefix = '', context = '') => {
+ return html_beautify(`${content}
`);
+};
+export const toHTML = (path, markdown) => {
+ const content = read(path, 'string');
+ if (!markdown) {
+ let converter = new Converter({ tables: true });
+ converter.setOption('literalMidWordUnderscores', 'true');
+ return converter.makeHtml(content);
+ }
+ else {
+ return content;
+ }
+};
+export const imageName = (url) => {
+ if (!url) {
+ return "";
+ }
+ try {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ return sanitize(decodeURIComponent(pParsed.base));
+ }
+ catch (error) {
+ logger.error('error image name : ', url);
+ return "";
+ }
+};
+export const read_fragments = (src, config, prefix = '', context = '') => {
+ if (!exists(src)) {
+ //debug.warn(`Create template folder ${src}`);
+ mkdir(src);
+ }
+ let fragments = files(src, '*.html');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, true), f, prefix, context);
+ });
+ fragments = files(src, '*.md');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, false), f, prefix, context);
+ });
+ return config;
+};
+export const indexUsers = async (discorse, options, oa_users) => {
+ let users = mergeLatestUsers(discorse, options, oa_users);
+ users = users.filter((u) => {
+ if (u.f_id && u.data && u.geo) {
+ return true;
+ }
+ return false;
+ });
+ const continents = [];
+ const countries = [];
+ const navIndex = [];
+ users.forEach((u) => {
+ if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
+ return;
+ }
+ if (!u.detail.heroImageUrl) {
+ return;
+ }
+ let code = null;
+ if (u.geo.continent && continents.indexOf(u.geo.continent) == -1) {
+ continents.push(u.geo.continent);
+ navIndex.push({
+ title: u.geo.continent,
+ url: `/users/${slugify(u.geo.continent)}.html`,
+ children: [],
+ code: u.geo.continentCode
+ // code:u.geo.continentCode
+ });
+ }
+ if (countries.indexOf(u.geo.countryName) == -1) {
+ countries.push(u.geo.countryName);
+ }
+ const c = navIndex.find((c) => c.title === u.geo.continent);
+ if (c) {
+ const cc = c.children.find((i) => i.title == u.geo.countryName);
+ if (!cc) {
+ c.children.push({
+ title: u.geo.countryName,
+ url: `/users/${slugify(c.title)}.html#${slugify(u.geo.countryName.toLocaleLowerCase())}`,
+ postTitle: `Directory - ${u.geo.countryName}`
+ });
+ }
+ }
+ });
+ navIndex.sort((a, b) => {
+ if (a.title < b.title) {
+ return -1;
+ }
+ if (a.title > b.title) {
+ return 1;
+ }
+ return 0;
+ });
+ navIndex.forEach((c) => {
+ c.children.sort((a, b) => {
+ if (a.title < b.title) {
+ return -1;
+ }
+ if (a.title > b.title) {
+ return 1;
+ }
+ return 0;
+ });
+ });
+ const directoryRoot = path.resolve(resolve('${OSR_ROOT}/osr-directory/pp'));
+ const createContinentPage = (continent) => {
+ const templates_path = path.resolve(`${directoryRoot}/templates`);
+ if (!exists(templates_path)) {
+ logger.error(`\t Cant find templates at ${templates_path}, path doesn't exists`);
+ return;
+ }
+ const cPath = path.resolve(`${directoryRoot}/templates/config.json`);
+ const config = read(cPath, 'json');
+ let fragments = { ...config };
+ read_fragments(templates_path, fragments, "product_rel_path_name", "machine");
+ let templateCountry = read(path.resolve(`${templates_path}/country_users.md`), 'string');
+ const ccountries = {};
+ let code = null;
+ users.forEach((u) => {
+ if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
+ return;
+ }
+ if (!u.detail.heroImageUrl) {
+ return;
+ }
+ if (u.geo.continent && u.geo.continent === continent) {
+ if (!code) {
+ code = u.geo.continentCode;
+ }
+ if (!ccountries[u.geo.countryName]) {
+ ccountries[u.geo.countryName] = [];
+ }
+ ccountries[u.geo.countryName].push(u);
+ }
+ });
+ if (continent === 'Africa') {
+ //debugger;
+ }
+ let weight = 100;
+ for (var country in ccountries) {
+ let cPage = "";
+ if (country === 'Kenya') {
+ //debugger;
+ }
+ cPage += `\n#### ${slugify(country)}\n\n`;
+ if (country === 'undefined' || country === 'unknown' || !country) {
+ return;
+ }
+ cPage += '';
+ cPage += '
';
+ let cusers = ccountries[country];
+ cusers = cusers.sort((a, b) => a.type === b.type ? 1 : -1);
+ const cUsersC = cusers.map((u) => {
+ const prefix = u.moderation === 'rejected' ? "
Censored " : "";
+ const image = `/users/${u._id}/${encodeURIComponent(sanitize(imageName(u.detail.heroImageUrl)))}`;
+ const title = u.data && u.data.title ? u.data.title : u._id;
+ const uUrl = `/directory/users/${u._id}`;
+ let censored = u.moderation === 'rejected' ? '
Yes ' : 'No';
+ return `
+
+
+
+
${title}
+
Type: ${u.type}
+
Censored: ${censored}
+
+
${u.geo.principalSubdivision} / ${u.geo.locality} - ${u.geo.principalSubdivisionCode} - ${u.geo.postcode}
+
+
`;
+ });
+ cPage += cUsersC.join('');
+ cPage += '
';
+ country = country.replace(' (the)', '');
+ /*
+ const cPagePath = path.resolve(`${kb}/src/directory/users_${sanitize(slugify(country))}-${code}.md`)
+
+ const title = 'Users - ' + country;
+
+ cPage = substitute(templateCountry, {
+ ...fragments,
+ title: title,
+ keywords: 'Precious Plastic, Precious Plastic Users - ' + country,
+ content: html_beautify(cPage),
+ continent: slugify(continent),
+ country: slugify(country),
+ identifier: country + "-" + continent,
+ weight: weight
+ });
+
+ weight++;
+ write(cPagePath, cPage);
+ console.log('write ' + cPagePath);
+ */
+ }
+ /*
+ content = substitute(template, {
+ ...fragments,
+ title: 'Precious Plastic - Users ' + continent,
+ keywords: 'Precious Plastic, Precious Plastic Users - ' + continent,
+ content: content,
+ continent: slugify(continent)
+ });
+ */
+ //const index_md = path.resolve(`${root}/_pages/users_${code}.md`);
+ //write(index_md, content);
+ };
+ const templates_path = path.resolve(`${directoryRoot}/templates`);
+ const createCountryPages = async (index, indexPath) => {
+ let i = 0;
+ for await (const continent of index) {
+ const countries = continent.children;
+ for await (const country of countries) {
+ const d = 0;
+ }
+ }
+ };
+ await createCountryPages(navIndex, './');
+ const createIntroPage = async (users, index, dst) => {
+ let template = read(path.resolve(`${templates_path}/intro_users.md`));
+ let content = "";
+ const usersPerCountry = (country) => {
+ return users.filter((u) => u.geo.countryName === country);
+ };
+ index.forEach((i) => {
+ const heading = `## ${i.title}`;
+ let countries = '';
+ i.children.forEach((c) => {
+ let title = c.title.replace(/ *\([^)]*\) */g, "");
+ const nb = usersPerCountry(c.title).length;
+ title = `${title} \(${nb}\)`;
+ const cPagePath = `/directory/users_${sanitize(slugify(c.title))}-${i.code}`;
+ countries += `- [${(title)}](${cPagePath.toLowerCase()})\n`;
+ });
+ content += `${heading}\n ${countries}`;
+ });
+ write(dst, substitute(template, {
+ content: content,
+ /*hidden: data.v3_mappins.filter((u) => u.moderation !== "accepted").length,
+ total: data.v3_mappins.length*/
+ }));
+ let data;
+ try {
+ data = await discorse.updatePost(OA_DIRECTORY_OVERVIEW_TOPIC, content);
+ debugger;
+ //logger.debug('update post : ' + options.title + ' : ' + data.id + ' | topic id ' + data.topic_id)
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ // await createIntroPage(users, navIndex, './index.md')
+ /*
+
+ return await BPromise.resolve(users).map((u: IImportUser) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = updateUser(discorse, u)
+ if (d) {
+ d.then(resolve)
+ } else {
+ reject()
+ }
+ }, 200)
+
+ })
+
+ } catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e)
+ }
+ }, { concurrency: 1 })
+
+ */
+};
+//# sourceMappingURL=users.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/users.js.map b/packages/discourse-legacy/dist/lib/oa/users.js.map
new file mode 100644
index 00000000..a2a7ed69
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/users.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/oa/users.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/utils.d.ts b/packages/discourse-legacy/dist/lib/oa/utils.d.ts
new file mode 100644
index 00000000..42e9e105
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/utils.d.ts
@@ -0,0 +1,25 @@
+export declare const uploadFile: (discourse: any, forum: any, name: any, filePath: any) => Promise;
+export declare const findReplyPage: (b: any, pages: any) => any;
+export declare const findReplyUpload: (u: any, page: any) => any;
+export declare const getPages: (topics: any, topic: any) => any;
+export declare const getReplies: (topics: any, topic: any) => any[];
+export declare const findFile: (folder: any, filename: any) => any;
+export declare const topicFolder: (forum: any, folder: any, title: any) => string;
+export declare const getFUser: (users: any, user_name: any) => any;
+export declare const dOptions: {
+ host: string;
+ key: string;
+ username: string;
+ rateLimitConcurrency: number;
+};
+export declare const getOAvatar: (index: any, user: any) => any;
+export declare const getTopics: (index: any) => any[];
+export declare const convert: (input: string) => any;
+export declare const getDiscourse: () => any;
+export declare function inspect(arg: any): string;
+export declare function log(...args: any[]): void;
+export declare function mkdirp(path: string): Promise;
+export declare function readJSON(path: string): Promise;
+export declare function writeJSON(path: string, data: object): Promise;
+export declare function exists(path: string): Promise;
+export declare function escape(path: string): string;
diff --git a/packages/discourse-legacy/dist/lib/oa/utils.js b/packages/discourse-legacy/dist/lib/oa/utils.js
new file mode 100644
index 00000000..f89864fd
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/utils.js
@@ -0,0 +1,150 @@
+import fs from 'fs';
+import { inspect as utilInspect } from 'util';
+const cwd = process.cwd();
+var TurndownService = require('turndown');
+import { Discourser } from '../index';
+import * as path from 'path';
+const fg = require('fast-glob');
+import slugify from "slugify";
+var sanitize = require("sanitize-filename");
+//import { replaceAll } from '../../lib';
+var mom = require('moment');
+export const uploadFile = async (discourse, forum, name, filePath) => {
+ return await discourse.upload(1, filePath);
+};
+export const findReplyPage = (b, pages) => {
+ return pages.find((p) => {
+ return p.replies.find((r) => {
+ return r.replyBody == b;
+ });
+ });
+};
+export const findReplyUpload = (u, page) => {
+ const f_pics = page.f_pics || [];
+ return f_pics.find((p) => {
+ return p.url === u;
+ });
+};
+export const getPages = (topics, topic) => {
+ return topics.filter((t) => {
+ return t.title == topic.title;
+ });
+};
+export const getReplies = (topics, topic) => {
+ if (topic.nextPages) {
+ const all = topics.filter((t) => {
+ return t.title == topic.title;
+ });
+ let replies = all.map((t) => t.replies);
+ replies = [].concat.apply([], replies);
+ replies = replies.sort((a, b) => {
+ const d1 = mom(a.replyDate, 'DD/MM/YYYY AT HH:mm').toDate();
+ const d2 = mom(b.replyDate, 'DD/MM/YYYY AT HH:mm').toDate();
+ return new Date(d1).getTime() > new Date(d2).getTime() ? 1 : -1;
+ });
+ return replies;
+ /*
+ const findReply = (b, pages) => {
+ return pages.find((p) => {
+ return p.replies.find((r) => {
+ return r.replyBody == b;
+ })
+ })
+ }
+ const p = findReply('\n\n\nsounds great, let me get Old Tony´s Schaeubling 13 and a surface grinder first, after that I can do the parts for the espresso machine in the best maker porn fashion possible, no seriously, every time I thought I know something, there’s just another video around the next corner making me cry like a baby, incl. the coffee machine
\n', all);
+ debugger;
+ */
+ }
+ return [];
+};
+export const findFile = (folder, filename) => {
+ const files = fg.sync('**/**/*' + filename + '*', { dot: true, cwd: folder, absolute: true });
+ if (files.length == 0) {
+ return false;
+ }
+ return files[0];
+};
+export const topicFolder = (forum, folder, title) => {
+ const _title = sanitize(slugify(title));
+ const tf = path.resolve(forum + '/' + folder + '/' + _title);
+ return tf;
+};
+export const getFUser = (users, user_name) => {
+ return users.find((u) => {
+ return u.name == user_name;
+ });
+};
+export const dOptions = {
+ host: 'https://forum.osr-plastic.org',
+ key: 'f624b8385fb2219cb49de63d1e22883afdf7b7367a0bebf822523f49f2678031',
+ username: 'admin',
+ rateLimitConcurrency: 1
+};
+export const getOAvatar = (index, user) => {
+ const topics = getTopics(index);
+ let topic = topics.find((t) => {
+ return t.authorName == user;
+ });
+ if (topic) {
+ return topic.authorImage;
+ }
+ for (let i = 0; i < topics.length; i++) {
+ const t = topics[i];
+ if (t.replies) {
+ const r = t.replies.find((r) => {
+ return r.user == user;
+ });
+ if (r) {
+ return r.avatar;
+ }
+ }
+ }
+ return null;
+};
+export const getTopics = (index) => {
+ let topics = [];
+ for (let t in index) {
+ topics.push(index[t]);
+ }
+ return topics;
+};
+export const convert = (input) => {
+ var turndownService = new TurndownService();
+ return turndownService.turndown(input);
+};
+export const getDiscourse = () => {
+ return new Discourser(dOptions);
+};
+export function inspect(arg) {
+ return utilInspect(arg, {
+ depth: 5,
+ colors: true,
+ });
+}
+export function log(...args) {
+ console.log(...args.map((arg) => inspect(arg)));
+}
+export async function mkdirp(path) {
+ try {
+ await fs.promises.mkdir(path);
+ }
+ catch (err) {
+ // don't care if it already exists
+ }
+}
+export async function readJSON(path) {
+ const text = await fs.promises.readFile(path, 'utf8');
+ return JSON.parse(text);
+}
+export function writeJSON(path, data) {
+ return fs.promises.writeFile(path, JSON.stringify(data));
+}
+export function exists(path) {
+ return new Promise(function (resolve) {
+ fs.exists(path, resolve);
+ });
+}
+export function escape(path) {
+ return path.replace(/[^\w]/g, '-').replace(/-+/, '-');
+}
+//# sourceMappingURL=utils.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/oa/utils.js.map b/packages/discourse-legacy/dist/lib/oa/utils.js.map
new file mode 100644
index 00000000..fd905b13
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/oa/utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/oa/utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/osr/index.d.ts b/packages/discourse-legacy/dist/lib/osr/index.d.ts
new file mode 100644
index 00000000..ffd16f3f
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/index.d.ts
@@ -0,0 +1 @@
+export * from './urls';
diff --git a/packages/discourse-legacy/dist/lib/osr/index.js b/packages/discourse-legacy/dist/lib/osr/index.js
new file mode 100644
index 00000000..9dcea789
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/index.js
@@ -0,0 +1,2 @@
+export * from './urls';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/osr/index.js.map b/packages/discourse-legacy/dist/lib/osr/index.js.map
new file mode 100644
index 00000000..4b439433
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/osr/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/osr/urls.d.ts b/packages/discourse-legacy/dist/lib/osr/urls.d.ts
new file mode 100644
index 00000000..84d162bd
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/urls.d.ts
@@ -0,0 +1 @@
+export declare const marketplaceUrl: (store: any, product_id: any) => string;
diff --git a/packages/discourse-legacy/dist/lib/osr/urls.js b/packages/discourse-legacy/dist/lib/osr/urls.js
new file mode 100644
index 00000000..ba78533d
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/urls.js
@@ -0,0 +1,2 @@
+export const marketplaceUrl = (store, product_id) => `${store}/dispatch=products.view&product_id=${product_id}`;
+//# sourceMappingURL=urls.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/osr/urls.js.map b/packages/discourse-legacy/dist/lib/osr/urls.js.map
new file mode 100644
index 00000000..f8445620
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/osr/urls.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../src/lib/osr/urls.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAChD,GAAG,KAAK,sCAAsC,UAAU,EAAE,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/commons.d.ts b/packages/discourse-legacy/dist/lib/sync/commons.d.ts
new file mode 100644
index 00000000..add67f4d
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/commons.d.ts
@@ -0,0 +1,11 @@
+///
+export declare const fileAsBuffer: (path: string) => Buffer;
+export declare const images_urls: (content: string) => any[];
+export declare const adjustUrls: (content: string, options: IOptionsSync) => any;
+export declare const fromJSON: (content: string, file: string, options: IOptionsSyncComponent) => void;
+export declare const fromYAML: (content: string, options: IOptionsSync) => {
+ attributes: any;
+ body: any;
+};
+export declare const option: (option: string, taskOptions: any, col: any, _default?: any) => any;
+export declare const createContent: (file: any, _options: any) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/commons.js b/packages/discourse-legacy/dist/lib/sync/commons.js
new file mode 100644
index 00000000..27d517ff
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/commons.js
@@ -0,0 +1,164 @@
+import * as path from 'path';
+import { Engine as engine } from '@plastichub/osrl/Engine';
+import { parse } from '@plastichub/osrl/options';
+import { pathInfo } from '@polymech/commons/glob';
+import { resolve } from '@polymech/commons';
+import { logger } from '../../';
+import { sync as exists } from '@polymech/fs/exists';
+import { sync as read } from '@polymech/fs/read';
+import { sync as write } from '@polymech/fs/write';
+import { Promise as BPromise } from 'bluebird';
+import { MODULE_NAME } from '../../constants';
+const chokidar = require("chokidar");
+const cheerio = require('cheerio');
+const frontMatter = require('front-matter');
+export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-");
+import { get_cached, set_cached } from '@plastichub/osr-cache/lib';
+import { OSR_CACHE } from '@polymech/commons';
+import * as md5 from 'md5';
+import { RMark, toHTML } from '../markdown';
+export const images_urls = (content) => {
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = [];
+ const links = [];
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ return images;
+};
+export const adjustUrls = (content, options) => {
+ let ret = new RMark({
+ images: (match, capture, arg1, arg2) => ``,
+ //links: (match, capture, arg1, arg2) => `[${capture}](${arg1})`
+ }).render(content);
+ return ret;
+};
+export const fromJSON = (content, file, options) => {
+};
+export const fromYAML = (content, options) => {
+ if (frontMatter.test(content)) {
+ const fm = frontMatter(content);
+ return {
+ attributes: fm.attributes,
+ body: fm.body
+ };
+ }
+ else {
+ return {
+ attributes: {},
+ body: content
+ };
+ }
+};
+// to be changed to osr-defaults
+export const option = (option, taskOptions, col, _default) => {
+ // support grunt or yargs
+ const val = col.option ? col.option : (option) => col[option];
+ let ret = taskOptions[option] !== undefined ? taskOptions[option] : _default;
+ if (val(option) !== undefined) {
+ ret = val(option);
+ }
+ return ret;
+};
+export const createContent = async (file, _options) => {
+ const parts = path.parse(file);
+ const rel = path.relative(_options.root, file);
+ let output = _options.output;
+ let outputInfo = pathInfo(_options.output);
+ const variables = {
+ root: '.',
+ cwd: _options.cwd || path.resolve('.'),
+ ..._options.variables
+ };
+ if (!outputInfo.FILE_EXT) {
+ output = path.resolve(`${_options.output}/${path.parse(rel).dir}/${parts.name}.md`);
+ }
+ else {
+ output = path.resolve(resolve(output, false, variables));
+ }
+ const defaults = {
+ language: _options.lang,
+ debug: _options.debug,
+ profile: _options.profile,
+ output: output,
+ plugins: _options.plugins,
+ env: _options.env || 'library',
+ cwd: _options.cwd || path.resolve('.'),
+ source: file,
+ variables
+ };
+ const options = parse(defaults, defaults);
+ const eOptions = {
+ ...options,
+ root: [
+ ...options.profile.includes,
+ path.parse(file).dir
+ ],
+ toHTML: false,
+ cache: false,
+ keepOutputType: true,
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: false
+ };
+ const Engine = new engine(eOptions);
+ options.source = path.resolve(options.source);
+ const osr_cache = OSR_CACHE();
+ const cached = await get_cached(options.source, eOptions, _options.module || MODULE_NAME);
+ if (osr_cache && cached && _options.cache !== false) {
+ options.debug && logger.info('Compile file serving from cache: ' + options.source);
+ let md5Src = md5(Buffer.from(cached));
+ let md5Dst = md5(fileAsBuffer(options.output));
+ if (!exists(options.output) || md5Src !== md5Dst) {
+ write(options.output, cached);
+ }
+ return cached;
+ }
+ options.debug && logger.info('Compile file ' + file, eOptions);
+ let content = await Engine.render(options.source, options.variables);
+ if (_options.onCompiled) {
+ content = await _options.onCompiled(options.source, output, content);
+ }
+ if (osr_cache && _options.cache !== false) {
+ options.debug && logger.info('Write output to cache', output);
+ await set_cached(options.source, eOptions, _options.module || MODULE_NAME, content);
+ }
+ let dst = path.resolve(resolve(output, false, options.variables));
+ _options.debug && logger.info('Write output to: ', dst);
+ write(dst, content);
+ if (_options.onCompileDone) {
+ await _options.onCompileDone(options.source, dst, options, content);
+ }
+ return content;
+};
+const watch = async (src, options) => {
+ src = path.resolve(src);
+ const watcher = chokidar.watch(`${src}`, {
+ ignored: /(^|[\/\\])\../,
+ persistent: true
+ });
+ watcher.on('change', async (path) => {
+ await createContent(path, options);
+ });
+ return watcher;
+};
+const compileAll = async (files, options) => {
+ return await BPromise.resolve(files).map((f) => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ createContent(f, options).then(() => resolve(true));
+ }, 50);
+ });
+ }, { concurrency: 1 });
+};
+const compileAllEx = async (files, options) => {
+ return await BPromise.resolve(files).map((f) => {
+ return createContent(f, options);
+ }, { concurrency: 1 });
+};
+//# sourceMappingURL=commons.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/commons.js.map b/packages/discourse-legacy/dist/lib/sync/commons.js.map
new file mode 100644
index 00000000..f4d39a65
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/commons.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/lib/sync/commons.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/component.d.ts b/packages/discourse-legacy/dist/lib/sync/component.d.ts
new file mode 100644
index 00000000..dbb8790e
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/component.d.ts
@@ -0,0 +1,4 @@
+export declare const createPost: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updatePost: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncComponent: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/component.js b/packages/discourse-legacy/dist/lib/sync/component.js
new file mode 100644
index 00000000..f6e1c4fd
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/component.js
@@ -0,0 +1,366 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { createContent } from './osrl';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+const md5 = require('md5');
+import { imageName, downloadFile } from './download';
+import { toHTML } from '../markdown';
+import { isNumber } from '@polymech/core/primitives';
+import { fromJSON, tracking, trackingPath } from './';
+import { cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { images_urls } from './commons';
+import { isValidLibraryComponent, readOSRConfig } from '@plastichub/osr-fs-utils';
+import { logger } from '../../index';
+import { forward_slash } from '@polymech/commons';
+const CONTENT_TEST = false;
+const SKIP_EXISTING = false;
+export const createPost = async (discourse, options, content) => {
+ if (!isNumber(options.cat)) {
+ logger.error(`category not a number! ${options.title} `);
+ }
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ logger.debug('created topic : ' + options.title + ' : ' + data.id + ' | topic id :' + data.topic_id);
+ return true;
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors, data);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+ else {
+ return false;
+ }
+};
+export const updatePost = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ logger.debug('update post : ' + options.title + ' : ' + data.id + ' | topic id ' + data.topic_id);
+ }
+ catch (e) {
+ return false;
+ }
+ if (data) {
+ if (data && data.id) {
+ try {
+ // logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await new Promise(f => setTimeout(f, 1000));
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ return true;
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ return false;
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ return false;
+ }
+ }
+ }
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = trackingPath(root);
+ const track = tracking(root);
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ if ($(this).attr('src') && $(this).attr('src').length > 5) {
+ images.push($(this).attr('src'));
+ }
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.length < 10) {
+ continue;
+ }
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ try {
+ await downloadFile(url, cache_path);
+ }
+ catch (e) {
+ continue;
+ }
+ }
+ if (!exists(image_local)) {
+ continue;
+ }
+ if (!track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && (!track[url] || options.cache === false)) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let config = fromJSON(file, options) || {};
+ const componentDir = path.parse(file).dir;
+ // ph3 back sync
+ const rel = forward_slash(path.relative(options.root, componentDir));
+ const productConfigPath = path.join(options.product_root, rel, 'config.json');
+ let body = await createContent(componentDir, options);
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i]) {
+ body = body.replace(i, images_track[i].short_url);
+ }
+ else {
+ logger.warn(`Cant resolve image url : ${i} - ${componentDir} ! Image Upload track invalid`);
+ }
+ });
+ }
+ logger.debug(`Processing ${componentDir}`);
+ const output = path.join(componentDir, '.osr/discourse_raw.md');
+ let dst = path.resolve(resolve(output));
+ options.debug && logger.info('Write output to: ', dst);
+ write(dst, body);
+ let post_id, topic_id;
+ let dOpts = {
+ ...options,
+ cat: config.forumCategory,
+ id: options.id,
+ owner: config.forumUserId || 1,
+ tags: config.forumTags,
+ title: config.name,
+ topic_id: config.forumTopicId,
+ post_id: config.forumPostId
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ const hash = md5(JSON.stringify({
+ cat: dOpts.cat,
+ tags: dOpts.tags,
+ owner: dOpts.owner,
+ body,
+ title: dOpts.title
+ }, null));
+ // const cats = await cacheCategories(options, discourse)
+ // const tags = await cacheTags(options, discourse)
+ const users = await cacheUsers(options, discourse);
+ await new Promise(f => setTimeout(f, 1000));
+ let search = await discourse.search(dOpts.title);
+ await new Promise(f => setTimeout(f, 2000));
+ let dTopic;
+ let dPost;
+ if (search && search.posts && search.topics) {
+ search.topics.forEach((t, i) => {
+ if (t.title === dOpts.title) {
+ dTopic = t;
+ dPost = search.posts[i];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ });
+ }
+ if (!dTopic || !dPost) {
+ console.error('!dTopic || !dPost : cant find ' + dOpts.title);
+ // return
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ if (SKIP_EXISTING && hash === config.forumPostHash &&
+ config.forumTopicId && config.forumPostId) {
+ return;
+ }
+ if (CONTENT_TEST) {
+ return;
+ }
+ if (post_id) {
+ if (await updatePost(discourse, options, post_id, body)) {
+ if (topic_id) {
+ await new Promise(f => setTimeout(f, 2000));
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ logger.error(`Error updating post ${dOpts.title}`);
+ }
+ }
+ else {
+ if (await createPost(discourse, options, body)) {
+ await new Promise(f => setTimeout(f, 1000));
+ await discourse.updateTopic(options.topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ else {
+ logger.error('Creating post failed !', dOpts.title);
+ }
+ }
+ // const visStatus = await discourse.updateTopicVisibility(topic_id, true)
+ // re-read without defaults
+ config = readOSRConfig(file);
+ config.forumPostHash = hash;
+ if (dTopic) {
+ config.forumTopicId = dTopic.id;
+ }
+ else if (topic_id) {
+ config.forumTopicId = topic_id;
+ }
+ if (dPost) {
+ config.forumPostId = dPost.id;
+ }
+ else if (post_id) {
+ config.forumPostId = post_id;
+ }
+ write(file, config);
+ //ph3 products
+ if (exists(productConfigPath)) {
+ let pConfig = readOSRConfig(productConfigPath);
+ logger.debug(`Updating product config ${productConfigPath}`);
+ pConfig = {
+ ...config
+ //...pConfig,
+ //...
+ /*
+ forumTopicId:config.forumTopicId,
+ forumPostId:config.forumPostId,
+ forumPostHash: config.forumPostHash
+ */
+ };
+ write(productConfigPath, pConfig);
+ }
+ return body;
+};
+export const syncComponent = async (options) => {
+ let components = options.srcInfo.FILES.filter(isValidLibraryComponent);
+ //let components = options.srcInfo.FILES.filter((c) => {
+ //components = components.filter((c) => {
+ /*
+try {
+ const config = readOSRConfig(c) as IComponentConfig
+ if (config) {
+ if (config.forum === false) {
+ return false
+ }
+ // return !config.code && !config.cscartId && !config.steps
+ return !!config.name
+ }
+ return false
+} catch (error) {
+ logger.error(`Invalid config : ${c}`)
+}
+})*/
+ const skipExisting = options.skip;
+ /*
+ [
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/asterix-pp/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/asterix-sm-morren/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/bicycle-shredder/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/idefix/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/obelix/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/pp-v3.3/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/components/shredder_v21-light-ex/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/components/shredder_v31-light/config.json",
+ ]
+ */
+ if (skipExisting) {
+ components = components.filter((f) => {
+ const config = readOSRConfig(f);
+ if (config.forumPostId && config.forumTopicId) {
+ return false;
+ }
+ return true;
+ });
+ }
+ //components = [components[0]]
+ logger.info(`Syncing ${components.length} components`, components);
+ await BPromise.resolve(components).map((f) => {
+ try {
+ return syncFile(f, options);
+ }
+ catch (error) {
+ debugger;
+ }
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncComponent(options);
+};
+//# sourceMappingURL=component.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/component.js.map b/packages/discourse-legacy/dist/lib/sync/component.js.map
new file mode 100644
index 00000000..ad4cb218
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/lib/sync/component.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/directory.d.ts b/packages/discourse-legacy/dist/lib/sync/directory.d.ts
new file mode 100644
index 00000000..4081ef8d
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/directory.d.ts
@@ -0,0 +1,4 @@
+export declare const createTopic: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updateTopic: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncComponent: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/directory.js b/packages/discourse-legacy/dist/lib/sync/directory.js
new file mode 100644
index 00000000..aa9bed71
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/directory.js
@@ -0,0 +1,313 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { createContent } from './osrl';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+import { imageName, downloadFile } from './download';
+import { toHTML } from '../markdown';
+import { fromJSON, tracking, trackingPath } from './';
+import { cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { images_urls } from './commons';
+import * as md5 from 'md5';
+import { isValidLibraryComponent, readOSRConfig } from '@plastichub/osr-fs-utils';
+import { logger } from '../../index';
+const fromYAML = (content, options) => {
+ if (frontMatter.test(content)) {
+ const fm = frontMatter(content);
+ return {
+ attributes: fm.attributes,
+ body: fm.body
+ };
+ }
+ else {
+ return {
+ attributes: {},
+ body: content
+ };
+ }
+};
+export const createTopic = async (discourse, options, content) => {
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+export const updateTopic = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ }
+ catch (e) {
+ return false;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ return true;
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ return false;
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ return false;
+ }
+ }
+ }
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = trackingPath(root);
+ const track = tracking(root);
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ if ($(this).attr('src') && $(this).attr('src').length > 5) {
+ images.push($(this).attr('src'));
+ }
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.length < 10) {
+ continue;
+ }
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ try {
+ await downloadFile(url, cache_path);
+ }
+ catch (e) {
+ continue;
+ }
+ }
+ if (!exists(image_local)) {
+ continue;
+ }
+ if (!track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && !track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let config = fromJSON(file, options) || {};
+ const componentDir = path.parse(file).dir;
+ let body = await createContent(componentDir, options);
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i]) {
+ body = body.replace(i, images_track[i].short_url);
+ }
+ else {
+ logger.warn(`Cant resolve image url : ${i}`);
+ }
+ });
+ }
+ const output = path.join(componentDir, '.osr/discourse_raw.md');
+ let dst = path.resolve(resolve(output));
+ options.debug && logger.info('Write output to: ', dst);
+ write(dst, body);
+ let dOpts = {
+ ...options,
+ cat: config.forumCategory,
+ id: options.id,
+ owner: config.forumUserId || 1,
+ tags: config.forumTags,
+ title: config.name
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ // const cats = await cacheCategories(options, discourse)
+ // const tags = await cacheTags(options, discourse)
+ const users = await cacheUsers(options, discourse);
+ let search = await discourse.search(dOpts.title);
+ let post_id, topic_id;
+ if (options.yaml) {
+ post_id = dOpts.post_id;
+ topic_id = dOpts.topic_id;
+ }
+ let dTopic;
+ let dPost;
+ if (search && search.posts && search.topics
+ && search.posts[0] && search.topics[0]
+ && search.topics[0].title === dOpts.title) {
+ dPost = search.posts[0];
+ dTopic = search.topics[0];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ else if (post_id && topic_id) {
+ }
+ if (!dTopic || !dPost) {
+ console.error('cant find ' + dOpts.title);
+ // return
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ let topic = null;
+ if (post_id) {
+ await updateTopic(discourse, options, post_id, body);
+ if (topic_id) {
+ topic = await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ const d = await createTopic(discourse, options, body);
+ if (options.topic_id) {
+ topic_id = options.topic_id;
+ post_id = options.post_id;
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ else {
+ logger.error('Creating topic failed !');
+ }
+ }
+ // const visStatus = await discourse.updateTopicVisibility(topic_id, true)
+ // re-read without defaults
+ config = readOSRConfig(file);
+ if (dTopic) {
+ options.topic_id = dTopic.id;
+ config.forumTopicId = dTopic.id;
+ }
+ if (dPost) {
+ options.post_id = dPost.id;
+ config.forumPostId = dPost.id;
+ }
+ write(file, config);
+ return body;
+};
+export const syncComponent = async (options) => {
+ // let components = options.srcInfo.FILES.filter(isValidLibraryComponent)
+ let components = options.srcInfo.FILES.filter(isValidLibraryComponent);
+ //components = options.srcInfo.FILES.filter((c) => {
+ components = components.filter((c) => {
+ try {
+ const config = readOSRConfig(c);
+ if (config) {
+ // return !config.code && !config.cscartId && !config.steps
+ return !!config.name;
+ }
+ return false;
+ }
+ catch (error) {
+ logger.error(`Invalid config : ${c}`);
+ }
+ });
+ const skipExisting = false;
+ if (skipExisting) {
+ components = components.filter((f) => {
+ const config = readOSRConfig(f);
+ if (config.forumPostId && config.forumTopicId) {
+ return false;
+ }
+ return true;
+ });
+ }
+ //components = [components[0]]
+ await BPromise.resolve(components).map((f) => {
+ try {
+ return syncFile(f, options);
+ }
+ catch (error) {
+ debugger;
+ }
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncComponent(options);
+};
+//# sourceMappingURL=directory.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/directory.js.map b/packages/discourse-legacy/dist/lib/sync/directory.js.map
new file mode 100644
index 00000000..b154f308
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/directory.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../../src/lib/sync/directory.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/download.d.ts b/packages/discourse-legacy/dist/lib/sync/download.d.ts
new file mode 100644
index 00000000..668cfd3d
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/download.d.ts
@@ -0,0 +1,5 @@
+export declare const sanitize: (f: any) => string;
+export declare const sanitize_ex: (f: any) => string;
+export declare const filename: (_url: any) => string;
+export declare const imageName: (url: any) => string;
+export declare const downloadFile: (_url: string, dir: string) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/download.js b/packages/discourse-legacy/dist/lib/sync/download.js
new file mode 100644
index 00000000..469067ee
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/download.js
@@ -0,0 +1,40 @@
+import * as path from 'path';
+const _sanitize = require("sanitize-filename");
+const filenamify = require('filenamify');
+import * as download from 'download';
+const URI = require("uri-js");
+import * as url from 'url';
+export const sanitize = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "");
+ if (str.startsWith('_')) {
+ str = str.substring(1);
+ }
+ return str;
+};
+export const sanitize_ex = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "").replace('_', '');
+ return str;
+};
+export const filename = (_url) => {
+ return path.basename(url.parse(_url).path);
+};
+export const imageName = (url) => {
+ if (!url) {
+ return "";
+ }
+ try {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ return sanitize(decodeURIComponent(pParsed.base));
+ }
+ catch (error) {
+ console.error('error image name : ', url);
+ return "";
+ }
+};
+export const downloadFile = async (_url, dir) => {
+ return download(_url, dir, {
+ filename: imageName(_url)
+ });
+};
+//# sourceMappingURL=download.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/download.js.map b/packages/discourse-legacy/dist/lib/sync/download.js.map
new file mode 100644
index 00000000..39089e0a
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/download.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/lib/sync/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAE9C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AACxC,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC1B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACrB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;KAC1B;IACD,OAAO,GAAG,CAAC;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC7B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;IAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAG,CAAC,GAAG,EAAC;QACJ,OAAO,EAAE,CAAA;KACZ;IACD,IAAI;QACA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KACrD;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAC,GAAG,CAAC,CAAA;QACxC,OAAO,EAAE,CAAA;KACZ;AACL,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAW,EAAE,GAAU,EAAE,EAAE;IAC1D,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/file.d.ts b/packages/discourse-legacy/dist/lib/sync/file.d.ts
new file mode 100644
index 00000000..44a3adce
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/file.d.ts
@@ -0,0 +1,4 @@
+export declare const createTopic: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updateTopic: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncYAML: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/file.js b/packages/discourse-legacy/dist/lib/sync/file.js
new file mode 100644
index 00000000..ce59d7b1
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/file.js
@@ -0,0 +1,246 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { sync as read } from "@polymech/fs/read";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { imageName, downloadFile } from './download';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+import { toHTML } from '../markdown';
+import { SYNC_TRACK_FILENAME } from '../discourse/constants';
+import { cacheCategories, cacheTags, cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { fromYAML } from './commons';
+import { logger } from "../../index";
+import * as md5 from 'md5';
+export const createTopic = async (discourse, options, content) => {
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+export const updateTopic = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ }
+ catch (e) {
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+const images_urls = (content) => {
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = [];
+ const links = [];
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ return images;
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = path.join(root, SYNC_TRACK_FILENAME);
+ const track = read(track_path, 'json') || {};
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ await downloadFile(url, cache_path);
+ }
+ if (exists(image_local)) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && !track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let content = read(file);
+ const fm = fromYAML(content, options) || {};
+ let body = "" + fm.body;
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i])
+ body = body.replace(i, images_track[i].short_url);
+ });
+ }
+ write('./out/md.md', body);
+ let dOpts = options.yaml ? fm.attributes : {
+ cat: options.cat,
+ id: options.id,
+ owner: options.owner,
+ tags: options.tags,
+ title: options.title
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ const cats = await cacheCategories(options, discourse);
+ const tags = await cacheTags(options, discourse);
+ const users = await cacheUsers(options, discourse);
+ const search = await discourse.search(dOpts.title);
+ let post_id, topic_id;
+ if (options.yaml) {
+ post_id = dOpts.post_id;
+ topic_id = dOpts.topic_id;
+ }
+ let dTopic;
+ let dPost;
+ if (search.posts && search.topics
+ && search.posts[0] && search.topics[0]
+ && search.topics[0].title === dOpts.title) {
+ dPost = search.posts[0];
+ dTopic = search.topics[0];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ else if (post_id && topic_id) {
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ let topic = null;
+ if (post_id) {
+ topic = await updateTopic(discourse, options, post_id, body);
+ if (topic_id) {
+ topic = await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ await createTopic(discourse, options, body);
+ topic_id = options.topic_id;
+ post_id = options.post_id;
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ if (dTopic) {
+ options.topic_id = dTopic.id;
+ }
+ if (dPost) {
+ options.post_id = dPost.id;
+ }
+ if (options.yaml) {
+ let contentOut = `---\n`;
+ contentOut += YAML.stringify({
+ ...fm.attributes,
+ topic_id: topic_id,
+ post_id: post_id
+ });
+ contentOut += `---\n`;
+ contentOut += fm.body;
+ write(file, contentOut);
+ }
+ return content;
+};
+export const syncYAML = async (options) => {
+ await BPromise.resolve(options.srcInfo.FILES).map((f) => {
+ return syncFile(f, options);
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncYAML(options);
+};
+//# sourceMappingURL=file.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/file.js.map b/packages/discourse-legacy/dist/lib/sync/file.js.map
new file mode 100644
index 00000000..4afe1aa2
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/file.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/lib/sync/file.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/index.js b/packages/discourse-legacy/dist/lib/sync/index.js
new file mode 100644
index 00000000..e8c97160
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/index.js
@@ -0,0 +1,29 @@
+import * as path from 'path';
+import { sync as read } from "@polymech/fs/read";
+import { SYNC_TRACK_FILENAME } from '../discourse/constants';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+import { readOSRConfig } from '@plastichub/osr-fs-utils';
+export const trackingPath = (root) => path.join(root, SYNC_TRACK_FILENAME);
+export const tracking = (root) => read(trackingPath(root), 'json') || {};
+export const defaultConfig = (configFile, options) => {
+ let defaultsJSON = findUp.sync('defaults.json', {
+ cwd: path.parse(configFile).dir,
+ stopAt: options.root
+ });
+ if (defaultsJSON) {
+ return readOSRConfig(defaultsJSON);
+ }
+ return {};
+};
+export const fromJSON = (configFile, options) => {
+ const defaults = defaultConfig(configFile, options);
+ const config = readOSRConfig(configFile);
+ return {
+ ...defaults,
+ ...config
+ };
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/index.js.map b/packages/discourse-legacy/dist/lib/sync/index.js.map
new file mode 100644
index 00000000..ea0db7a2
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACH,mBAAmB,EACtB,MAAM,wBAAwB,CAAA;AAc/B,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AAClC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAI3C,OAAO,EAA2B,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,CACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;AAGxC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,OAAqB,EAAoB,EAAE;IACzF,IAAI,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;QAC5C,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG;QAC/B,MAAM,EAAE,OAAO,CAAC,IAAI;KACvB,CAAC,CAAA;IACF,IAAI,YAAY,EAAE;QACd,OAAO,aAAa,CAAC,YAAY,CAAC,CAAA;KACrC;IACD,OAAO,EAEc,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAAE,OAAqB,EAAoB,EAAE;IACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IACxC,OAAO;QACH,GAAG,QAAQ;QACX,GAAG,MAAM;KACZ,CAAA;AACL,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/osrl.d.ts b/packages/discourse-legacy/dist/lib/sync/osrl.d.ts
new file mode 100644
index 00000000..2db09400
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/osrl.d.ts
@@ -0,0 +1,3 @@
+///
+export declare const fileAsBuffer: (path: string) => Buffer;
+export declare const createContent: (component: any, _options: IOptionsSyncComponent) => Promise;
diff --git a/packages/discourse-legacy/dist/lib/sync/osrl.js b/packages/discourse-legacy/dist/lib/sync/osrl.js
new file mode 100644
index 00000000..e6d028e5
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/osrl.js
@@ -0,0 +1,70 @@
+import * as path from 'path';
+import { Engine as engine } from '@plastichub/osrl/Engine';
+import { parse } from '@plastichub/osrl/options';
+import { forward_slash } from '@polymech/commons/glob';
+import { resolve } from '@polymech/commons';
+import { logger } from '../../index';
+import { git_status } from '../git';
+import * as moment from 'moment';
+import { sync as read } from '@polymech/fs/read';
+export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-");
+const variable_extras = async (component, rel, options) => {
+ const root = path.resolve(resolve('${OSR_LIBRARY_MACHINES}'));
+ const gitStats = await git_status(root, rel);
+ const latest = gitStats.latest;
+ return {
+ "GIT_LAST": moment(latest.date).format('LLLL'),
+ "GIT_AUTHOR": latest.author_name,
+ "GIT_MESSAGE": latest.message,
+ "GIT_COMMIT": latest.hash
+ };
+};
+export const createContent = async (component, _options) => {
+ const parts = path.parse(component);
+ const rel = forward_slash(path.relative(_options.root, component));
+ const extras = await variable_extras(component, rel, _options);
+ const variables = {
+ root: _options.root,
+ cwd: _options.cwd,
+ ..._options.variables,
+ product: rel,
+ product_rel: rel,
+ product_rel_min: rel,
+ ...extras
+ };
+ const defaults = {
+ language: _options.language,
+ debug: false,
+ profile: _options.profile,
+ // output: output,
+ plugins: [],
+ env: _options.env || 'forum',
+ cwd: _options.cwd,
+ source: _options.src,
+ variables
+ };
+ const options = parse(defaults, defaults);
+ const eOptions = {
+ ...options,
+ root: [
+ ...options.profile.includes,
+ component
+ ],
+ toHTML: false,
+ cache: false,
+ keepOutputType: true,
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: false
+ };
+ const Engine = new engine(eOptions);
+ options.debug && logger.info('Compile file ' + component, eOptions);
+ let content = await Engine.render(options.source, {
+ ...options.variables,
+ ...extras
+ });
+ return content;
+};
+//# sourceMappingURL=osrl.js.map
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/lib/sync/osrl.js.map b/packages/discourse-legacy/dist/lib/sync/osrl.js.map
new file mode 100644
index 00000000..ec3b9517
--- /dev/null
+++ b/packages/discourse-legacy/dist/lib/sync/osrl.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"osrl.js","sourceRoot":"","sources":["../../../src/lib/sync/osrl.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse-legacy/dist/main.d.ts b/packages/discourse-legacy/dist/main.d.ts
new file mode 100644
index 00000000..d1ebc9c7
--- /dev/null
+++ b/packages/discourse-legacy/dist/main.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/packages/discourse-legacy/dist/main.js b/packages/discourse-legacy/dist/main.js
new file mode 100644
index 00000000..5d7319eb
--- /dev/null
+++ b/packages/discourse-legacy/dist/main.js
@@ -0,0 +1,26 @@
+#!/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);
+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-legacy/dist/main.js.map b/packages/discourse-legacy/dist/main.js.map
new file mode 100644
index 00000000..f96906e4
--- /dev/null
+++ b/packages/discourse-legacy/dist/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;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAAC,QAAQ,EAAE,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AAChF,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAEnF,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;AACnG,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA;AAEhH,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAAC,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAE5G,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-legacy/dist/options.d.ts b/packages/discourse-legacy/dist/options.d.ts
new file mode 100644
index 00000000..6422e2d3
--- /dev/null
+++ b/packages/discourse-legacy/dist/options.d.ts
@@ -0,0 +1,2 @@
+export * from './lib';
+export declare const parse: (options: IOptions, argv: any) => IOptions;
diff --git a/packages/discourse-legacy/dist/options.js b/packages/discourse-legacy/dist/options.js
new file mode 100644
index 00000000..6c3f3948
--- /dev/null
+++ b/packages/discourse-legacy/dist/options.js
@@ -0,0 +1,21 @@
+import { resolveConfig } from '@polymech/core';
+export * from './lib';
+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-legacy/dist/options.js.map b/packages/discourse-legacy/dist/options.js.map
new file mode 100644
index 00000000..09a8aad7
--- /dev/null
+++ b/packages/discourse-legacy/dist/options.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAM9C,cAAc,OAAO,CAAA;AAKrB,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-legacy/dist/types.d.ts b/packages/discourse-legacy/dist/types.d.ts
new file mode 100644
index 00000000..665955d8
--- /dev/null
+++ b/packages/discourse-legacy/dist/types.d.ts
@@ -0,0 +1,158 @@
+import { PATH_INFO, SRC_VARIABLES } from '@polymech/commons';
+import { IBaseOptions as IOSRLBaseOptions } from '@plastichub/osrl';
+import { EDiscourseConfigKey } from 'lib/discourse/constants';
+import { IProcessingNode } from '@polymech/fs/interfaces';
+import { TFindFilter } from '@plastichub/osr-fs-utils';
+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 & IOSRLBaseOptions & {
+ 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-legacy/dist/types.js b/packages/discourse-legacy/dist/types.js
new file mode 100644
index 00000000..be91ef3e
--- /dev/null
+++ b/packages/discourse-legacy/dist/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-legacy/dist/types.js.map b/packages/discourse-legacy/dist/types.js.map
new file mode 100644
index 00000000..9bc42204
--- /dev/null
+++ b/packages/discourse-legacy/dist/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAuCA,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-legacy/docs/data.md b/packages/discourse-legacy/docs/data.md
new file mode 100644
index 00000000..4343dffd
--- /dev/null
+++ b/packages/discourse-legacy/docs/data.md
@@ -0,0 +1,22 @@
+### OA - Users
+
+cli::import-oa-users import|update
+
+src -> export const osr-commons/OA_LATEST = '${OSR_ROOT}/osr-directory/pp/${YYYY}_${MM}.json'
+
+ -> write (${OSR_ROOT}/${OSR_ROOT}/osr-directory/pp/invalidUsers.json)
+ -> write (${OSR_ROOT}/${OSR_ROOT}/osr-directory/pp/invalidUsersEMail.json)
+ -> merge to '${OSR_ROOT}/${OSR_ROOT}/osr-directory/pp/merged.json'
+
+### Discourse Directory Layout
+
+- Intro Page
+ - Continent (cat, +tags)
+ - country page (+tags, +lang)
+ - item (+tags, +lang)
+
+- External feeds
+ - social
+ - products
+ - osr content
+ - news
diff --git a/packages/discourse-legacy/index.md b/packages/discourse-legacy/index.md
new file mode 100644
index 00000000..751fdea7
--- /dev/null
+++ b/packages/discourse-legacy/index.md
@@ -0,0 +1,146 @@
+## Directory Index
+
+**Hidden / Censored Users** :
+
+**Total** :
+
+## Africa
+ - [Algeria (6)](/directory/users_algeria-af)
+- [Botswana (1)](/directory/users_botswana-af)
+- [Burkina Faso (2)](/directory/users_burkina-faso-af)
+- [Cabo Verde (1)](/directory/users_cabo-verde-af)
+- [Cameroon (2)](/directory/users_cameroon-af)
+- [Congo (3)](/directory/users_congo-(the-democratic-republic-of-the)-af)
+- [Egypt (7)](/directory/users_egypt-af)
+- [Eswatini (1)](/directory/users_eswatini-af)
+- [Ethiopia (2)](/directory/users_ethiopia-af)
+- [Ghana (5)](/directory/users_ghana-af)
+- [Kenya (14)](/directory/users_kenya-af)
+- [Libya (1)](/directory/users_libya-af)
+- [Madagascar (2)](/directory/users_madagascar-af)
+- [Mali (2)](/directory/users_mali-af)
+- [Mauritius (2)](/directory/users_mauritius-af)
+- [Morocco (2)](/directory/users_morocco-af)
+- [Namibia (3)](/directory/users_namibia-af)
+- [Nigeria (7)](/directory/users_nigeria-af)
+- [Reunion (1)](/directory/users_reunion-af)
+- [Senegal (1)](/directory/users_senegal-af)
+- [Somalia (1)](/directory/users_somalia-af)
+- [South Africa (16)](/directory/users_south-africa-af)
+- [Spain (58)](/directory/users_spain-af)
+- [Tanzania, the United Republic of (6)](/directory/users_tanzania-the-united-republic-of-af)
+- [Tunisia (3)](/directory/users_tunisia-af)
+- [Uganda (1)](/directory/users_uganda-af)
+- [Zambia (2)](/directory/users_zambia-af)
+## Asia
+ - [Armenia (1)](/directory/users_armenia-as)
+- [Azerbaijan (2)](/directory/users_azerbaijan-as)
+- [Bangladesh (6)](/directory/users_bangladesh-as)
+- [Cambodia (2)](/directory/users_cambodia-as)
+- [China (3)](/directory/users_china-as)
+- [Christmas Island (1)](/directory/users_christmas-island-as)
+- [Cyprus (3)](/directory/users_cyprus-as)
+- [Georgia (3)](/directory/users_georgia-as)
+- [Hong Kong (7)](/directory/users_hong-kong-as)
+- [India (42)](/directory/users_india-as)
+- [Indonesia (57)](/directory/users_indonesia-as)
+- [Iran (1)](/directory/users_iran-(islamic-republic-of)-as)
+- [Iraq (2)](/directory/users_iraq-as)
+- [Israel (1)](/directory/users_israel-as)
+- [Japan (16)](/directory/users_japan-as)
+- [Jordan (4)](/directory/users_jordan-as)
+- [Kazakhstan (1)](/directory/users_kazakhstan-as)
+- [Korea (16)](/directory/users_korea-(the-republic-of)-as)
+- [Kyrgyzstan (1)](/directory/users_kyrgyzstan-as)
+- [Lao People's Democratic Republic (1)](/directory/users_lao-people's-democratic-republic-(the)-as)
+- [Lebanon (2)](/directory/users_lebanon-as)
+- [Malaysia (13)](/directory/users_malaysia-as)
+- [Mongolia (2)](/directory/users_mongolia-as)
+- [Myanmar (1)](/directory/users_myanmar-as)
+- [Pakistan (1)](/directory/users_pakistan-as)
+- [Philippines (5)](/directory/users_philippines-(the)-as)
+- [Russian Federation (31)](/directory/users_russian-federation-(the)-as)
+- [Saudi Arabia (3)](/directory/users_saudi-arabia-as)
+- [Singapore (4)](/directory/users_singapore-as)
+- [Sri Lanka (1)](/directory/users_sri-lanka-as)
+- [Taiwan (2)](/directory/users_taiwan-(province-of-china)-as)
+- [Thailand (12)](/directory/users_thailand-as)
+- [Timor-Leste (2)](/directory/users_timor-leste-as)
+- [Turkiye (16)](/directory/users_turkiye-as)
+- [United Arab Emirates (3)](/directory/users_united-arab-emirates-(the)-as)
+- [Uzbekistan (2)](/directory/users_uzbekistan-as)
+- [Viet Nam (12)](/directory/users_viet-nam-as)
+## Australian continent
+ - [Australia (53)](/directory/users_australia-au)
+## Europe
+ - [Albania (2)](/directory/users_albania-eu)
+- [Austria (6)](/directory/users_austria-eu)
+- [Belarus (1)](/directory/users_belarus-eu)
+- [Belgium (18)](/directory/users_belgium-eu)
+- [Bosnia and Herzegovina (3)](/directory/users_bosnia-and-herzegovina-eu)
+- [Bulgaria (5)](/directory/users_bulgaria-eu)
+- [Croatia (4)](/directory/users_croatia-eu)
+- [Czechia (7)](/directory/users_czechia-eu)
+- [Denmark (4)](/directory/users_denmark-eu)
+- [Estonia (1)](/directory/users_estonia-eu)
+- [Finland (2)](/directory/users_finland-eu)
+- [France (95)](/directory/users_france-eu)
+- [Germany (66)](/directory/users_germany-eu)
+- [Greece (14)](/directory/users_greece-eu)
+- [Hungary (5)](/directory/users_hungary-eu)
+- [Iceland (1)](/directory/users_iceland-eu)
+- [Ireland (5)](/directory/users_ireland-eu)
+- [Italy (31)](/directory/users_italy-eu)
+- [Latvia (2)](/directory/users_latvia-eu)
+- [Liechtenstein (1)](/directory/users_liechtenstein-eu)
+- [Lithuania (2)](/directory/users_lithuania-eu)
+- [Malta (1)](/directory/users_malta-eu)
+- [Montenegro (1)](/directory/users_montenegro-eu)
+- [Netherlands (37)](/directory/users_netherlands-(the)-eu)
+- [Norway (7)](/directory/users_norway-eu)
+- [Poland (4)](/directory/users_poland-eu)
+- [Portugal (17)](/directory/users_portugal-eu)
+- [Romania (5)](/directory/users_romania-eu)
+- [Russian Federation (31)](/directory/users_russian-federation-(the)-eu)
+- [Serbia (6)](/directory/users_serbia-eu)
+- [Slovakia (6)](/directory/users_slovakia-eu)
+- [Slovenia (1)](/directory/users_slovenia-eu)
+- [Spain (58)](/directory/users_spain-eu)
+- [Sweden (4)](/directory/users_sweden-eu)
+- [Switzerland (15)](/directory/users_switzerland-eu)
+- [Ukraine (16)](/directory/users_ukraine-eu)
+- [United Kingdom of Great Britain and Northern Ireland (65)](/directory/users_united-kingdom-of-great-britain-and-northern-ireland-(the)-eu)
+## North America
+ - [Canada (42)](/directory/users_canada-na)
+- [Costa Rica (6)](/directory/users_costa-rica-na)
+- [Cuba (1)](/directory/users_cuba-na)
+- [Curacao (1)](/directory/users_curacao-na)
+- [Dominican Republic (9)](/directory/users_dominican-republic-(the)-na)
+- [Guatemala (2)](/directory/users_guatemala-na)
+- [Haiti (2)](/directory/users_haiti-na)
+- [Mexico (57)](/directory/users_mexico-na)
+- [Netherlands (37)](/directory/users_netherlands-(the)-na)
+- [Panama (3)](/directory/users_panama-na)
+- [Puerto Rico (3)](/directory/users_puerto-rico-na)
+- [United States of America (167)](/directory/users_united-states-of-america-(the)-na)
+## Oceania
+ - [Fiji (2)](/directory/users_fiji-oc)
+- [Guam (1)](/directory/users_guam-oc)
+- [Micronesia (1)](/directory/users_micronesia-(federated-states-of)-oc)
+- [New Caledonia (1)](/directory/users_new-caledonia-oc)
+- [New Zealand (10)](/directory/users_new-zealand-oc)
+- [United States of America (167)](/directory/users_united-states-of-america-(the)-oc)
+## South America
+ - [Argentina (34)](/directory/users_argentina-sa)
+- [Bolivia (2)](/directory/users_bolivia-(plurinational-state-of)-sa)
+- [Brazil (57)](/directory/users_brazil-sa)
+- [Chile (26)](/directory/users_chile-sa)
+- [Colombia (39)](/directory/users_colombia-sa)
+- [Ecuador (11)](/directory/users_ecuador-sa)
+- [Guyana (1)](/directory/users_guyana-sa)
+- [Paraguay (2)](/directory/users_paraguay-sa)
+- [Peru (9)](/directory/users_peru-sa)
+- [Uruguay (4)](/directory/users_uruguay-sa)
+- [Venezuela (5)](/directory/users_venezuela-(bolivarian-republic-of)-sa)
+
+
diff --git a/packages/discourse-legacy/package-lock.json b/packages/discourse-legacy/package-lock.json
new file mode 100644
index 00000000..b05cc984
--- /dev/null
+++ b/packages/discourse-legacy/package-lock.json
@@ -0,0 +1,4606 @@
+{
+ "name": "@polymech/discourse",
+ "version": "0.1.9",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "@polymech/discourse",
+ "version": "0.1.9",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@iarna/toml": "^2.2.5",
+ "@polymech/cache": "file:../cache",
+ "@polymech/commons": "file:../commons",
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@polymech/media": "file:../media",
+ "@polymech/registry": "file:../registry",
+ "@types/markdown-it": "^12.2.3",
+ "@types/node": "^14.17.5",
+ "@types/yargs": "^17.0.11",
+ "axios": "^0.27.2",
+ "bluebird": "^3.7.2",
+ "chalk": "^2.4.1",
+ "cheerio": "^1.0.0-rc.12",
+ "chokidar": "^3.5.3",
+ "download": "^8.0.0",
+ "env-var": "^7.1.1",
+ "escape-html": "^1.0.3",
+ "fast-glob": "^3.3.0",
+ "filenamify": "^4.3.0",
+ "find-up": "^5.0.0",
+ "front-matter": "^4.0.2",
+ "generate-password": "^1.7.0",
+ "glob-base": "^0.3.0",
+ "isomorphic-unfetch": "^4.0.2",
+ "js-base64": "^3.7.2",
+ "js-beautify": "^1.14.9",
+ "json-to-pretty-yaml": "^1.2.2",
+ "markdown-it": "^13.0.1",
+ "md5": "^2.3.0",
+ "moment": "^2.29.4",
+ "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",
+ "slugify": "^1.6.6",
+ "tslog": "^3.3.4",
+ "turndown": "^7.1.2",
+ "typescript": "^4.3.5",
+ "uri-js": "^4.4.1",
+ "yargs": "^17.5.1"
+ },
+ "bin": {
+ "pm-discourse": "main.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "../cache": {
+ "name": "@polymech/cache",
+ "version": "0.4.8",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@polymech/commons": "file:../commons",
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@polymech/log": "file:../log",
+ "@types/node": "^22.10.2",
+ "cacache": "^19.0.1",
+ "md5": "^2.3.0",
+ "p-map": "^7.0.3",
+ "ssri": "^10.0.1",
+ "yargs": "^17.7.2"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "../commons": {
+ "name": "@polymech/commons",
+ "version": "0.2.6",
+ "license": "BSD",
+ "dependencies": {
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@repo/typescript-config": "file:../typescript-config",
+ "@schemastore/package": "^0.0.10",
+ "env-var": "^7.5.0",
+ "glob": "^10.4.5",
+ "js-yaml": "^4.1.0",
+ "jsonpath-plus": "^10.3.0",
+ "normalize-url": "^8.0.1",
+ "p-map": "^7.0.3",
+ "p-throttle": "^4.1.1",
+ "regedit": "^5.1.4",
+ "tslog": "^3.3.3",
+ "tsup": "^2.0.3",
+ "yargs": "^17.7.2",
+ "zod": "^3.24.3",
+ "zod-to-json-schema": "^3.24.5",
+ "zod-to-ts": "^1.2.0"
+ },
+ "bin": {
+ "pm-cli": "dist/main.js"
+ },
+ "devDependencies": {
+ "@types/node": "^22.12.0",
+ "typescript": "^5.7.3"
+ }
+ },
+ "../core": {
+ "name": "@polymech/core",
+ "version": "0.2.6",
+ "license": "BSD",
+ "dependencies": {
+ "tslog": "^3.3.3",
+ "type-fest": "^4.37.0",
+ "zod": "^3.24.1"
+ },
+ "devDependencies": {
+ "@repo/typescript-config": "../typescript-config",
+ "@types/node": "^22.12.0",
+ "typescript": "^5.7.3"
+ }
+ },
+ "../fs": {
+ "name": "@polymech/fs",
+ "version": "0.13.41",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@polymech/core": "file:../core",
+ "@repo/typescript-config": "file:../typescript-config",
+ "denodeify": "^1.2.1",
+ "glob": "^10.4.1",
+ "mime": "^2.0.3",
+ "minimatch": "^10.0.1",
+ "mkdirp": "^3.0.1",
+ "q": "^1.4.1",
+ "rimraf": "^6.0.1",
+ "write-file-atomic": "^6.0.0",
+ "yargs": "^17.7.2"
+ },
+ "devDependencies": {
+ "@types/denodeify": "^1.2.31",
+ "@types/mime": "^2.0.0",
+ "@types/node": "^22.10.2",
+ "fs-extra": "^4.0.2",
+ "globals": "^15.14.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^5.7.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "../media": {
+ "name": "@polymech/media",
+ "version": "0.3.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@polymech/cache": "file:../cache",
+ "@polymech/commons": "file:../commons",
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@polymech/log": "file:../log",
+ "@types/fluent-ffmpeg": "^2.1.27",
+ "@types/node": "^24.0.10",
+ "bluebird": "^3.7.2",
+ "download": "^8.0.0",
+ "electron": "^37.2.6",
+ "fast-glob": "^3.3.2",
+ "fluent-ffmpeg": "^2.1.3",
+ "glob": "^11.0.0",
+ "js-beautify": "^1.14.6",
+ "lucide-react": "^0.539.0",
+ "mupdf": "^1.3.3",
+ "novita-sdk": "^1.0.37",
+ "p-map": "^7.0.3",
+ "regedit": "^5.1.4",
+ "replicate": "^1.0.1",
+ "sharp": "^0.34.3",
+ "tslog": "^4.9.3",
+ "typescript": "^5.8.3",
+ "webpack": "^5.101.1",
+ "webpack-cli": "^6.0.1",
+ "webpack-visualizer-plugin2": "^2.0.0",
+ "yargs": "^18.0.0",
+ "zod": "^3.25.74"
+ },
+ "bin": {
+ "pm-media": "dist-in/main.js"
+ },
+ "devDependencies": {
+ "@types/glob": "^8.1.0",
+ "@types/showdown": "^2.0.6",
+ "nexe": "^5.0.0-beta.4",
+ "pkg": "^5.8.1",
+ "vitest": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "../registry": {
+ "name": "@polymech/registry",
+ "version": "0.1.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@keyv/sqlite": "^4.0.6",
+ "@polymech/commons": "file:../commons",
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@polymech/log": "file:../log",
+ "@types/node": "^24.10.1",
+ "env-var": "^7.0.1",
+ "keyv": "^5.5.4",
+ "keyv-file": "^5.3.3",
+ "p-map": "^4.0.0",
+ "tslog": "^4.10.2",
+ "typescript": "^4.9.5",
+ "yargs": "^18.0.0"
+ },
+ "bin": {
+ "polymech-registry": "main.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@iarna/toml": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
+ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
+ "license": "ISC"
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1"
+ }
+ },
+ "node_modules/@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
+ "license": "MIT"
+ },
+ "node_modules/@mixmark-io/domino": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
+ "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==",
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@one-ini/wasm": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
+ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
+ "license": "MIT"
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@polymech/cache": {
+ "resolved": "../cache",
+ "link": true
+ },
+ "node_modules/@polymech/commons": {
+ "resolved": "../commons",
+ "link": true
+ },
+ "node_modules/@polymech/core": {
+ "resolved": "../core",
+ "link": true
+ },
+ "node_modules/@polymech/fs": {
+ "resolved": "../fs",
+ "link": true
+ },
+ "node_modules/@polymech/media": {
+ "resolved": "../media",
+ "link": true
+ },
+ "node_modules/@polymech/registry": {
+ "resolved": "../registry",
+ "link": true
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
+ "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "12.2.3",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz",
+ "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/linkify-it": "*",
+ "@types/mdurl": "*"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "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"
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "license": "MIT"
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "license": "ISC",
+ "engines": {
+ "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",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/archive-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz",
+ "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==",
+ "license": "MIT",
+ "dependencies": {
+ "file-type": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/archive-type/node_modules/file-type": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz",
+ "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "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",
+ "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.14.9",
+ "form-data": "^4.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "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",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
+ "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==",
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "^2.3.5",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+ "license": "MIT"
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
+ "license": "MIT"
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
+ },
+ "node_modules/cacheable-request": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
+ "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==",
+ "license": "MIT",
+ "dependencies": {
+ "clone-response": "1.0.2",
+ "get-stream": "3.0.0",
+ "http-cache-semantics": "3.8.1",
+ "keyv": "3.0.0",
+ "lowercase-keys": "1.0.0",
+ "normalize-url": "2.0.1",
+ "responselike": "1.0.2"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "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/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/charenc": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+ "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz",
+ "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.1",
+ "htmlparser2": "^10.0.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.12.0",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=20.18.1"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cliui/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/cliui/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/condense-newlines": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz",
+ "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==",
+ "license": "MIT",
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-whitespace": "^0.3.0",
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/crypt": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+ "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "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",
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+ "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/decompress": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz",
+ "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "decompress-tar": "^4.0.0",
+ "decompress-tarbz2": "^4.0.0",
+ "decompress-targz": "^4.0.0",
+ "decompress-unzip": "^4.0.1",
+ "graceful-fs": "^4.1.10",
+ "make-dir": "^1.0.0",
+ "pify": "^2.3.0",
+ "strip-dirs": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-tar": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz",
+ "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "file-type": "^5.2.0",
+ "is-stream": "^1.1.0",
+ "tar-stream": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-tar/node_modules/file-type": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+ "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-tarbz2": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz",
+ "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==",
+ "license": "MIT",
+ "dependencies": {
+ "decompress-tar": "^4.1.0",
+ "file-type": "^6.1.0",
+ "is-stream": "^1.1.0",
+ "seek-bzip": "^1.0.5",
+ "unbzip2-stream": "^1.0.9"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-tarbz2/node_modules/file-type": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz",
+ "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-targz": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz",
+ "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==",
+ "license": "MIT",
+ "dependencies": {
+ "decompress-tar": "^4.1.1",
+ "file-type": "^5.2.0",
+ "is-stream": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-targz/node_modules/file-type": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz",
+ "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-unzip": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz",
+ "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==",
+ "license": "MIT",
+ "dependencies": {
+ "file-type": "^3.8.0",
+ "get-stream": "^2.2.0",
+ "pify": "^2.3.0",
+ "yauzl": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress-unzip/node_modules/file-type": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+ "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decompress-unzip/node_modules/get-stream": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
+ "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4.0.1",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decompress-unzip/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decompress/node_modules/make-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
+ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress/node_modules/make-dir/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/decompress/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/download": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/download/-/download-8.0.0.tgz",
+ "integrity": "sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==",
+ "license": "MIT",
+ "dependencies": {
+ "archive-type": "^4.0.0",
+ "content-disposition": "^0.5.2",
+ "decompress": "^4.2.1",
+ "ext-name": "^5.0.0",
+ "file-type": "^11.1.0",
+ "filenamify": "^3.0.0",
+ "get-stream": "^4.1.0",
+ "got": "^8.3.1",
+ "make-dir": "^2.1.0",
+ "p-event": "^2.1.0",
+ "pify": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/download/node_modules/filenamify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-3.0.0.tgz",
+ "integrity": "sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==",
+ "license": "MIT",
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.0",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/duplexer3": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
+ "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "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",
+ "integrity": "sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==",
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "version-range": "^4.15.0"
+ },
+ "engines": {
+ "ecmascript": ">= es5",
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/editorconfig": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz",
+ "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@one-ini/wasm": "0.1.1",
+ "commander": "^10.0.0",
+ "minimatch": "9.0.1",
+ "semver": "^7.5.3"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-var": {
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz",
+ "integrity": "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ext-list": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
+ "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.28.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ext-name": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
+ "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ext-list": "^2.0.0",
+ "sort-keys-length": "^1.0.0"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fetch-blob": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "node-domexception": "^1.0.0",
+ "web-streams-polyfill": "^3.0.3"
+ },
+ "engines": {
+ "node": "^12.20 || >= 14.13"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-11.1.0.tgz",
+ "integrity": "sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "license": "MIT",
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "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",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formdata-polyfill": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+ "license": "MIT",
+ "dependencies": {
+ "fetch-blob": "^3.1.2"
+ },
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "node_modules/front-matter": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz",
+ "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==",
+ "license": "MIT",
+ "dependencies": {
+ "js-yaml": "^3.13.1"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "license": "MIT"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generate-password": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/generate-password/-/generate-password-1.7.1.tgz",
+ "integrity": "sha512-9bVYY+16m7W7GczRBDqXE+VVuCX+bWNrfYKC/2p2JkZukFb2sKxT6E3zZ3mJGz7GMe5iRK0A/WawSL3jQfJuNQ==",
+ "license": "MIT"
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==",
+ "license": "MIT",
+ "dependencies": {
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob-base/node_modules/glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^2.0.0"
+ }
+ },
+ "node_modules/glob-base/node_modules/is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob-base/node_modules/is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
+ "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/is": "^0.7.0",
+ "cacheable-request": "^2.1.1",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^3.0.0",
+ "into-stream": "^3.1.0",
+ "is-retry-allowed": "^1.1.0",
+ "isurl": "^1.0.0-alpha5",
+ "lowercase-keys": "^1.0.0",
+ "mimic-response": "^1.0.0",
+ "p-cancelable": "^0.4.0",
+ "p-timeout": "^2.0.1",
+ "pify": "^3.0.0",
+ "safe-buffer": "^5.1.1",
+ "timed-out": "^4.0.1",
+ "url-parse-lax": "^3.0.0",
+ "url-to-options": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/got/node_modules/get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/got/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "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",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbol-support-x": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
+ "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-to-string-tag-x": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
+ "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbol-support-x": "^1.4.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.1",
+ "entities": "^6.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
+ "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",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/into-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
+ "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "from2": "^2.1.1",
+ "p-is-promise": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "license": "MIT"
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-natural-number": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz",
+ "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz",
+ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-retry-allowed": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
+ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "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",
+ "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/isomorphic-unfetch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-4.0.2.tgz",
+ "integrity": "sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==",
+ "license": "MIT",
+ "dependencies": {
+ "node-fetch": "^3.2.0",
+ "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",
+ "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
+ "license": "MIT",
+ "dependencies": {
+ "has-to-string-tag-x": "^1.2.0",
+ "is-object": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/js-base64": {
+ "version": "3.7.8",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz",
+ "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/js-beautify": {
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz",
+ "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==",
+ "license": "MIT",
+ "dependencies": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^1.0.4",
+ "glob": "^10.4.2",
+ "js-cookie": "^3.0.5",
+ "nopt": "^7.2.1"
+ },
+ "bin": {
+ "css-beautify": "js/bin/css-beautify.js",
+ "html-beautify": "js/bin/html-beautify.js",
+ "js-beautify": "js/bin/js-beautify.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "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",
+ "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "remedial": "^1.0.7",
+ "remove-trailing-spaces": "^1.0.6"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
+ "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz",
+ "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~3.0.1",
+ "linkify-it": "^4.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
+ "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/md5": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
+ "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "~1.1.6"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
+ "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/native-promise-pool": {
+ "version": "3.28.0",
+ "resolved": "https://registry.npmjs.org/native-promise-pool/-/native-promise-pool-3.28.0.tgz",
+ "integrity": "sha512-ixwkLwaF+idXLS/UJlVbmgl4obzQxYKNRU7yiwcIoi3PedVC+MvG476k3Ak0RgPoxCN9RcP/+o/5anJBOneiQw==",
+ "license": "Artistic-2.0",
+ "dependencies": {
+ "editions": "^6.21.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/node-domexception": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/jimmywarting"
+ },
+ {
+ "type": "github",
+ "url": "https://paypal.me/jimmywarting"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.5.0"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+ "license": "MIT",
+ "dependencies": {
+ "data-uri-to-buffer": "^4.0.0",
+ "fetch-blob": "^3.1.4",
+ "formdata-polyfill": "^4.0.10"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/node-fetch"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
+ "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
+ "license": "MIT",
+ "dependencies": {
+ "prepend-http": "^2.0.0",
+ "query-string": "^5.0.1",
+ "sort-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "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",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
+ "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-event": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz",
+ "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==",
+ "license": "MIT",
+ "dependencies": {
+ "p-timeout": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-is-promise": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
+ "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-timeout": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+ "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+ "license": "MIT",
+ "dependencies": {
+ "p-finally": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "license": "MIT",
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pretty": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz",
+ "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==",
+ "license": "MIT",
+ "dependencies": {
+ "condense-newlines": "^0.2.1",
+ "extend-shallow": "^2.0.1",
+ "js-beautify": "^1.6.12"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "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",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "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",
+ "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
+ "license": "MIT",
+ "dependencies": {
+ "decode-uri-component": "^0.2.0",
+ "object-assign": "^4.1.0",
+ "strict-uri-encode": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/querystring": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz",
+ "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==",
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/remedial": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz",
+ "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==",
+ "license": "(MIT OR Apache-2.0)",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/remove-trailing-spaces": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz",
+ "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",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/sanitize-filename": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+ "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+ "license": "WTFPL OR ISC",
+ "dependencies": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "node_modules/seek-bzip": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz",
+ "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^2.8.1"
+ },
+ "bin": {
+ "seek-bunzip": "bin/seek-bunzip",
+ "seek-table": "bin/seek-bzip-table"
+ }
+ },
+ "node_modules/seek-bzip/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/showdown": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/showdown/-/showdown-2.1.0.tgz",
+ "integrity": "sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^9.0.0"
+ },
+ "bin": {
+ "showdown": "bin/showdown.js"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://www.paypal.me/tiviesantos"
+ }
+ },
+ "node_modules/showdown/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-git": {
+ "version": "3.30.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz",
+ "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "debug": "^4.4.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
+ }
+ },
+ "node_modules/slugify": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
+ "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/sort-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
+ "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sort-keys-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
+ "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==",
+ "license": "MIT",
+ "dependencies": {
+ "sort-keys": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sort-keys-length/node_modules/sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "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",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "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/strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-dirs": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz",
+ "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-natural-number": "^4.0.1"
+ }
+ },
+ "node_modules/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
+ "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^1.0.0",
+ "buffer-alloc": "^1.2.0",
+ "end-of-stream": "^1.0.0",
+ "fs-constants": "^1.0.0",
+ "readable-stream": "^2.3.0",
+ "to-buffer": "^1.1.1",
+ "xtend": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "license": "MIT"
+ },
+ "node_modules/timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-buffer": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz",
+ "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==",
+ "license": "MIT",
+ "dependencies": {
+ "isarray": "^2.0.5",
+ "safe-buffer": "^5.2.1",
+ "typed-array-buffer": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/to-buffer/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "license": "WTFPL",
+ "dependencies": {
+ "utf8-byte-length": "^1.0.1"
+ }
+ },
+ "node_modules/tslog": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/tslog/-/tslog-3.3.4.tgz",
+ "integrity": "sha512-N0HHuHE0e/o75ALfkioFObknHR5dVchUad4F0XyFf3gXJYB++DewEzwGI/uIOM216E5a43ovnRNEeQIq9qgm4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "source-map-support": "^0.5.21"
+ },
+ "engines": {
+ "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",
+ "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@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",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "license": "MIT"
+ },
+ "node_modules/unbzip2-stream": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "through": "^2.3.8"
+ }
+ },
+ "node_modules/undici": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz",
+ "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
+ },
+ "node_modules/unfetch": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-5.0.0.tgz",
+ "integrity": "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==",
+ "license": "MIT",
+ "workspaces": [
+ "./packages/isomorphic-unfetch"
+ ]
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prepend-http": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/url-to-options": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
+ "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/utf8-byte-length": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
+ "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==",
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "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",
+ "integrity": "sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==",
+ "license": "Artistic-2.0",
+ "engines": {
+ "node": ">=4"
+ },
+ "funding": {
+ "url": "https://bevry.me/fund"
+ }
+ },
+ "node_modules/web-streams-polyfill": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/packages/discourse-legacy/package.json b/packages/discourse-legacy/package.json
new file mode 100644
index 00000000..db38b116
--- /dev/null
+++ b/packages/discourse-legacy/package.json
@@ -0,0 +1,85 @@
+{
+ "name": "@polymech/discourse",
+ "description": "",
+ "version": "0.1.9",
+ "typings": "index.d.ts",
+ "type": "module",
+ "publishConfig": {
+ "access": "public"
+ },
+ "module": "main.js",
+ "main": "main.js",
+ "bin": {
+ "pm-discourse": "main.js"
+ },
+ "dependencies": {
+ "@iarna/toml": "^2.2.5",
+ "@polymech/cache": "file:../cache",
+ "@polymech/commons": "file:../commons",
+ "@polymech/core": "file:../core",
+ "@polymech/fs": "file:../fs",
+ "@polymech/media": "file:../media",
+ "@polymech/registry": "file:../registry",
+ "@types/markdown-it": "^12.2.3",
+ "@types/node": "^14.17.5",
+ "@types/yargs": "^17.0.11",
+ "axios": "^0.27.2",
+ "bluebird": "^3.7.2",
+ "chalk": "^2.4.1",
+ "cheerio": "^1.0.0-rc.12",
+ "chokidar": "^3.5.3",
+ "download": "^8.0.0",
+ "env-var": "^7.1.1",
+ "escape-html": "^1.0.3",
+ "fast-glob": "^3.3.0",
+ "filenamify": "^4.3.0",
+ "find-up": "^5.0.0",
+ "front-matter": "^4.0.2",
+ "generate-password": "^1.7.0",
+ "glob-base": "^0.3.0",
+ "isomorphic-unfetch": "^4.0.2",
+ "js-base64": "^3.7.2",
+ "js-beautify": "^1.14.9",
+ "json-to-pretty-yaml": "^1.2.2",
+ "markdown-it": "^13.0.1",
+ "md5": "^2.3.0",
+ "moment": "^2.29.4",
+ "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",
+ "slugify": "^1.6.6",
+ "tslog": "^3.3.4",
+ "turndown": "^7.1.2",
+ "typescript": "^4.3.5",
+ "uri-js": "^4.4.1",
+ "yargs": "^17.5.1"
+ },
+ "scripts": {
+ "test": "tsc; mocha --full-trace mocha \"spec/**/*.spec.js\"",
+ "test-with-coverage": "istanbul cover node_modules/.bin/_mocha -- 'spec/**/*.spec.js'",
+ "lint": "tslint --project=./tsconfig.json",
+ "build": "tsc -p . --declaration",
+ "dev": "tsc -p . --declaration -w",
+ "typings": "tsc --declaration",
+ "docs": "npx typedoc src/index.ts",
+ "dev-test-watch": "mocha-typescript-watch",
+ "typesafe-i18n": "typesafe-i18n",
+ "link-dev": "sh scripts/link-dev.sh"
+ },
+ "homepage": "https://git.osr-plastic.org/plastichub/lib-content",
+ "repository": {
+ "type": "git",
+ "url": "https://git.osr-plastic.org/plastichub/lib-content.git"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "license": "BSD-3-Clause",
+ "keywords": [
+ "typescript"
+ ]
+}
diff --git a/packages/discourse-legacy/src/_cli.ts b/packages/discourse-legacy/src/_cli.ts
new file mode 100644
index 00000000..78047a29
--- /dev/null
+++ b/packages/discourse-legacy/src/_cli.ts
@@ -0,0 +1,81 @@
+import { sync as exists } from '@polymech/fs/exists'
+import { IOptions, IOptionsSync } from './types'
+import { logger } from './'
+import * as path from 'path'
+
+import { forward_slash, pathInfo } from "@polymech/commons"
+import { isFile, resolve } from "@polymech/commons"
+
+import { substitute } from './index'
+
+const globBase = require('glob-base')
+
+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: string) => {
+ 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/commands/import-oa-howtos.ts b/packages/discourse-legacy/src/commands/import-oa-howtos.ts
similarity index 100%
rename from packages/discourse/src/commands/import-oa-howtos.ts
rename to packages/discourse-legacy/src/commands/import-oa-howtos.ts
diff --git a/packages/discourse/src/commands/import-oa-users.ts b/packages/discourse-legacy/src/commands/import-oa-users.ts
similarity index 100%
rename from packages/discourse/src/commands/import-oa-users.ts
rename to packages/discourse-legacy/src/commands/import-oa-users.ts
diff --git a/packages/discourse/src/commands/info.ts b/packages/discourse-legacy/src/commands/info.ts
similarity index 100%
rename from packages/discourse/src/commands/info.ts
rename to packages/discourse-legacy/src/commands/info.ts
diff --git a/packages/discourse/src/commands/query.ts b/packages/discourse-legacy/src/commands/query.ts
similarity index 100%
rename from packages/discourse/src/commands/query.ts
rename to packages/discourse-legacy/src/commands/query.ts
diff --git a/packages/discourse/src/commands/sync-component.ts b/packages/discourse-legacy/src/commands/sync-component.ts
similarity index 100%
rename from packages/discourse/src/commands/sync-component.ts
rename to packages/discourse-legacy/src/commands/sync-component.ts
diff --git a/packages/discourse/src/commands/sync-directory.ts b/packages/discourse-legacy/src/commands/sync-directory.ts
similarity index 100%
rename from packages/discourse/src/commands/sync-directory.ts
rename to packages/discourse-legacy/src/commands/sync-directory.ts
diff --git a/packages/discourse/src/commands/sync-file.ts b/packages/discourse-legacy/src/commands/sync-file.ts
similarity index 100%
rename from packages/discourse/src/commands/sync-file.ts
rename to packages/discourse-legacy/src/commands/sync-file.ts
diff --git a/packages/discourse-legacy/src/constants.ts b/packages/discourse-legacy/src/constants.ts
new file mode 100644
index 00000000..2f24aa3a
--- /dev/null
+++ b/packages/discourse-legacy/src/constants.ts
@@ -0,0 +1 @@
+export const MODULE_NAME = `OSR-DISCOURSE`
diff --git a/packages/discourse-legacy/src/index.ts b/packages/discourse-legacy/src/index.ts
new file mode 100644
index 00000000..35b158ce
--- /dev/null
+++ b/packages/discourse-legacy/src/index.ts
@@ -0,0 +1,19 @@
+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-legacy/src/lib/discourse/cache.ts b/packages/discourse-legacy/src/lib/discourse/cache.ts
new file mode 100644
index 00000000..97413f1c
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/discourse/cache.ts
@@ -0,0 +1,192 @@
+
+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 { sync as mkdir } from '@polymech/fs/dir'
+import { files } from '@polymech/commons'
+
+import { IUploadedFileMeta } from '@polymech/commons'
+import { forward_slash } from '@polymech/commons'
+
+import {
+ IOptions,
+ IImportUser,
+ IOAHowto,
+ IOACategory,
+ IOATags,
+ IOAHowtoImport,
+ IDiscourseUser
+} from '../../'
+
+import {
+ logger
+} from '../../index'
+
+import {
+ HT_CATS,
+ DISCOURSE_CATEGORY_CACHE,
+ DISCOURSE_TAGS_CACHE,
+ DISCOURSE_TOPICS_CACHE,
+ DISCOURSE_USER_CACHE,
+ OSR_CACHE_ROOT,
+ OSR_DISCOURSE_CACHE,
+} from '../discourse/constants'
+
+
+import { Discourser } from '../index'
+
+import * as path from 'path'
+
+import * as cheerio from 'cheerio'
+
+import { html_beautify } from 'js-beautify'
+import { Converter } from 'showdown'
+
+const escapeHtml = require('escape-html')
+const pretty = require('pretty')
+
+export const fileAsBuffer = (path: string) => read(path, 'buffer') as Buffer || Buffer.from("-")
+
+import { get_cached, set_cached } from '@plastichub/osr-cache/lib'
+import { OSR_CACHE } from '@polymech/commons'
+
+import * as md5 from 'md5'
+
+import {
+ MODULE_NAME
+} from '../../constants'
+
+
+export const cacheCategories = async (options: any, discourse: Discourser) => {
+
+ 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: any, discourse: Discourser) => {
+
+}
+
+let uPage = 1
+let usersAll = []
+
+export const _getForumUsers = async (d: Discourser, page, detail) => {
+
+ const uPath = path.resolve(resolve(DISCOURSE_USER_CACHE))
+
+ if (uPage == 1) {
+ usersAll = []
+ }
+ let users: any = 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: IDiscourseUser[] = read(uPath, 'json') || [] as any
+
+ const add = async (u: IDiscourseUser) => {
+ 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: IDiscourseUser) => {
+ return add(u)
+ }, { concurrency: 1 })
+
+ }
+}
+export const getForumUsers = async (d, detail): Promise => {
+ return _getForumUsers(d, uPage, detail)
+}
+
+export const cacheUsers = async (options, discourse: Discourser): Promise => {
+
+ 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') as any
+ }
+
+ 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: Discourser) => {
+ 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
+}
\ No newline at end of file
diff --git a/packages/discourse-legacy/src/lib/discourse/constants.ts b/packages/discourse-legacy/src/lib/discourse/constants.ts
new file mode 100644
index 00000000..2560a124
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/discourse/constants.ts
@@ -0,0 +1,119 @@
+
+//////////////////////////////////////////////////////////////
+//
+// Keys
+//
+
+export type EDiscourseConfigKey = 'discourse' | 'discourse_admin'
+
+//////////////////////////////////////////////////////////////
+//
+// 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
+}
+
+
+
diff --git a/packages/discourse-legacy/src/lib/discourse/index.ts b/packages/discourse-legacy/src/lib/discourse/index.ts
new file mode 100644
index 00000000..ac4c0412
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/discourse/index.ts
@@ -0,0 +1,1295 @@
+import { MODULE_NAME } from '../../constants'
+
+import { CONFIG_DEFAULT } from '@polymech/commons'
+
+import { IOSRConfig, IDiscourseConfig } from '@polymech/commons/types'
+
+import { logger as _logger } from '@polymech/core/debug'
+
+export const logger: any = _logger(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 axios from 'axios'
+import * as fs from 'fs'
+import * as path from 'path'
+import * as FormData from 'form-data'
+
+const https = require('https')
+const request = require("request")
+const fetch = require('isomorphic-unfetch')
+
+export const escape = (path: string) =>
+ path.replace(/[^\w]/g, '-').replace(/-+/, '-')
+
+import { generate } from 'generate-password'
+
+import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types'
+
+// types
+import {
+ PostUpdateRequest,
+ Category,
+ CategoriesResponse,
+ PostsResponse,
+ PostResponse,
+ TopicResponse,
+ TopicItem,
+ CategoryResponse,
+ PostItem,
+ PostUpdateResponse,
+ PostUpdateItem,
+ TopicUpdateTimestampRequest,
+ TopicUpdateTimestampResponse,
+ IDiscourserConfig,
+ Thread,
+ PostModifier,
+ FetchConfig,
+ FetchOptions,
+ PostConfig,
+ ISearchResult,
+ ICreateUserResponse,
+ IUserDetail,
+ TagsResponse,
+ Tag,
+ TopicUpdateBasicTopic
+} from './types';
+import { IDiscourseUser } from '@polymech/commons'
+import { EDiscourseConfigKey } from './constants'
+import { IDImage } from '../oa/index'
+
+
+
+/**
+ * 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 {
+ 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) {
+ 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: TopicItem | TopicResponse | number): string {
+ 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 }: FetchConfig): Promise {
+ // 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 as unknown) as T
+ }
+ // fetch
+ const result = await this.pool.open(() => this._fetch({ url, request }))
+ // write to cache if cache is enabled
+ if (cache) {
+ write(cache, result as any)
+ }
+ // return the result
+ return result
+ }
+
+
+ /** Fetch a discourse API URL, with rate limit retries */
+ private async _post(url, data): Promise {
+ const opts: RequestInit = {
+ headers: {
+ 'Api-Key': this.key,
+ 'Api-Username': this.username,
+ },
+ }
+ let d = data;
+ const res = await axios.post(url, d, {
+ headers: opts.headers as any
+ });
+
+ // 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 as any).errors !== 'undefined') {
+ // check if the error is a rate limit
+ const wait: number = (data as any).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 */
+ private async _fetch({ url, request }: FetchConfig): Promise {
+
+ 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: number) => {
+ 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: T
+
+ try {
+ data = JSON.parse(text) as T
+ } 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 as any).errors !== 'undefined') {
+ // check if the error is a rate limit
+ const wait: number = (data as any).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
+ */
+ public async search(
+ query: string,
+ params: string = '',
+ opts: FetchOptions = {}
+ ): Promise {
+ let url = `${this.host}/search.json?q=${encodeURIComponent(query)} ${encodeURIComponent(params)}`;
+ return await this.fetch({ url, ...opts })
+ }
+ // =================================
+ // Tags
+
+ /**
+ * API Helper for {@link .getTags}
+ */
+ protected async getTagsResponse(
+ opts: FetchOptions = {}
+ ): Promise {
+ 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: FetchOptions = {}): Promise {
+ const response = await this.getTagsResponse(opts)
+ const tags = response.tags
+ return tags
+ }
+
+ async createTag(name): Promise {
+ const url = `${this.host}/tag_groups.json`
+ try {
+ return await this._post(url, {
+ name
+ });
+ } catch (error) {
+ debugger
+ }
+
+ }
+
+ // =================================
+ // CATEGORIES
+
+ /**
+ * API Helper for {@link .getCategories}
+ */
+ protected async getCategoriesResponse(
+ opts: FetchOptions = {}
+ ): Promise {
+ 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: FetchOptions = {}): Promise {
+ 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.
+ */
+ protected async getCategoryResponse(
+ categoryID: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ 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: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ // prepare and fetch
+ let page = opts.page || 0
+ const response = await this.getCategoryResponse(categoryID, {
+ ...opts,
+ page,
+ })
+
+ let topics: TopicItem[] = 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: TopicItem) => i.id)
+ }
+
+ topics = topics.filter((t) => t.visible === true);
+
+ return topics
+ }
+
+ /**
+ * Fetch the partial information, for all topics of specific categoires
+ */
+ async getTopicItemsOfCategories(
+ categoryIDs: number[],
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: FetchOptions = {}) {
+ 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: number, opts: FetchOptions = {}): Promise {
+ 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?: number[] | null,
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: number,
+ listed: boolean = true,
+ visible: TPostStatus = 'visible'
+ ): Promise {
+ 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: number,
+ timestamp: Date | string | number,
+ token: string
+ ): Promise {
+ let time: number
+ 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`
+
+ let ret = await fetch(url, {
+ "headers": {
+
+ "accept-language": "en-GB,en-US;q=0.9,en;q=0.8,de;q=0.7,es;q=0.6,fr;q=0.5",
+ "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
+ "x-csrf-token": token,
+ "x-requested-with": "XMLHttpRequest",
+ "cookie": "_bypass_cache=true; _ga_MBZGKNMDWC=GS1.1.1685892974.20.1.1685893082.0.0.0; _ga_P4SR15V1XR=GS1.1.1687459978.51.1.1687460537.0.0.0; _ga_H8W78Y3P2B=GS1.1.1687604701.23.0.1687604701.0.0.0; _ga=GA1.1.401826746.1678337758; _t=xQ05qW5JFxLM9Pq0lIwG6ez74Z1q2OLpak0DzRx8VdFYE5eI3oJXhLURPrdm2zIcHmYcBj9q%2BKdHhGz5N6j9mXitYzcMwkXHL3K9GYKdO4gJ8tBQimpmd1HFaRhB9Ml9aJ8WviqQWDZDOYwEUKFcWw3wbAalfQtbdIbUSX8gH9sG6DLFU3HiEg7tWModRy%2BoFrTm6QOalDuajRW3nBazau%2FiY8ZCVm2g30Y10CBDfqJHL1ztV8XM4kEIeulLNTzGVtSb7uuO1OcjZRSb--aDgCPEalq7SIpnH5--HWCNf5readaeij3oDl9b9w%3D%3D; __profilin=p%3Dt%2Ca%3Deef38e031f99cc8240f3518e1b8811cf; _forum_session=RkEWuzKI1QXBYCnP6KRamD8mweZ3h9%2B6G%2Fi23gAWUgy8gp8FuiyQD5lKU0Fbx3FzzaM4SiQcvnIiEAnb5P4OYjlvstqwWlfRp%2B9is7iX8StwYGiYsncHQ5LrzSbV3y9mR7sj%2F8JZ8evQOe2ZZjZB3iEkppsGrmyFrw5PsUgSphRTZm70SKIw96JrW17yK4hhLqtk%2BaQPgNu4oJl42YfXAr%2FCBldcBUKXFeHppYmv61WECV0531hCo7GcA4t06B9QpSr%2BeoiM1Ok9tpQrAlZf36Ka4lVCTyXXu3SNvbtvfd9tZMJCWDYv69jdMsezuOaEP870pk9qYPaL4x6nAY5EXO3u9usCggqQ1B1EydCK9uMy7ZUCIo9wONw7QOIgEQ%3D%3D--GMqYSb2H7xXVDky6--R9gVciBqwC0IL9LefywrFw%3D%3D; _ga_GVR8PEPG6C=GS1.1.1687710574.106.1.1687710599.0.0.0",
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ "body": `timestamp=${time}`,
+ "method": "PUT"
+ });
+
+ if (ret && ret.status === 200) {
+ return true
+ }
+ return
+
+ /*
+ let data = new FormData();
+ data.append('timestamp', time);
+
+ try {
+ let ret = await axios.put(url, data, {
+ headers: {
+ //'Accept-Language': 'en-US,en;q=0.8',
+ //'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ //'Content-Type': `multipart/form-data; boundary=${data._boundary}`,
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ }
+ });
+ debugger
+ } catch (error) {
+ debugger
+ }
+
+
+ return
+ */
+
+ /*
+ var options = {
+ method: 'PUT',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body: `timestamp=${time}`
+ };
+
+ new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+ */
+
+ /*
+ var options = {
+ method: 'POST',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body
+ }
+
+
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+*/
+
+
+ // prepare the request
+ const request: TopicUpdateTimestampRequest = {
+ 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}
+ */
+ protected async getPostItemsOfTopicResponse(
+ topicID: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ const url = `${this.host}/t/${topicID}/posts.json`
+ const response = await this.fetch({ url, ...opts })
+ return response
+ }
+
+ async _createUser(name, email, pUserGroup): Promise {
+
+ 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
+ }) satisfies ICreateUserResponse;
+
+ 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): Promise {
+ const url = `${this.host}/admin/users/list/active.json?page=` + page
+ const response = await this.fetch({ url })
+ return response
+ }
+
+ async getUser(id): Promise {
+ 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: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ const response = await this.getPostItemsOfTopicResponse(topicID, opts)
+ const posts: PostItem[] = 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: number[],
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: number[],
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: FetchOptions = {}): Promise {
+ 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: number, opts: FetchOptions = {}): Promise {
+ const url = `${this.host}/posts/${id}.json`
+ return this.fetch({ url, ...opts })
+ }
+
+ async createReply(postId, raw, category) {
+
+ const url = `${this.host}/posts.json`;
+
+ let data: any = new FormData();
+ data.append('topic_id', '' + postId);
+ data.append('raw', raw);
+ data.append('nested_post', 'true');
+ data.append('category', category);
+ var options = {
+ method: 'POST',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ "body": `raw=${raw}&unlist_topic=false&category=${category}&topic_id=${postId}&is_warning=false&archetype=regular&featured_link=&shared_draft=false&nested_post=true`,
+ };
+
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+
+ }
+
+ async changeOwner(postId: string | number, topicId: string | number, owner: string
+ ) {
+ const url = `${this.host}/t/${topicId}/change-owner.json`;
+ var options = {
+ method: 'POST',
+ url: url,
+ headers:
+ {
+ 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+ 'Api-Key': this.key,
+ 'Api-Username': this.username
+ },
+ body: `post_ids%5B%5D=${postId}&username=${owner}`
+ };
+
+
+ return new Promise((resolve, reject) => {
+ request(options, function (error, response, body) {
+ if (error) {
+ throw new Error(error);
+ } else {
+ resolve(body);
+ }
+ });
+ });
+ }
+
+ async createUser(data): Promise {
+ const url = `${this.host}/users`
+ return await this._post(url, data);
+ }
+
+ async getUserByUsername(username): Promise {
+ const url = `${this.host}/u/${username}.json`
+ const response = await this.fetch({ url })
+ return (response as any).user
+ }
+
+ async setUserAvatar(user_name, upload_id): Promise {
+ // 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): Promise {
+
+ 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): Promise {
+ // fetch whole posts
+ const url = `${this.host}/uploads.json`;
+
+ let data: any = 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
+ }
+ });
+ }
+
+ async uploadFile(userId, file): Promise {
+ // fetch whole posts
+ const url = `${this.host}/uploads.json`;
+ let data: any = 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
+ }
+ });
+ }
+
+ // =================================
+ // POSTS: UPDATING
+
+ /**
+ * Fetch the whole information, for all posts, or specific posts, of the forum
+ */
+ async getPosts(
+ postIDs?: number[] | null,
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: string,
+ raw: string,
+ category: number
+ ) {
+ // 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: number,
+ content: string,
+ reason: string = 'api update',
+ old?: string
+ ): Promise {
+ // prepare the request
+ const data: PostUpdateRequest = {
+ 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: number,
+ category_id: number,
+ title: string,
+ tags?: string[]
+ ): Promise {
+ 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: number): Promise {
+
+ 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: PostResponse,
+ modifier: PostModifier
+ ): Promise {
+ // 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 as unknown) as PostUpdateItem),
+ 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: number, modifier: PostModifier) {
+ 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: PostItem, modifier: PostModifier) {
+ return this.modifyPost(await this.getPost(post.id), modifier)
+ }
+
+ /**
+ * Run the post modifier on all specified posts
+ */
+ async modifyPosts(
+ posts: PostResponse[],
+ modifier: PostModifier
+ ): Promise {
+ const updates = await Promise.all(
+ posts.map((post) => this.modifyPost(post, modifier))
+ )
+ const updated = updates.filter((i) => i) as PostUpdateItem[]
+ return updated
+ }
+
+ // =================================
+ // THREADS
+
+ /**
+ * Fetch the partial information, for all posts of a specific topic
+ * Alias of {@link .getPostItemsOfTopic}.
+ */
+ async getThread(topicID: number, opts: FetchOptions = {}): Promise {
+ 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: number[],
+ opts: FetchOptions = {}
+ ): Promise {
+ 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: number,
+ opts: FetchOptions = {}
+ ): Promise {
+ // 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: number[],
+ opts: FetchOptions = {}
+ ): Promise {
+ return await Promise.all(
+ categoryIDs.map((id) => this.getThreadsOfCategory(id, opts))
+ )
+ }
+
+ async updateUserProfile(userId, prefs: UserPreferencesUpdate): Promise {
+
+ const url = `${this.host}/u/${userId}.json`
+ let data: any = 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
+ }
+ })
+ }
+
+ /*
+ {
+ "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"
+});
+
+
+ */
+
+
+}
+
+
+export const Instance = (config?: IDiscourseConfig, key: EDiscourseConfigKey = 'discourse_admin') => {
+
+ return new Discourser(config || (CONFIG_DEFAULT() as IOSRConfig)[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);
+
+ });
+ */
+}
\ No newline at end of file
diff --git a/packages/discourse-legacy/src/lib/discourse/types.ts b/packages/discourse-legacy/src/lib/discourse/types.ts
new file mode 100644
index 00000000..dc7e3502
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/discourse/types.ts
@@ -0,0 +1,761 @@
+// Attempt at TypeScript Types for the Discourse API
+// https://docs.discourse.org
+
+
+export interface Failure {
+ success: 'OK' // docs say lowercase, reality is uppercase
+}
+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
+}
+
+// This isn't documented, but is is there on
+// https://docs.discourse.org/#tag/Topics/paths/~1t~1{id}.json/get
+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
+ }
+}
+
+// https://docs.discourse.org/#tag/Tags/operation/listTags
+
+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[] // not part of the api docs, but is there
+ title: string
+ unpinned: object
+ user_id: number
+ views: number
+ visible: boolean
+ word_count: object
+ post_stream: {
+ posts: Array
+ // not sure what this is
+ stream: Array
+ }
+ // not sure what this is
+ 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[]
+}
+
+// import { post } from 'request';
+
+/** 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
+ // https://forum.osr-plastic.org/uploads/default/original/2X/4/476f01418c38779ac641bb45e985ad4097c7d175.jpeg
+ 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
+ }
+
+
\ No newline at end of file
diff --git a/packages/discourse/src/lib/git/index.ts b/packages/discourse-legacy/src/lib/git/index.ts
similarity index 100%
rename from packages/discourse/src/lib/git/index.ts
rename to packages/discourse-legacy/src/lib/git/index.ts
diff --git a/packages/discourse-legacy/src/lib/index.ts b/packages/discourse-legacy/src/lib/index.ts
new file mode 100644
index 00000000..80bc51e3
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/index.ts
@@ -0,0 +1,3 @@
+export * from './discourse'
+export * from './discourse/types'
+
diff --git a/packages/discourse-legacy/src/lib/markdown/Pattern.ts b/packages/discourse-legacy/src/lib/markdown/Pattern.ts
new file mode 100644
index 00000000..a1bfc465
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/Pattern.ts
@@ -0,0 +1,13 @@
+import { RegExCallback } from './types'
+export class Pattern {
+ regex: RegExp;
+ replacement: RegExCallback
+ constructor(regex: RegExp, replacement: any) {
+ this.regex = regex
+ this.replacement = replacement
+ }
+
+ apply(raw: string): string {
+ return raw.replace(this.regex, this.replacement)
+ }
+}
diff --git a/packages/discourse-legacy/src/lib/markdown/Rule.ts b/packages/discourse-legacy/src/lib/markdown/Rule.ts
new file mode 100644
index 00000000..73c296cc
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/Rule.ts
@@ -0,0 +1,17 @@
+import { Pattern } from './Pattern';
+
+export class Rule {
+ name: string;
+ patterns: Pattern[];
+ constructor(name: string, patterns: Pattern[]) {
+ this.name = name;
+ this.patterns = patterns;
+ }
+
+ apply(raw: string): string {
+ return this.patterns.reduce(
+ (result, pattern) => pattern.apply(result),
+ raw
+ );
+ }
+}
diff --git a/packages/discourse-legacy/src/lib/markdown/index.test.ts b/packages/discourse-legacy/src/lib/markdown/index.test.ts
new file mode 100644
index 00000000..929727f5
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/index.test.ts
@@ -0,0 +1,144 @@
+import { Pattern, RMark, Rule } from './index';
+
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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
+
+
+
Header 2
+
+
+
Header 3
+
+
+
Header 4
+
+
+
Header 5
+
+
+
Header 6
+
+
+
+Bold
+
+
+Italic
+
+
+
+Link
+
+
+
+
+
+
+This is Bold and this is Italic .
+
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+
+
+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
+
+`;
+
+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(
+ '\nLorem 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('\nBold
\n');
+ expect(new RMark().render('__Bold__')).toBe('\nBold
\n');
+ expect(new RMark().render('This is **Bold**')).toBe(
+ '\nThis is Bold
\n'
+ );
+ });
+ test('should render italic', () => {
+ expect(new RMark().render('*Italic*')).toBe('\nItalic
\n');
+ expect(new RMark().render('_Italic_')).toBe('\nItalic
\n');
+ });
+ test('should render image', () => {
+ expect(
+ new RMark().render(
+ ''
+ )
+ ).toBe(
+ '\n
\n'
+ );
+ });
+ test('should render link', () => {
+ expect(new RMark().render('[Link](https://github.com)')).toBe(
+ '\nLink
\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');
+ });
+});
diff --git a/packages/discourse-legacy/src/lib/markdown/index.ts b/packages/discourse-legacy/src/lib/markdown/index.ts
new file mode 100644
index 00000000..02014e13
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/index.ts
@@ -0,0 +1,125 @@
+import { Rule } from './Rule'
+import { Pattern } from './Pattern'
+
+import { RMarkOptions } from './types'
+
+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"
+
+const defaultRules: Rule[] = [
+ 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, ' '),
+ ]),
+ 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: RMarkOptions) {
+ this.rules = defaultRulesDiscourse(options.images, options.links)
+ }
+
+ private rules: Rule[]
+
+ public addRuleBefore(rule: Rule, before: string): RMark {
+ const index = this.rules.findIndex((r) => r.name === before);
+ if (index !== -1) {
+ this.rules.splice(index, 0, rule);
+ }
+ return this;
+ }
+
+ public addRule(rule: Rule): RMark {
+ this.addRuleBefore(rule, 'paragraph');
+ return this;
+ }
+
+ public render(raw: string) {
+ let result = raw;
+ this.rules.forEach((rule) => {
+ result = rule.apply(result);
+ });
+ return result;
+ }
+}
+
+export { Rule } from './Rule';
+export { Pattern } from './Pattern';
+
+// 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: string): string[] {
+ 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: string): string[] {
+ const regex = /\/(?:[^\/#\s]+\/)*[^\/#\s]+\.(?:jpe?g|gif|png|webp)/g
+ const matches = input.match(regex)
+ return matches || []
+}
+
+function findUploadImageUrls(input: string): string[] {
+ const regex = /upload:\/\/[^\s]+?\.(?:jpe?g|gif|png)/gi;
+ const matches = input.match(regex);
+ return matches || [];
+}
\ No newline at end of file
diff --git a/packages/discourse-legacy/src/lib/markdown/page.ts b/packages/discourse-legacy/src/lib/markdown/page.ts
new file mode 100644
index 00000000..049c2ee4
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/page.ts
@@ -0,0 +1,28 @@
+import { RMark } from '.';
+
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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);
+}
diff --git a/packages/discourse-legacy/src/lib/markdown/types.ts b/packages/discourse-legacy/src/lib/markdown/types.ts
new file mode 100644
index 00000000..20331a2e
--- /dev/null
+++ b/packages/discourse-legacy/src/lib/markdown/types.ts
@@ -0,0 +1,6 @@
+export type RegExCallback = (match, capture, arg1, arg2) => string
+
+export interface RMarkOptions {
+ images: RegExCallback,
+ links?: RegExCallback
+}
\ No newline at end of file
diff --git a/packages/discourse/src/lib/oa/commons.ts b/packages/discourse-legacy/src/lib/oa/commons.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/commons.ts
rename to packages/discourse-legacy/src/lib/oa/commons.ts
diff --git a/packages/discourse/src/lib/oa/howtos.ts b/packages/discourse-legacy/src/lib/oa/howtos.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/howtos.ts
rename to packages/discourse-legacy/src/lib/oa/howtos.ts
diff --git a/packages/discourse/src/lib/oa/index.ts b/packages/discourse-legacy/src/lib/oa/index.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/index.ts
rename to packages/discourse-legacy/src/lib/oa/index.ts
diff --git a/packages/discourse/src/lib/oa/lib.ts b/packages/discourse-legacy/src/lib/oa/lib.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/lib.ts
rename to packages/discourse-legacy/src/lib/oa/lib.ts
diff --git a/packages/discourse/src/lib/oa/types.ts b/packages/discourse-legacy/src/lib/oa/types.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/types.ts
rename to packages/discourse-legacy/src/lib/oa/types.ts
diff --git a/packages/discourse/src/lib/oa/users.ts b/packages/discourse-legacy/src/lib/oa/users.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/users.ts
rename to packages/discourse-legacy/src/lib/oa/users.ts
diff --git a/packages/discourse/src/lib/oa/utils.ts b/packages/discourse-legacy/src/lib/oa/utils.ts
similarity index 100%
rename from packages/discourse/src/lib/oa/utils.ts
rename to packages/discourse-legacy/src/lib/oa/utils.ts
diff --git a/packages/discourse/src/lib/osr/index.ts b/packages/discourse-legacy/src/lib/osr/index.ts
similarity index 100%
rename from packages/discourse/src/lib/osr/index.ts
rename to packages/discourse-legacy/src/lib/osr/index.ts
diff --git a/packages/discourse/src/lib/osr/urls.ts b/packages/discourse-legacy/src/lib/osr/urls.ts
similarity index 100%
rename from packages/discourse/src/lib/osr/urls.ts
rename to packages/discourse-legacy/src/lib/osr/urls.ts
diff --git a/packages/discourse/src/lib/sync/commons.ts b/packages/discourse-legacy/src/lib/sync/commons.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/commons.ts
rename to packages/discourse-legacy/src/lib/sync/commons.ts
diff --git a/packages/discourse/src/lib/sync/component.ts b/packages/discourse-legacy/src/lib/sync/component.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/component.ts
rename to packages/discourse-legacy/src/lib/sync/component.ts
diff --git a/packages/discourse/src/lib/sync/directory.ts b/packages/discourse-legacy/src/lib/sync/directory.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/directory.ts
rename to packages/discourse-legacy/src/lib/sync/directory.ts
diff --git a/packages/discourse/src/lib/sync/download.ts b/packages/discourse-legacy/src/lib/sync/download.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/download.ts
rename to packages/discourse-legacy/src/lib/sync/download.ts
diff --git a/packages/discourse/src/lib/sync/file.ts b/packages/discourse-legacy/src/lib/sync/file.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/file.ts
rename to packages/discourse-legacy/src/lib/sync/file.ts
diff --git a/packages/discourse/src/lib/sync/index.ts b/packages/discourse-legacy/src/lib/sync/index.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/index.ts
rename to packages/discourse-legacy/src/lib/sync/index.ts
diff --git a/packages/discourse/src/lib/sync/osrl.ts b/packages/discourse-legacy/src/lib/sync/osrl.ts
similarity index 100%
rename from packages/discourse/src/lib/sync/osrl.ts
rename to packages/discourse-legacy/src/lib/sync/osrl.ts
diff --git a/packages/discourse-legacy/src/main.ts b/packages/discourse-legacy/src/main.ts
new file mode 100644
index 00000000..5d757bef
--- /dev/null
+++ b/packages/discourse-legacy/src/main.ts
@@ -0,0 +1,22 @@
+#!/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)
+
+const argv: any = cli.argv;
+
+if (argv.help) {
+ cli.showHelp();
+ process.exit();
+} else if (argv.v || argv.version) {
+ process.exit();
+}
diff --git a/packages/discourse-legacy/src/options.ts b/packages/discourse-legacy/src/options.ts
new file mode 100644
index 00000000..059ba992
--- /dev/null
+++ b/packages/discourse-legacy/src/options.ts
@@ -0,0 +1,28 @@
+
+import { resolveConfig } from '@polymech/core'
+
+export * from './lib/index.js'
+
+import { IOptions } from './types.js'
+
+
+export const parse = (options: IOptions, argv: any): IOptions => {
+
+ 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
+}
\ No newline at end of file
diff --git a/packages/discourse-legacy/src/types.ts b/packages/discourse-legacy/src/types.ts
new file mode 100644
index 00000000..bf97cdd8
--- /dev/null
+++ b/packages/discourse-legacy/src/types.ts
@@ -0,0 +1,205 @@
+
+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
+}
+
+///////////////////////////////////////////////////////
+//
+// Sync Types
+//
+
+/**
+ * An enumeration to narrow a conflict resolve to a single item or for all following conflicts.
+ *
+ * @export
+ * @enum {number}
+ */
+export enum EResolve {
+ /**
+ * Always will use the chose conflict settings for all following conflicts.
+ */
+ ALWAYS,
+ /**
+ * 'This' will use the conflict settings for a single conflict so the conflict callback will be triggered again for the next conflict.
+ */
+ THIS
+}
+
+/**
+ * The possible modes to resolve a conflict during a sync
+ *
+ * @export
+ * @enum {number}
+ */
+export enum EResolveMode {
+ SKIP = 0,
+ OVERWRITE,
+ IF_NEWER,
+ IF_SIZE_DIFFERS,
+ THROW,
+ RETRY,
+ ABORT
+}
+
+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 & {
+
+ // common options
+ debug?: boolean
+ verbose?: boolean
+ logLevel?: string
+ skip?: boolean
+ alt?: boolean
+ src?: string
+ verb: string
+
+ // cache options
+ cache?: boolean
+
+ filter?: TFindFilter | string
+
+ // OSR - Config Discorse Key
+ config?: string | EDiscourseConfigKey
+
+ // internals
+ pathVariables?: Hash
+ variables?: SRC_VARIABLES
+
+ repo?: string
+ root?: string
+
+ product_root?: string
+
+ // parsed options
+ srcInfo?: PATH_INFO
+
+ //tracking
+ post_id?: number
+ topic_id?: number
+
+}
+
+export type IOptionsSyncComponent = IOptionsSync &
+{
+ format?: string
+ module?: string
+ plugins?: string
+ onCompiled?: () => void
+ onCompileDone?: () => void
+ cache?: boolean
+ skip?: boolean
+
+}
+
+
+//////////////////////////////////////////////////////////////////
+//
+// Basic types
+//
+
+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-legacy/templates/discourse/machines/debug.osr b/packages/discourse-legacy/templates/discourse/machines/debug.osr
new file mode 100644
index 00000000..f1db6cc9
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/debug.osr
@@ -0,0 +1,6 @@
+## Product
+[% js %]
+ if(debug){
+ return "" + prettyJSON(store.product) + " ";
+ }
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/global.json b/packages/discourse-legacy/templates/discourse/machines/global.json
new file mode 100644
index 00000000..32cf6363
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/global.json
@@ -0,0 +1,33 @@
+{
+ "vendor_name": "Plastic Hub",
+ "vendor_website": "https://plastic-hub.com/",
+ "vendor_products_external": "https://plastic-hub.com/products/",
+ "vendor_instagram": "https://www.instagram.com/osr_plastic/",
+ "_vendor_youtube": "https://www.youtube.com/channel/UCuWDxJtV2pf5BefHEy09Cew/featured?view_as=subscriber",
+ "vendor_github": "https://git.osr-plastic.org/osr-plastic",
+ "vendor_contact_email": "mailto:sales2@plastic-hub.com",
+ "vendor_whatsapp": "tel:0034691952287",
+ "vendor_facebook": "https://www.facebook.com/plastichubcat/",
+ "vendor_blog": "https://precious-plastic.org/",
+ "vendor_discord": "https://discord.gg/vR5d6ShTez",
+ "author_link_pp": "https://preciousplastic.com/",
+ "author_link": "https://osr-plastic.org",
+ "site": "https://precious-plastic.org/",
+ "OSR_HOWTOS_ROOT_URL": "https://osr-plastic.org/howtos/",
+ "OSR_HOWTOS_PATH": "../../ph3/pp-next2/howtos",
+ "OSR_FILES_WEB":"http://files.osr-plastic.org/files/osr-machines/",
+ "OSR_MACHINES_ASSETS_URL":"https://assets.osr-plastic.org/machines/",
+ "show": {
+ "badges": false,
+ "authors": true,
+ "head": true,
+ "debug": false,
+ "wiki": false,
+ "forum": false,
+ "others": false,
+ "howtos":false,
+ "instagram":false,
+ "shipping":true,
+ "payment_terms":true
+ }
+}
\ No newline at end of file
diff --git a/packages/discourse-legacy/templates/discourse/machines/header_jekyll.osr b/packages/discourse-legacy/templates/discourse/machines/header_jekyll.osr
new file mode 100644
index 00000000..d3632bfe
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/header_jekyll.osr
@@ -0,0 +1,95 @@
+[% capture config %][% js %]
+const globalVariables = readJSON('${root}/osr/global.json');
+addGlobal({config:globalVariables});
+return globalVariables;
+[%endjs%][% endcapture %]
+[% capture product %][% js %]
+
+ let globalVariables = readJSON('${root}/osr/global.json');
+ let localVariables = readJSON('${PRODUCT_ROOT}/config.json');
+ let localYAML = readFile('${PRODUCT_ROOT}/config.yaml');
+
+ let defaultsYAML = fs.findUp.sync('defaults.yaml', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+ });
+
+ if(defaultsYAML){
+ defaultsYAML = readFile(defaultsYAML).trim();
+ localYAML = `${defaultsYAML}\n${localYAML}`;
+ }
+
+ let defaultsJSON = fs.findUp.sync('defaults.json', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+ });
+
+ if(defaultsJSON){
+ defaultsJSON = readJSON(defaultsJSON);
+ localVariables = {
+ ...defaultsJSON,
+ ...localVariables
+ }
+ }
+
+
+ let allVariables = {
+ ...localVariables,
+ ...globalVariables,
+ ...scope
+ }
+ let all = substitute(JSON.stringify(allVariables,null,2),allVariables);
+ allVariables = JSON.parse(all);
+ resolveConfig(allVariables);
+ return allVariables;
+
+[%endjs%][% endcapture %]
+---
+[% js %]
+let globalVariables = readJSON('${root}/osr/global.json');
+resolveConfig(globalVariables);
+addGlobal(globalVariables);
+let localVariables = readJSON('${PRODUCT_ROOT}/config.json');
+let localYAML = readFile('${PRODUCT_ROOT}/config.yaml');
+
+let defaultsYAML = fs.findUp.sync('defaults.yaml', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+});
+
+if(defaultsYAML){
+ defaultsYAML = readFile(defaultsYAML).trim();
+ localYAML = `${defaultsYAML}\n${localYAML}`;
+}
+
+let defaultsJSON = fs.findUp.sync('defaults.json', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+});
+
+if(defaultsJSON){
+ defaultsJSON = readJSON(defaultsJSON);
+ localVariables = {
+ ...defaultsJSON,
+ ...localVariables
+ }
+}
+localVariables['rel']=product.replace('products/','');
+localVariables['image']='${abs_url}/${product_rel}/renderings/perspective.jpg';
+let allVariables = {
+ ...localVariables,
+ ...globalVariables,
+ ...scope
+
+}
+
+let all = substitute(JSON.stringify(allVariables, null, 2), allVariables);
+allVariables = JSON.parse(all);
+resolveConfig(allVariables);
+store.product = allVariables;
+addGlobal(allVariables);
+register('product', allVariables);
+const yaml = substitute(localYAML, allVariables);
+return (YAML.stringify(allVariables) + yaml).trim();
+[%endjs%]
+---
diff --git a/packages/discourse-legacy/templates/discourse/machines/plugins/html.js b/packages/discourse-legacy/templates/discourse/machines/plugins/html.js
new file mode 100644
index 00000000..9ba73ea7
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/plugins/html.js
@@ -0,0 +1,50 @@
+const path = require('path');
+
+const link = (name, link, _class) => `${name} `;
+const wrap = (content) => `
+
+`;
+
+const image = (src, link, style) => ` `;
+
+const item = (content, style = 'border-color: #c5c5c5;width: 300px;display: inline-block', title) =>
+ `
+ ${content}
+
${title||''}
+`;
+
+const styles = {
+ thumb: 'border:none; width:200px;max-height:200px'
+};
+
+const center_caption = (el = 'h5', text) => `<${el} style="text-align:center">${text}${el}>`;
+
+const thumbs = (url, folder) => {
+ const context = require('@plastichub/osrl/library').getContext();
+ folder = path.resolve(folder);
+ let images = context.fs.images(folder, {
+ absolute: false
+ });
+ images = images.map((i) => item(image(`${url}/${i}`), 'border:none; width:200px;max-height:200px'));
+ images = wrap(images.join('\n'));
+ return images;
+}
+module.exports = {
+ html: {
+ link: link,
+ caption: {
+ center: center_caption
+ },
+ container: {
+ wrap: wrap,
+ item: item
+ },
+ image: image,
+ styles: styles,
+ thumbs: thumbs
+ }
+};
\ No newline at end of file
diff --git a/packages/discourse-legacy/templates/discourse/machines/root.html b/packages/discourse-legacy/templates/discourse/machines/root.html
new file mode 100644
index 00000000..ef5b6fc9
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/root.html
@@ -0,0 +1,54 @@
+[% include "product_variables.osr" %]
+[% include "body.md" %]
+[% include "header_notice.osr" %]
+[%- include "product_overview_drawings.osr" -%]
+
+[%- if product.showSpecs !=false || config.show.authors -%]
+
+
+ [%- if product.showSpecs !=false -%]
+
+
Specification
+ [% include "product_specs.osr" html:false %]
+
+ [%endif%]
+
+ [% if config.show.authors %]
+ [%- if product.showAuthors !=false -%]
+ [% include "authors_html.osr" authors:product.authors showHeader:true %]
+ [%endif%]
+ [%endif%]
+
+
+
+[%endif%]
+
+[%- if product.showResources !=false %]
+ [% include "product_resources.osr" %]
+[%endif%]
+
+
+
+[% if config.show.shipping %]
+ [% include "product_shipping.osr" %]
+[% endif -%]
+
+[% if config.show.payment_terms %]
+ [% include "payment_terms.osr" %]
+[% endif -%]
+
+
+
+[% if config.show.others %]
+ [% include "other_products.osr" %]
+[%endif%]
+[% if config.show.howtos %]
+ [% include "product_howtos.osr" %]
+[%endif%]
+[% include "social_links.osr" %]
+[% if config.show.instagram %]
+[% include "vendor_instagram.osr" %]
+[%endif%]
+[% if config.show.debug %]
+ [% include "product_debug.osr" %]
+[%endif%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/variables.osr b/packages/discourse-legacy/templates/discourse/machines/variables.osr
new file mode 100644
index 00000000..c0ec07cf
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/variables.osr
@@ -0,0 +1,56 @@
+[% capture config %][% js %]
+const globalVariables = readJSON('${root}/osr/global.json');
+addGlobal({config:globalVariables});
+return globalVariables;
+[%endjs%][% endcapture %]
+
+[% capture product %][% js %]
+
+ let globalVariables = readJSON('${root}/osr/global.json');
+ let localVariables = readJSON('${PRODUCT_ROOT}/config.json');
+ localVariables['image']='${product_rel}/renderings/perspective.jpg';
+ localVariables['rel']=product.replace('products/','');
+ localVariables['sidebar'] = {
+ nav: "machines"
+ };
+
+ let localYAML = readFile('${PRODUCT_ROOT}/config.yaml');
+
+ let defaultsYAML = fs.findUp.sync('defaults.yaml', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+ });
+
+ if(defaultsYAML){
+ defaultsYAML = readFile(defaultsYAML).trim();
+ localYAML = `${defaultsYAML}\n${localYAML}`;
+ }
+
+ let defaultsJSON = fs.findUp.sync('defaults.json', {
+ cwd:PRODUCT_ROOT,
+ stopAt:root
+ });
+
+ if(defaultsJSON){
+ defaultsJSON = readJSON(defaultsJSON);
+ localVariables = {
+ ...defaultsJSON,
+ ...localVariables
+ }
+ }
+
+
+ let allVariables = {
+ ...localVariables,
+ ...globalVariables,
+ ...scope
+ }
+ allVariables.product_rel = product;
+ allVariables.product_rel_min = product.replace('products/','')
+ let all = substitute(JSON.stringify(allVariables,null,2),allVariables);
+ allVariables = JSON.parse(all);
+ resolveConfig(allVariables);
+ addGlobal({product:allVariables});
+ return allVariables;
+
+[%endjs%][% endcapture %]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/authors.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/authors.osr
new file mode 100644
index 00000000..b1877bb8
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/authors.osr
@@ -0,0 +1,10 @@
+[%if showHeader %]
+## Authors
+[%endif%]
+
+[% for author in authors %]
+- [ [[author.name]] ]( [[author.url]] )
+[% endfor %]
+
+[% js %]
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/authors_html.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/authors_html.osr
new file mode 100644
index 00000000..9e64af50
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/authors_html.osr
@@ -0,0 +1,8 @@
+[%if showHeader %]
+ Authors
+[%endif%]
+
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/extra_resources.md b/packages/discourse-legacy/templates/discourse/machines/widgets/extra_resources.md
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/forum.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/forum.osr
new file mode 100644
index 00000000..d1990202
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/forum.osr
@@ -0,0 +1,25 @@
+[%js%]
+try{
+ return new Promise((resolve, reject) => {
+ const d = new Discourse.Discourser({
+ host: config.discourse.host,
+ key: config.discourse.key,
+ username: config.discourse.username,
+ rateLimitConcurrency: 1
+ });
+ d.getTopicItemsOfCategories([category]).then((posts) => {
+ if(!posts.length){
+ return '';
+ }
+ posts = posts.map((p)=>{
+ const url = `${config.discourse.host}/t/${p.id}`;
+ const title = `${p.fancy_title}`;
+ return `${title} `;
+ }).join('\n');
+ resolve(posts);
+ });
+ });
+}catch(e){
+ debugger;
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/gallery.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/gallery.osr
new file mode 100644
index 00000000..b4fda644
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/gallery.osr
@@ -0,0 +1,10 @@
+[%js%]
+const _path = substitute(`${cwd}/${product_rel}/${path}`)
+if(fs.images(_path).length)
+{
+ const t = html.thumbs(`${abs_url}/${product_rel}/${path}`,_path);
+ return `${name} ${t}`;
+}else{
+ console.log(_path + 'doesnt exists');
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/howtos.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/howtos.osr
new file mode 100644
index 00000000..79207c4b
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/howtos.osr
@@ -0,0 +1,12 @@
+[%js%]
+if(store.product.howtos && store.product.howtos.length){
+ return store.product.howtos.map((i)=>{
+ return i
+ }).join('\n ');
+ /*
+ const t = html.thumbs(`${abs_url}/${product}/media/products`,`${PRODUCT_ROOT}/media/products`);
+ return `Products done with ${store.product.name}
+ ${t}`;
+ */
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/other_products.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/other_products.osr
new file mode 100644
index 00000000..0b87ed16
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/other_products.osr
@@ -0,0 +1,25 @@
+
+
See our other products
+
+[%js%]
+const template = readFile('${root}/osr/bazar/other_item.html');
+let product = store.product;
+let all = config.all.filter((p)=>{
+ return p.slug !== product.slug;
+})
+const ret = all.map((p)=>{
+ const vars = {
+ ...p,
+ image: p.image || substitute('${abs_url}/' + p.rel + '/renderings/perspective.jpg',global)
+ }
+ return substitute(template,vars);
+})
+return ret;
+[%endjs%]
+
+
+
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/overview_drawings.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/overview_drawings.osr
new file mode 100644
index 00000000..9ed438a8
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/overview_drawings.osr
@@ -0,0 +1,27 @@
+[%- if product.showDimensions !=false -%]
+ Dimensions
+
+
+
+
+
+
+[%- endif -%]
+[%- if product.showParts !=false -%]
+
+
+
+
+
[% include 'product_parts.osr' %]
+
+
+
+
+[%- endif -%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/parts.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/parts.osr
new file mode 100644
index 00000000..46f60401
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/parts.osr
@@ -0,0 +1,7 @@
+[%js%]
+let p = PRODUCT_ROOT;
+const _path = path.resolve(PRODUCT_ROOT + './parts.xlsx');
+const data = xlsx.parse(_path);
+data[0].data = data[0].data.filter((d) => !!d.length);
+return md2html(markdownTable(data[0].data));
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/resources.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/resources.osr
new file mode 100644
index 00000000..4ee51d6e
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/resources.osr
@@ -0,0 +1,45 @@
+
+### Resources
+
+[% if product.forum -%]
+- [Forum]([[product.forum]])
+[% endif %]
+[%- if product.download -%]
+- [Download]([[product.download]])
+[% endif %]
+[%- if product.firmware -%]
+- [Firmware]([[product.firmware]])
+[%- endif %]
+[%- if product.Preview3d -%]
+[%- if product.edrawings -%]
+- [3D-Preview]([[product.edrawings]])
+[% else %]
+- [3D-Preview]([[OSR_MACHINES_ASSETS_URL]]/[[product.product_rel_min]]/resources/edrawings.html)
+[% endif -%]
+- [Source Code Repository]([[GIT_REPO]]/src/branch/master/[[product.rel]])
+[%-endif-%]
+[%- if product.hasSpec -%]
+- [Specification PDF]([[OSR_MACHINES_ASSETS_URL]]/[[product.product_rel_min]]/resources/spec.pdf)
+[%- endif -%]
+[% if product.howtoSection %]
+- [How-tos]([[product.howtoSection]])
+[%- endif -%]
+[% if product.library %]
+- [Library]([[product.library]])
+[% endif %]
+
+[%- if config.show.wiki -%]
+ [%- if product.wiki_articles -%]
+Wiki Articles
+[%- include "product_wiki.osr" category:product.wiki_articles -%]
+ [%- else -%]
+ [%- endif -%]
+[%- else -%]
+[%- endif -%]
+[%- if config.show.forum -%]
+ [%- if product.forumCategory -%]
+Forum Posts
+[%- include "product_forum.osr" category:product.forumCategory -%]
+ [%- endif -%]
+[%- endif -%]
+[%- include "extra_resources.md" -%]
\ No newline at end of file
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/showreel.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/showreel.osr
new file mode 100644
index 00000000..7bd0337a
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/showreel.osr
@@ -0,0 +1,7 @@
+[%js%]
+if(fs.images(`${PRODUCT_ROOT}/media/products`).length){
+ const t = html.thumbs(`${abs_url}/${product}/media/products`,`${PRODUCT_ROOT}/media/products`);
+ return `Products done with ${store.product.name}
+ ${t}`;
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/social_links.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/social_links.osr
new file mode 100644
index 00000000..50856ea2
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/social_links.osr
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+ [%- if config.vendor_youtube -%]
+
+
+
+
+
+ [% endif %]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/specs.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/specs.osr
new file mode 100644
index 00000000..562482cb
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/specs.osr
@@ -0,0 +1,18 @@
+[%js%]
+let p = PRODUCT_ROOT;
+const _path = path.resolve(PRODUCT_ROOT + './specs.xlsx');
+if(!fs.exists(_path)){
+ console.warn('cant find specs', _path)
+ return
+}
+let data = xlsx.parse(_path);
+data[0].data = data[0].data.filter((d)=>d.length >0);
+data = markdownTable(data[0].data);
+if(html){
+ return md2html(data);
+}else{
+
+ data;
+
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/templates/discourse/machines/widgets/table.osr b/packages/discourse-legacy/templates/discourse/machines/widgets/table.osr
new file mode 100644
index 00000000..47f97278
--- /dev/null
+++ b/packages/discourse-legacy/templates/discourse/machines/widgets/table.osr
@@ -0,0 +1,16 @@
+[%js%]
+const _path = path.resolve(`${PRODUCT_ROOT}/${table}`)
+if(!fs.exists(_path)){
+ console.warn('cant find table', _path)
+ return
+}
+console.log(' table path ' + _path)
+let data = xlsx.parse(_path)
+data[0].data = data[0].data.filter((d)=>d.length >0)
+data = markdownTable(data[0].data)
+if(html){
+ return md2html(data)
+}else{
+ data
+}
+[%endjs%]
diff --git a/packages/discourse-legacy/tsconfig.json b/packages/discourse-legacy/tsconfig.json
new file mode 100644
index 00000000..b3b9584d
--- /dev/null
+++ b/packages/discourse-legacy/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "extends": "../typescript-config/base.json",
+ "include": [
+ "src/**/*.ts"
+ ],
+ "files": [
+ "src/index.ts"
+ ],
+ "compilerOptions": {
+ "allowJs": true,
+ "declarationDir": "./dist",
+ "outDir": "./dist",
+ "sourceMap": true,
+ "preserveConstEnums": true
+ },
+}
\ No newline at end of file
diff --git a/packages/discourse/dist/_cli.d.ts b/packages/discourse/dist/_cli.d.ts
new file mode 100644
index 00000000..f411fcfd
--- /dev/null
+++ b/packages/discourse/dist/_cli.d.ts
@@ -0,0 +1,3 @@
+import { IOptions, IOptionsSync } from './types.js';
+export declare const defaults: () => void;
+export declare const sanitize: (argv: any) => IOptionsSync | IOptions | boolean;
diff --git a/packages/discourse/dist/_cli.js b/packages/discourse/dist/_cli.js
new file mode 100644
index 00000000..6d4bd8cf
--- /dev/null
+++ b/packages/discourse/dist/_cli.js
@@ -0,0 +1,65 @@
+import { sync as exists } from '@polymech/fs/exists';
+import { logger } from './index.js';
+import * as path from 'path';
+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);
+ });
+};
+export const sanitize = (argv) => {
+ let ret = {
+ ...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;
+};
+//# sourceMappingURL=_cli.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/_cli.js.map b/packages/discourse/dist/_cli.js.map
new file mode 100644
index 00000000..a0a47f80
--- /dev/null
+++ b/packages/discourse/dist/_cli.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"_cli.js","sourceRoot":"","sources":["../src/_cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,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;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAS,EAAqC,EAAE;IAErE,IAAI,GAAG,GAAQ;QACX,GAAG,IAAI;KACV,CAAA;IAED,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;IAClB,IAAI,OAAO,CAAA;IACX,IAAI,SAAS,GAAG,EAAE,CAAA;IAElB;;;;;;;;;;;;;;;;;;;;;;;;;MAyBE;IAEF,IAAI,IAAI,CAAC,GAAG,EAAE;QACV,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;YACpB,MAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;SACxD;KACJ;SAAM;QACH,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;KAC1B;IAED,GAAG,GAAG;QACF,GAAG,GAAG;QACN,SAAS;QACT,OAAO;KACV,CAAA;IAED,OAAO,GAAG,CAAA;AACd,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/import-oa-howtos.d.ts b/packages/discourse/dist/commands/import-oa-howtos.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-howtos.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/import-oa-howtos.js b/packages/discourse/dist/commands/import-oa-howtos.js
new file mode 100644
index 00000000..eea3c28d
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-howtos.js
@@ -0,0 +1,49 @@
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+import { read_howtos, filter_valid } from '../lib/oa/commons';
+import { importHowtos, updateHowtos } from '../lib/oa/howtos';
+import * as path from 'path';
+import { resolve } from '@polymech/commons';
+const KB_ROOT = '${KB_ROOT}';
+import { OA_LATEST } from '@polymech/commons';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: true,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('src', {
+ default: OA_LATEST,
+ type: 'string',
+ }).option('track', {
+ default: '${OA_ROOT}/oa-data/howtos/latest_track.json',
+ type: 'string',
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('import-howtos', 'Import oa-howtos', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = argv;
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ const discourse = Instance();
+ const _opts = {
+ src: path.resolve(resolve(options.src)),
+ track: path.resolve(resolve(options.track))
+ };
+ let howtos = read_howtos(_opts.src);
+ howtos = filter_valid(howtos);
+ await importHowtos(discourse, _opts, howtos);
+ await updateHowtos(discourse, _opts, howtos);
+ });
+};
+//# sourceMappingURL=import-oa-howtos.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/import-oa-howtos.js.map b/packages/discourse/dist/commands/import-oa-howtos.js.map
new file mode 100644
index 00000000..a447c3d3
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-howtos.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"import-oa-howtos.js","sourceRoot":"","sources":["../../src/commands/import-oa-howtos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAe,MAAM,UAAU,CAAA;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAe3C,OAAO,EAEH,WAAW,EAEX,YAAY,EACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACH,YAAY,EAAE,YAAY,EAC7B,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG3C,MAAM,OAAO,GAAG,YAAY,CAAA;AAQ5B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE7C,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,gBAAgB;QAC1B,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,6CAA6C;QACtD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,qCAAqC;KAClD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QAC3F,QAAQ,EAAE,CAAA;QACV,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,IAAI,OAAO,GAAI,IAAwB,CAAA;QAEvC,IAAI,CAAC,OAAO,EAAE;YACV,OAAM;SACT;QACD,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAElD,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;QAE5B,MAAM,KAAK,GAAG;YACV,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAClC,CAAA;QAEb,IAAI,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACnC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/import-oa-users.d.ts b/packages/discourse/dist/commands/import-oa-users.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-users.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/import-oa-users.js b/packages/discourse/dist/commands/import-oa-users.js
new file mode 100644
index 00000000..d9027609
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-users.js
@@ -0,0 +1,84 @@
+import { defaults, sanitize } from '../_cli';
+import { parse } from '../options';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+import { sync as write } from '@polymech/fs/write';
+import { read_users, filter_invalid, filter_email_missing, filter_email_only, importUsers, filter_valid, oa_user_email, getDataPath, updateUsers, indexUsers } from '../lib/oa/users';
+import * as path from 'path';
+import { resolve } from '@polymech/commons';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: false,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('src', {
+ default: '${OA_ROOT}/data/latest.json',
+ type: 'string',
+ }).option('track', {
+ default: '${OSR_ROOT}/osr-directory/pp/merged.json',
+ type: 'string',
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('import-users ', 'Import oa-users', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ let opts = parse(options, args);
+ const discourse = Instance();
+ const _opts = {
+ verb: argv.verb,
+ src: path.resolve(resolve(options.src)),
+ track: path.resolve(resolve(options.track))
+ };
+ let users = read_users(_opts.src);
+ users = filter_valid(users);
+ //////////////////////////
+ //
+ // store invalid
+ let usersInvalid = read_users(_opts.src);
+ usersInvalid = filter_email_only(usersInvalid);
+ usersInvalid = filter_invalid(usersInvalid);
+ logger.debug('write invalidUsers.json : ', getDataPath('/invalidUsers.json'));
+ write(getDataPath('/invalidUsers.json'), usersInvalid.map((u) => {
+ return {
+ ...u.detail,
+ id: u._id,
+ email: oa_user_email(u)
+ };
+ }));
+ let usersInvalidEmail = read_users(_opts.src);
+ usersInvalidEmail = filter_email_missing(usersInvalidEmail);
+ logger.debug('write invalidUsersEMail.json : ', getDataPath('/invalidUsersEMail.json'));
+ write(getDataPath('./invalidUsersEMail.json'), usersInvalidEmail.map((u) => {
+ return {
+ ...u.detail,
+ id: u._id
+ };
+ }));
+ logger.debug('invalid users email : ', usersInvalidEmail.length);
+ logger.debug('invalid users : ', usersInvalid.length);
+ if (opts.verb == 'index') {
+ await indexUsers(discourse, options, users);
+ }
+ if (opts.verb == 'import') {
+ await importUsers(discourse, options, users);
+ }
+ if (opts.verb == 'update') {
+ await updateUsers(discourse, options, users);
+ }
+ return;
+ });
+};
+//# sourceMappingURL=import-oa-users.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/import-oa-users.js.map b/packages/discourse/dist/commands/import-oa-users.js.map
new file mode 100644
index 00000000..6c8b4776
--- /dev/null
+++ b/packages/discourse/dist/commands/import-oa-users.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"import-oa-users.js","sourceRoot":"","sources":["../../src/commands/import-oa-users.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/info.d.ts b/packages/discourse/dist/commands/info.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse/dist/commands/info.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/info.js b/packages/discourse/dist/commands/info.js
new file mode 100644
index 00000000..c96d4d7c
--- /dev/null
+++ b/packages/discourse/dist/commands/info.js
@@ -0,0 +1,23 @@
+import { CONFIG_DEFAULT } from '@polymech/commons';
+import { logger } from '../index';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: 'false',
+ describe: 'debug messages'
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('info', 'info', options, async (argv) => {
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ const src = CONFIG_DEFAULT(args.env_key);
+ logger.debug(`Reading OSR Config with key "${argv.env_key}"`, src);
+ });
+};
+//# sourceMappingURL=info.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/info.js.map b/packages/discourse/dist/commands/info.js.map
new file mode 100644
index 00000000..02665063
--- /dev/null
+++ b/packages/discourse/dist/commands/info.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,gBAAgB;KAC7B,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,oCAAoC;KACjD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QACtE,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,MAAM,IAAI,GAAQ,IAAI,CAAA;QACtB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/query.d.ts b/packages/discourse/dist/commands/query.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse/dist/commands/query.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/query.js b/packages/discourse/dist/commands/query.js
new file mode 100644
index 00000000..6c22833c
--- /dev/null
+++ b/packages/discourse/dist/commands/query.js
@@ -0,0 +1,52 @@
+import { defaults, sanitize } from '../_cli';
+import { parse } from '../options';
+import { logger } from '../index';
+import { Instance } from '../lib/discourse';
+const defaultOptions = (yargs) => {
+ return yargs.option('debug', {
+ default: false,
+ describe: 'debug messages',
+ type: 'boolean'
+ }).option('short', {
+ default: 'true',
+ describe: 'Emit short info only',
+ type: 'boolean'
+ }).option('disabled', {
+ default: 'false',
+ describe: 'Enumerate disabled products',
+ type: 'boolean'
+ }).option('dry', {
+ default: 'false',
+ describe: 'Process files for debug purposes only.'
+ }).option('env_key', {
+ default: 'OSR-CONFIG',
+ describe: 'Environment key to the config path.'
+ });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('query ', 'Search namespace', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ const args = argv;
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ let opts = parse(options, args);
+ if (!opts.verb) {
+ logger.error('No verb specified');
+ return;
+ }
+ const discourse = Instance();
+ if (opts.verb == 'tags') {
+ const items = await discourse.search('Sheetpress - Cell', 'tags:sheetpress');
+ logger.info('items', items);
+ }
+ return;
+ });
+};
+//# sourceMappingURL=query.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/query.js.map b/packages/discourse/dist/commands/query.js.map
new file mode 100644
index 00000000..d6bf0328
--- /dev/null
+++ b/packages/discourse/dist/commands/query.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,gBAAgB;QAC1B,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;QACf,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;QAClB,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,6BAA6B;QACvC,IAAI,EAAE,SAAS;KAClB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QACb,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,wCAAwC;KACrD,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;QACjB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,qCAAqC;KAClD,CAAC,CAAA;AACN,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QAC1F,QAAQ,EAAE,CAAC;QACX,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,MAAM,IAAI,GAAQ,IAAI,CAAA;QAEtB,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAW,CAAa,CAAA;QAE/C,IAAI,CAAC,OAAO,EAAE;YACV,OAAM;SACT;QACD,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAClD,IAAI,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAE/B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACjC,OAAO;SACV;QACD,MAAM,SAAS,GAAG,QAAQ,EAAE,CAAA;QAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE;YACrB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,mBAAmB,EAAC,iBAAiB,CAAC,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC,OAAO,EAAC,KAAK,CAAC,CAAA;SAC7B;QACD,OAAM;IACV,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-component.d.ts b/packages/discourse/dist/commands/sync-component.d.ts
new file mode 100644
index 00000000..1d55e593
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-component.d.ts
@@ -0,0 +1,4 @@
+import * as CLI from 'yargs';
+import { IOptionsSyncComponent } from '../types';
+export declare const parse: (argv: any) => IOptionsSyncComponent | boolean;
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/sync-component.js b/packages/discourse/dist/commands/sync-component.js
new file mode 100644
index 00000000..8d43b1df
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-component.js
@@ -0,0 +1,119 @@
+import * as path from 'path';
+import { forward_slash, pathInfo } from "@polymech/commons";
+import { resolve, isFile } from '@polymech/commons';
+import { sync as exists } from '@polymech/fs/exists';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { syncComponent } from '../lib/sync/component';
+import { PFilterValid } from '@plastichub/osr-fs-utils';
+const globBase = require('glob-base');
+export const parse = (argv) => {
+ let ret = {
+ ...argv
+ };
+ let srcInfo;
+ let variables = {};
+ ret.src = argv.src;
+ ret.source = resolve(forward_slash(ret.source), ret.alt, variables);
+ ret.root = resolve(forward_slash(ret.root), ret.alt, variables);
+ ret.product_root = resolve(forward_slash(ret.product_root), ret.alt, variables);
+ if (ret.src) {
+ ret.src = resolve(ret.src, ret.alt, 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(/\/$/, '');
+ // case : single file
+ if (exists(file) && isFile(file)) {
+ ret.src = file;
+ }
+ const src = resolve(forward_slash(ret.src), ret.alt, variables);
+ srcInfo = pathInfo(src);
+ // case : glob pattern
+ 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;
+};
+const defaultOptions = (yargs) => {
+ return yargs
+ //standard options
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ //discourse
+ .option('yaml', { type: 'boolean', default: false, describe: 'Parse options from YAML header' })
+ .option('skip', { type: 'boolean', default: true, describe: 'Skip existing' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ //osrl
+ .option('src', {
+ default: '${OSR_ROOT}/osr-machines/injection/**/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('src2', {
+ default: '${OSR_ROOT}/osr-machines/sheetpress/cassandra-light/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('env', { type: 'string', default: 'forum' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/base.json" })
+ .option('format', { type: 'string', default: 'md' })
+ .option('source', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/root.html" })
+ .option('language', { type: 'string', default: 'osr' })
+ .option('plugins', { type: 'string', default: '${root}/osr/plugins' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('product_root', { type: 'string', default: '${PRODUCT_ROOT}/products' })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('module', { type: 'string', default: 'osr-lib-components' })
+ .option('filter', { type: 'string', default: PFilterValid.library_component })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync-component', 'Sync OSR Component', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = parse(argv);
+ if (!options) {
+ return;
+ }
+ logger.setSettings({ minLevel: argv.logLevel });
+ // options.debug && logger.debug(`CLI Args In`, argv)
+ logger.debug('Options', options);
+ let ret = syncComponent(options);
+ return ret;
+ });
+};
+//# sourceMappingURL=sync-component.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-component.js.map b/packages/discourse/dist/commands/sync-component.js.map
new file mode 100644
index 00000000..2c9db04f
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-component.js","sourceRoot":"","sources":["../../src/commands/sync-component.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-directory.d.ts b/packages/discourse/dist/commands/sync-directory.d.ts
new file mode 100644
index 00000000..1d55e593
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-directory.d.ts
@@ -0,0 +1,4 @@
+import * as CLI from 'yargs';
+import { IOptionsSyncComponent } from '../types';
+export declare const parse: (argv: any) => IOptionsSyncComponent | boolean;
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/sync-directory.js b/packages/discourse/dist/commands/sync-directory.js
new file mode 100644
index 00000000..e9344e1e
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-directory.js
@@ -0,0 +1,118 @@
+import * as path from 'path';
+import { forward_slash, pathInfo } from "@polymech/commons";
+import { resolve, isFile } from '@polymech/commons';
+import { sync as exists } from '@polymech/fs/exists';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+import { defaults } from '../_cli';
+import { logger } from '../index';
+import { syncComponent } from '../lib/sync/component';
+import { PFilterValid } from '@plastichub/osr-fs-utils';
+const globBase = require('glob-base');
+export const parse = (argv) => {
+ let ret = {
+ ...argv
+ };
+ ret.src = argv.src;
+ let srcInfo;
+ let variables = {};
+ ret.source = resolve(forward_slash(ret.source), ret.alt, variables);
+ ret.root = resolve(forward_slash(ret.root), ret.alt, variables);
+ if (ret.src) {
+ ret.src = resolve(ret.src, ret.alt, 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(/\/$/, '');
+ // case : single file
+ if (exists(file) && isFile(file)) {
+ ret.src = file;
+ }
+ const src = resolve(forward_slash(ret.src), ret.alt, variables);
+ srcInfo = pathInfo(src);
+ // case : glob pattern
+ 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;
+};
+const defaultOptions = (yargs) => {
+ return yargs
+ //standard options
+ .option('debug', { type: 'boolean', default: true, describe: 'debug messages' })
+ .option('verbose', { type: 'boolean', default: true, describe: 'even more debug messages' })
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ //discourse
+ .option('yaml', { type: 'boolean', default: false, describe: 'Parse options from YAML header' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ //osrl
+ .option('src2', {
+ default: '${OSR_ROOT}/osr-machines/injection/**/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('src', {
+ default: '${OSR_ROOT}/osr-machines/sheetpress/cassandra-light/config.json',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('env', { type: 'string', default: 'forum' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/base.json" })
+ .option('format', { type: 'string', default: 'md' })
+ .option('source', { type: 'string', default: "${OSR_ROOT}/osr-templates/discourse/root.html" })
+ .option('language', { type: 'string', default: 'osr' })
+ .option('plugins', { type: 'string', default: '${root}/osr/plugins' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('product_root', { type: 'string', default: '${PRODUCT_ROOT}/products' })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('module', { type: 'string', default: 'osr-lib-components' })
+ .option('filter', { type: 'string', default: PFilterValid.library_component })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync-component', 'Sync OSR Component', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = parse(argv);
+ if (!options) {
+ return;
+ }
+ // options.debug && logger.debug(`CLI Args In`, argv)
+ // logger.debug('Options', options)
+ let ret = syncComponent(options);
+ return ret;
+ });
+};
+//# sourceMappingURL=sync-directory.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-directory.js.map b/packages/discourse/dist/commands/sync-directory.js.map
new file mode 100644
index 00000000..0b250b25
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-directory.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-directory.js","sourceRoot":"","sources":["../../src/commands/sync-directory.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-file.d.ts b/packages/discourse/dist/commands/sync-file.d.ts
new file mode 100644
index 00000000..443f33e5
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-file.d.ts
@@ -0,0 +1,2 @@
+import * as CLI from 'yargs';
+export declare const register: (cli: CLI.Argv) => CLI.Argv<{}>;
diff --git a/packages/discourse/dist/commands/sync-file.js b/packages/discourse/dist/commands/sync-file.js
new file mode 100644
index 00000000..91192ba1
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-file.js
@@ -0,0 +1,51 @@
+import { defaults, sanitize } from '../_cli';
+import { logger } from '../index';
+import { syncYAML } from '../lib/sync/file';
+import { CAT_TEST, DEFAULT_IMPORT_OWNER } from '../lib/discourse/constants';
+const defaultOptions = (yargs) => {
+ return yargs
+ .option('debug', { type: 'boolean', default: true, describe: 'debug messages' })
+ .option('verbose', { type: 'boolean', default: true, describe: 'even more debug messages' })
+ .option('yaml', { type: 'boolean', default: true, describe: 'Parse options from YAML header' })
+ .option('alt', { type: 'boolean', default: false, describe: 'alt token (%)' })
+ .option('uploadLocal', { type: 'boolean', default: true, describe: 'Upload local images to Discourse' })
+ .option('uploadRemote', { type: 'boolean', default: true, describe: 'Upload remote images to Discourse' })
+ .option('src', {
+ default: './tests/**/*.md',
+ type: 'string',
+ describe: 'Source : Path|Glob. Supported: HTML|MD|OSR(Options via YAML header)'
+ })
+ .option('title', { type: 'string', default: 'Title of the Discourse post' })
+ .option('config', { type: 'string', default: 'osr_admin' })
+ .option('cat', { default: CAT_TEST, type: 'number' })
+ .option('timestamp', { type: 'number', default: Date.now() })
+ .option('owner', { type: 'number', default: DEFAULT_IMPORT_OWNER })
+ .option('config', { type: 'string', default: 'discourse_admin' })
+ .option('env', { type: 'string', default: 'test-import' })
+ .option('profile', { type: 'string', default: "${OSR_ROOT}/osr-profiles/osr/base.json" })
+ .option('format', { type: 'string', default: 'html' })
+ .option('root', { type: 'string', default: process.cwd() })
+ .option('cwd', { type: 'string', default: process.cwd() })
+ .option('cache', { type: 'boolean', default: true })
+ .option('env_key', { type: 'string', default: 'OSR-CONFIG', describe: 'Environment key to the config path.' });
+};
+let options = (yargs) => defaultOptions(yargs);
+export const register = (cli) => {
+ return cli.command('sync ', 'Sync file', options, async (argv) => {
+ defaults();
+ if (argv.help) {
+ return;
+ }
+ let options = sanitize(argv);
+ if (!options) {
+ return;
+ }
+ options.debug && logger.debug(`CLI Args In`, argv);
+ if (!options.verb) {
+ logger.error('No verb specified');
+ return;
+ }
+ return syncYAML(options);
+ });
+};
+//# sourceMappingURL=sync-file.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/commands/sync-file.js.map b/packages/discourse/dist/commands/sync-file.js.map
new file mode 100644
index 00000000..2058ce64
--- /dev/null
+++ b/packages/discourse/dist/commands/sync-file.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"sync-file.js","sourceRoot":"","sources":["../../src/commands/sync-file.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AASjC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAE3E,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,EAAE;IACvC,OAAO,KAAK;SACP,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;SAC/E,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,0BAA0B,EAAE,CAAC;SAC3F,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gCAAgC,EAAE,CAAC;SAC9F,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;SAC7E,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,kCAAkC,EAAE,CAAC;SACvG,MAAM,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,mCAAmC,EAAE,CAAC;SACzG,MAAM,CAAC,KAAK,EAAE;QACX,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,qEAAqE;KAClF,CAAC;SACD,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC;SAC3E,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;SACpD,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;SAC5D,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;SAClE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;SACzD,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC;SACxF,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SACrD,MAAM,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SACzD,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACnD,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,qCAAqC,EAAE,CAAC,CAAA;AACtH,CAAC,CAAA;AAED,IAAI,OAAO,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAa,EAAE,EAAE;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAmB,EAAE,EAAE;QAClF,QAAQ,EAAE,CAAA;QACV,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,OAAM;SAAE;QACzB,IAAI,OAAO,GAAG,QAAQ,CAAC,IAAW,CAAiB,CAAA;QAEnD,IAAI,CAAC,OAAO,EAAE;YACV,OAAM;SACT;QACD,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QAElD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACjC,OAAO;SACV;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/constants.d.ts b/packages/discourse/dist/constants.d.ts
new file mode 100644
index 00000000..ca2c1318
--- /dev/null
+++ b/packages/discourse/dist/constants.d.ts
@@ -0,0 +1 @@
+export declare const MODULE_NAME = "OSR-DISCOURSE";
diff --git a/packages/discourse/dist/constants.js b/packages/discourse/dist/constants.js
new file mode 100644
index 00000000..df4d533d
--- /dev/null
+++ b/packages/discourse/dist/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/constants.js.map b/packages/discourse/dist/constants.js.map
new file mode 100644
index 00000000..40113118
--- /dev/null
+++ b/packages/discourse/dist/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/index.d.ts b/packages/discourse/dist/index.d.ts
new file mode 100644
index 00000000..292de7fd
--- /dev/null
+++ b/packages/discourse/dist/index.d.ts
@@ -0,0 +1,8 @@
+export * from './constants.js';
+export * from './types.js';
+export * from './lib/index.js';
+export * from './lib/oa/types.js';
+export { Logger } from 'tslog';
+export declare const logger: any;
+import { IObjectLiteral } from "@polymech/core";
+export declare const substitute: (alt: boolean, template: string, vars?: IObjectLiteral) => any;
diff --git a/packages/discourse/dist/index.js b/packages/discourse/dist/index.js
new file mode 100644
index 00000000..47e54d06
--- /dev/null
+++ b/packages/discourse/dist/index.js
@@ -0,0 +1,12 @@
+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';
+export { Logger } from 'tslog';
+let loggers = {};
+export const logger = _logger(MODULE_NAME);
+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/index.js.map b/packages/discourse/dist/index.js.map
new file mode 100644
index 00000000..52cc3ca1
--- /dev/null
+++ b/packages/discourse/dist/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,cAAc,mBAAmB,CAAA;AAEjC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9B,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAE1C,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAInG,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/lib/discourse/cache.d.ts b/packages/discourse/dist/lib/discourse/cache.d.ts
new file mode 100644
index 00000000..a024178b
--- /dev/null
+++ b/packages/discourse/dist/lib/discourse/cache.d.ts
@@ -0,0 +1,10 @@
+///
+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/lib/discourse/cache.js b/packages/discourse/dist/lib/discourse/cache.js
new file mode 100644
index 00000000..83e8b5ff
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/cache.js.map b/packages/discourse/dist/lib/discourse/cache.js.map
new file mode 100644
index 00000000..8c1bbc46
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/constants.d.ts b/packages/discourse/dist/lib/discourse/constants.d.ts
new file mode 100644
index 00000000..49a2ce1c
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/constants.js b/packages/discourse/dist/lib/discourse/constants.js
new file mode 100644
index 00000000..51dac7ba
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/constants.js.map b/packages/discourse/dist/lib/discourse/constants.js.map
new file mode 100644
index 00000000..1cbb6395
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/index.d.ts b/packages/discourse/dist/lib/discourse/index.d.ts
new file mode 100644
index 00000000..10ecb173
--- /dev/null
+++ b/packages/discourse/dist/lib/discourse/index.d.ts
@@ -0,0 +1,181 @@
+import { IDiscourseConfig } from '@polymech/commons/types';
+export declare const logger: any;
+import PromisePool from 'native-promise-pool';
+export declare const escape: (path: string) => string;
+import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types';
+import { Category, CategoriesResponse, PostsResponse, PostResponse, TopicResponse, TopicItem, CategoryResponse, PostItem, PostUpdateItem, IDiscourserConfig, Thread, PostModifier, FetchConfig, FetchOptions, ISearchResult, ICreateUserResponse, IUserDetail, TagsResponse, Tag, TopicUpdateBasicTopic } from './types';
+import { IDiscourseUser } from '@polymech/commons';
+import { IDImage } from '../oa/index';
+/**
+ * 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/lib/discourse/index.js b/packages/discourse/dist/lib/discourse/index.js
new file mode 100644
index 00000000..eb2d0d38
--- /dev/null
+++ b/packages/discourse/dist/lib/discourse/index.js
@@ -0,0 +1,831 @@
+import { MODULE_NAME } from '../../constants.js';
+import { CONFIG_DEFAULT } from '@polymech/commons';
+import { logger as _logger } from '../index.js';
+export const logger = _logger(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/lib/discourse/index.js.map b/packages/discourse/dist/lib/discourse/index.js.map
new file mode 100644
index 00000000..86aefe38
--- /dev/null
+++ b/packages/discourse/dist/lib/discourse/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/discourse/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/discourse/types.d.ts b/packages/discourse/dist/lib/discourse/types.d.ts
new file mode 100644
index 00000000..717972e6
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/types.js b/packages/discourse/dist/lib/discourse/types.js
new file mode 100644
index 00000000..041980b6
--- /dev/null
+++ b/packages/discourse/dist/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/lib/discourse/types.js.map b/packages/discourse/dist/lib/discourse/types.js.map
new file mode 100644
index 00000000..2aefd62f
--- /dev/null
+++ b/packages/discourse/dist/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/lib/git/index.d.ts b/packages/discourse/dist/lib/git/index.d.ts
new file mode 100644
index 00000000..3dd29ec2
--- /dev/null
+++ b/packages/discourse/dist/lib/git/index.d.ts
@@ -0,0 +1,5 @@
+export declare function git_status(cwd: any, dir: any): Promise;
+export declare function git_log(cwd: any, dir: any): Promise<{
+ files: any;
+ last: any;
+}>;
diff --git a/packages/discourse/dist/lib/git/index.js b/packages/discourse/dist/lib/git/index.js
new file mode 100644
index 00000000..8a8b36cd
--- /dev/null
+++ b/packages/discourse/dist/lib/git/index.js
@@ -0,0 +1,34 @@
+import { logger } from '../../index';
+const GIT_CHANGELOG_MESSAGE_PREFIX = '';
+import * as simpleGit from 'simple-git/promise';
+import * as moment from 'moment';
+export async function git_status(cwd, dir) {
+ const git = simpleGit(cwd);
+ let statusSummary = null;
+ try {
+ statusSummary = await git.log(['--stat', dir]);
+ }
+ catch (e) {
+ logger.error('Error Git', e);
+ }
+ return statusSummary;
+}
+export async function git_log(cwd, dir) {
+ const stats = await git_status(cwd, dir);
+ logger.info(`Reading Git log at ${cwd}/${dir}`);
+ let changelogs = stats.all.filter((e) => e.message.trim().toLowerCase().startsWith(GIT_CHANGELOG_MESSAGE_PREFIX.toLowerCase()));
+ if (!changelogs.length) {
+ return { files: [], last: stats.latest };
+ }
+ let pretty = changelogs.map((e) => {
+ return {
+ files: e.diff.files.map((f) => { return { path: f.file }; }),
+ msg: e.message.toLowerCase().replace(GIT_CHANGELOG_MESSAGE_PREFIX.toLowerCase(), '').trim(),
+ hash: e.hash,
+ date: moment(e.date).format('LLLL')
+ };
+ });
+ return { files: pretty, last: stats.latest };
+}
+;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/git/index.js.map b/packages/discourse/dist/lib/git/index.js.map
new file mode 100644
index 00000000..3ed2841d
--- /dev/null
+++ b/packages/discourse/dist/lib/git/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/git/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAA;AAElC,MAAM,4BAA4B,GAAG,EAAE,CAAA;AAIvC,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAEhD,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAG,EAAE,GAAG;IAErC,MAAM,GAAG,GAAc,SAAS,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,aAAa,GAAO,IAAI,CAAC;IAC7B,IAAI;QACA,aAAa,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;KAClD;IACD,OAAO,CAAC,EAAE;QACN,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;KAChC;IACD,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAG,EAAE,GAAG;IAClC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;IAChD,IAAI,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,4BAA4B,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAChI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACpB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAC,KAAK,CAAC,MAAM,EAAE,CAAA;KAC1C;IACD,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,OAAO;YACH,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,CAAC,CAAC;YAC3D,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC3F,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;SACtC,CAAA;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACjD,CAAC;AAAA,CAAC"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/index.d.ts b/packages/discourse/dist/lib/index.d.ts
new file mode 100644
index 00000000..88a7f208
--- /dev/null
+++ b/packages/discourse/dist/lib/index.d.ts
@@ -0,0 +1,2 @@
+export * from './discourse/index.js';
+export * from './discourse/types.js';
diff --git a/packages/discourse/dist/lib/index.js b/packages/discourse/dist/lib/index.js
new file mode 100644
index 00000000..08c21793
--- /dev/null
+++ b/packages/discourse/dist/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/lib/index.js.map b/packages/discourse/dist/lib/index.js.map
new file mode 100644
index 00000000..341c508d
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/Pattern.d.ts b/packages/discourse/dist/lib/markdown/Pattern.d.ts
new file mode 100644
index 00000000..dd02b1a1
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/Pattern.d.ts
@@ -0,0 +1,7 @@
+import { RegExCallback } from './types';
+export declare class Pattern {
+ regex: RegExp;
+ replacement: RegExCallback;
+ constructor(regex: RegExp, replacement: any);
+ apply(raw: string): string;
+}
diff --git a/packages/discourse/dist/lib/markdown/Pattern.js b/packages/discourse/dist/lib/markdown/Pattern.js
new file mode 100644
index 00000000..9d9303a2
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/Pattern.js.map b/packages/discourse/dist/lib/markdown/Pattern.js.map
new file mode 100644
index 00000000..d9892c3a
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/Rule.d.ts b/packages/discourse/dist/lib/markdown/Rule.d.ts
new file mode 100644
index 00000000..f19edcd8
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/Rule.d.ts
@@ -0,0 +1,7 @@
+import { Pattern } from './Pattern';
+export declare class Rule {
+ name: string;
+ patterns: Pattern[];
+ constructor(name: string, patterns: Pattern[]);
+ apply(raw: string): string;
+}
diff --git a/packages/discourse/dist/lib/markdown/Rule.js b/packages/discourse/dist/lib/markdown/Rule.js
new file mode 100644
index 00000000..5526e648
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/Rule.js.map b/packages/discourse/dist/lib/markdown/Rule.js.map
new file mode 100644
index 00000000..9fc1b1b8
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/index.d.ts b/packages/discourse/dist/lib/markdown/index.d.ts
new file mode 100644
index 00000000..59be8be6
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/index.d.ts
@@ -0,0 +1,14 @@
+import { Rule } from './Rule';
+import { RMarkOptions } from './types';
+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';
+export { Pattern } from './Pattern';
+export declare const toHTML: (content: any) => any;
diff --git a/packages/discourse/dist/lib/markdown/index.js b/packages/discourse/dist/lib/markdown/index.js
new file mode 100644
index 00000000..685fc5f6
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/index.js
@@ -0,0 +1,98 @@
+import { Rule } from './Rule';
+import { Pattern } from './Pattern';
+export const RE_IMAGES = /\!\[([^\]]+)\]\((\S+)\)/g;
+export const RE_LINKS = /\[([^\n]+)\]\(([^\n]+)\)/g;
+import * as 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, ' '),
+ ]),
+ 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';
+export { Pattern } from './Pattern';
+// 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/lib/markdown/index.js.map b/packages/discourse/dist/lib/markdown/index.js.map
new file mode 100644
index 00000000..2e698a4e
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/index.test.d.ts b/packages/discourse/dist/lib/markdown/index.test.d.ts
new file mode 100644
index 00000000..509db186
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/index.test.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/discourse/dist/lib/markdown/index.test.js b/packages/discourse/dist/lib/markdown/index.test.js
new file mode 100644
index 00000000..11e6c7da
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/index.test.js
@@ -0,0 +1,112 @@
+import { Pattern, RMark, Rule } from './index';
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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
+
+
+
Header 2
+
+
+
Header 3
+
+
+
Header 4
+
+
+
Header 5
+
+
+
Header 6
+
+
+
+Bold
+
+
+Italic
+
+
+
+Link
+
+
+
+
+
+
+This is Bold and this is Italic .
+
+
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+
+
+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
+
+`;
+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('\nLorem 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('\nBold
\n');
+ expect(new RMark().render('__Bold__')).toBe('\nBold
\n');
+ expect(new RMark().render('This is **Bold**')).toBe('\nThis is Bold
\n');
+ });
+ test('should render italic', () => {
+ expect(new RMark().render('*Italic*')).toBe('\nItalic
\n');
+ expect(new RMark().render('_Italic_')).toBe('\nItalic
\n');
+ });
+ test('should render image', () => {
+ expect(new RMark().render('')).toBe('\n
\n');
+ });
+ test('should render link', () => {
+ expect(new RMark().render('[Link](https://github.com)')).toBe('\nLink
\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/lib/markdown/index.test.js.map b/packages/discourse/dist/lib/markdown/index.test.js.map
new file mode 100644
index 00000000..2a1d789d
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/page.d.ts b/packages/discourse/dist/lib/markdown/page.d.ts
new file mode 100644
index 00000000..509db186
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/page.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/packages/discourse/dist/lib/markdown/page.js b/packages/discourse/dist/lib/markdown/page.js
new file mode 100644
index 00000000..1ec0eeb9
--- /dev/null
+++ b/packages/discourse/dist/lib/markdown/page.js
@@ -0,0 +1,26 @@
+import { RMark } from '.';
+const sampleText = `# Header 1
+## Header 2
+### Header 3
+#### Header 4
+##### Header 5
+###### Header 6
+
+**Bold**
+*Italic*
+
+[Link](https://github.com/tlylt/rmark)
+
+
+This is **Bold** and this is *Italic*.
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ornare erat facilisis odio viverra gravida. Phasellus in finibus libero. Duis eget pellentesque arcu, ut lobortis mi. Praesent vitae nulla sed leo dignissim finibus eget hendrerit arcu. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum enim nibh, eu pellentesque tellus fermentum venenatis. Nam consectetur sem a magna mattis, sed luctus purus tincidunt. Nam faucibus tellus sed ligula molestie pulvinar. Mauris facilisis felis ex, eu tempor justo commodo et. Aenean lobortis dignissim diam eget tempor.
+
+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);
+}
+//# sourceMappingURL=page.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/markdown/page.js.map b/packages/discourse/dist/lib/markdown/page.js.map
new file mode 100644
index 00000000..2bd15c8f
--- /dev/null
+++ b/packages/discourse/dist/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,GAAG,CAAC;AAE1B,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/lib/markdown/types.d.ts b/packages/discourse/dist/lib/markdown/types.d.ts
new file mode 100644
index 00000000..912a5295
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/types.js b/packages/discourse/dist/lib/markdown/types.js
new file mode 100644
index 00000000..4513f1e0
--- /dev/null
+++ b/packages/discourse/dist/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/lib/markdown/types.js.map b/packages/discourse/dist/lib/markdown/types.js.map
new file mode 100644
index 00000000..ececb0df
--- /dev/null
+++ b/packages/discourse/dist/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/lib/oa/commons.d.ts b/packages/discourse/dist/lib/oa/commons.d.ts
new file mode 100644
index 00000000..bc98fa98
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/commons.d.ts
@@ -0,0 +1,27 @@
+import { IUploadedFileMeta } from '@polymech/commons';
+import { IOACategory, IOATags, IOAHowtoImport } from '../../';
+export declare const DEFAULT_HT_CATEGORY: {
+ _modified: string;
+ label: string;
+ _id: string;
+ _created: string;
+ _deleted: boolean;
+};
+export declare const LATEST_TRACK = "${OSR_ROOT}/oa-data/howtos/latest_track.json";
+export declare const LATEST_TEST = "./latest_test.json";
+export declare const DEFAULT_USER = "katharinaelleke";
+export declare const getDataPath: (_path?: string) => string;
+export declare const getHowtosPath: () => string;
+export declare const getHowtos: () => IOAHowtoImport[];
+export declare const read_howtos: (src: string) => IOAHowtoImport[];
+export declare const read_categories: (src: string) => IOACategory[];
+export declare const read_tags: (src: string) => IOATags[];
+export declare const filter_valid: (users: IOAHowtoImport[]) => IOAHowtoImport[];
+export declare const kb_howto_folder: (howto: any) => string;
+export declare const kb_howto_file: (howto: any, filename: any) => string;
+export declare const getHowtoUser: (howto: IOAHowto) => any;
+export declare const toMDImage: (image: IUploadedFileMeta) => string;
+export declare const md_edit_wrap: (content: any, f: any, prefix?: string, context?: string) => any;
+export declare const removeEmojis: (string: any) => any;
+export declare const toHTML: (path: any, markdown: any) => any;
+export declare const createTextLinks_: (text: any) => any;
diff --git a/packages/discourse/dist/lib/oa/commons.js b/packages/discourse/dist/lib/oa/commons.js
new file mode 100644
index 00000000..89b26cd2
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/commons.js
@@ -0,0 +1,88 @@
+import { sanitize } from './lib';
+import * as path from 'path';
+import { sync as read } from '@polymech/fs/read';
+import { resolve } from '@polymech/commons';
+import { getUsers } from './users';
+import { html_beautify } from 'js-beautify';
+import { Converter } from 'showdown';
+var escapeHtml = require('escape-html');
+const pretty = require('pretty');
+const TEST = false;
+export const DEFAULT_HT_CATEGORY = {
+ "_modified": "2022-09-18T08:51:47.196Z",
+ "label": "Guides",
+ "_id": "CrZjHORWfxEl6iDrrPIO",
+ "_created": "2022-09-18T08:51:47.196Z",
+ "_deleted": false
+};
+export const LATEST_TRACK = '${OSR_ROOT}/oa-data/howtos/latest_track.json';
+export const LATEST_TEST = './latest_test.json';
+export const DEFAULT_USER = 'katharinaelleke';
+export const getDataPath = (_path = '') => path.resolve(path.join(resolve('${OSR_ROOT}/oa-data/howtos/'), _path));
+export const getHowtosPath = () => path.resolve(resolve(TEST ? LATEST_TEST : LATEST_TRACK));
+export const getHowtos = () => read(path.resolve(getHowtosPath()), 'json') || [];
+export const read_howtos = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_howtos;
+};
+export const read_categories = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_categories;
+};
+export const read_tags = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_tags;
+};
+export const filter_valid = (users) => {
+ return users.filter((user) => {
+ if (user.title === 'Build a Fishing Canoe') {
+ //debugger
+ }
+ if (user.moderation.toLowerCase() !== 'accepted') {
+ return false;
+ }
+ return true;
+ });
+};
+export const kb_howto_folder = (howto) => path.resolve(path.join(resolve("${KB_ROOT}/src/howtos/"), howto.slug));
+export const kb_howto_file = (howto, filename) => path.resolve(path.join(resolve("${KB_ROOT}/src/howtos/"), howto.slug, sanitize(filename)));
+export const getHowtoUser = (howto) => {
+ const users = getUsers();
+ let user = users.find((u) => u._id == howto._createdBy);
+ if (user && user.f_id) {
+ return user;
+ }
+ else {
+ user = users.find((u) => u._id == DEFAULT_USER);
+ if (user && user.f_id) {
+ console.error('using default user : ' + DEFAULT_USER + ' : for' + howto.slug);
+ return user;
+ }
+ }
+};
+export const toMDImage = (image) => ``;
+export const md_edit_wrap = (content, f, prefix = '', context = '') => html_beautify(`${content}
`);
+export const removeEmojis = (string) => {
+ return string.replace(/([#0-9]\u20E3)|[\xA9\xAE\u203C\u2047-\u2049\u2122\u2139\u3030\u303D\u3297\u3299][\uFE00-\uFEFF]?|[\u2190-\u21FF][\uFE00-\uFEFF]?|[\u2300-\u23FF][\uFE00-\uFEFF]?|[\u2460-\u24FF][\uFE00-\uFEFF]?|[\u25A0-\u25FF][\uFE00-\uFEFF]?|[\u2600-\u27BF][\uFE00-\uFEFF]?|[\u2900-\u297F][\uFE00-\uFEFF]?|[\u2B00-\u2BF0][\uFE00-\uFEFF]?|(?:\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDEFF])[\uFE00-\uFEFF]?/g, '');
+};
+export const toHTML = (path, markdown) => {
+ const content = read(path, 'string');
+ if (!markdown) {
+ let converter = new Converter({ tables: true });
+ converter.setOption('literalMidWordUnderscores', 'true');
+ return converter.makeHtml(content);
+ }
+ else {
+ return content;
+ }
+};
+export const createTextLinks_ = (text) => {
+ return (text || "").replace(/([^\S]|^)(((https?\:\/\/)|(www\.))(\S+))/gi, function (match, space, url) {
+ var hyperlink = url;
+ if (!hyperlink.match('^https?:\/\/')) {
+ hyperlink = 'http://' + hyperlink;
+ }
+ return space + '' + url + ' ';
+ });
+};
+//# sourceMappingURL=commons.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/commons.js.map b/packages/discourse/dist/lib/oa/commons.js.map
new file mode 100644
index 00000000..1251d34f
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/commons.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/lib/oa/commons.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/howtos.d.ts b/packages/discourse/dist/lib/oa/howtos.d.ts
new file mode 100644
index 00000000..4fa1ec3a
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/howtos.d.ts
@@ -0,0 +1,9 @@
+import { IOAHowtoImport } from '../../';
+export declare const mergeLatest: (discorse: any, options: IOptions, oa_howtos: IOAHowtoImport[]) => IOAHowtoImport[];
+export declare const read_fragments: (src: any, config: any, prefix?: string, context?: string) => any;
+export declare function howto_content(howto: IOAHowtoImport, folder: string, fragments: any, templates: any): Promise;
+export declare const createHowtoTopic: (discourse: any, howto: IOAHowtoImport, create?: boolean) => Promise;
+export declare const importHowto: (discorse: any, howto: IOAHowtoImport) => Promise;
+export declare const importHowtos: (discorse: any, options: IOptions, howtos: IOAHowtoImport[]) => Promise;
+export declare const updateHowto: (discourse: Discourser, howto: IOAHowtoImport, options: IOptions) => Promise;
+export declare const updateHowtos: (discorse: any, options: IOptions, howtos: IOAHowtoImport[]) => Promise;
diff --git a/packages/discourse/dist/lib/oa/howtos.js b/packages/discourse/dist/lib/oa/howtos.js
new file mode 100644
index 00000000..e5d882ae
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/howtos.js
@@ -0,0 +1,464 @@
+import { Promise as BPromise } from 'bluebird';
+import { forward_slash } from '@polymech/commons';
+import { resolveConfig } from '@polymech/core';
+import { substitute } from '@polymech/core/strings';
+import { logger } from '../../index';
+import { HT_CATS } from '../discourse/constants';
+import { sanitize } from './lib';
+import * as path from 'path';
+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 * as cheerio from 'cheerio';
+import { get_user_name } from './users';
+var escapeHtml = require('escape-html');
+import { sync as mkdir } from '@polymech/fs/dir';
+import { files } from '@polymech/commons';
+const FUCKING_TOKEN = 'j7oYrkQe5nbnikCNHcfoP2DGtXKV4iHHzDFip8gGatS145g3B65UU6mI09KeFday9mY5HNQnU2jXUTe7LLkP-w';
+import { kb_howto_file, kb_howto_folder, getHowtos, getHowtosPath, getHowtoUser, md_edit_wrap, toHTML, toMDImage, createTextLinks_, removeEmojis, DEFAULT_HT_CATEGORY, read_tags } from './commons';
+export const mergeLatest = (discorse, options, oa_howtos) => {
+ const howtos = getHowtos();
+ oa_howtos.forEach((h) => {
+ const howto = howtos.find((tu) => {
+ return tu._id === h._id;
+ });
+ if (!howto) {
+ howtos.push(h);
+ }
+ });
+ write(getHowtosPath(), howtos);
+ return howtos;
+};
+const updateHowtoFile = (howto) => {
+ const howtos = getHowtos();
+ const index = howtos.findIndex((u) => u._id == howto._id);
+ howtos[index] = howto;
+ write(getHowtosPath(), howtos);
+};
+const uploadImage = async (discourse, user, image, localPath) => {
+ if (image.data) {
+ return image;
+ }
+ logger.debug('uploading image:', image.name);
+ const upped = await discourse.uploadFile(user.f_id, localPath);
+ const data = upped.data;
+ if (data && data.id) {
+ image.data = data;
+ }
+ else {
+ logger.error('error uploading image');
+ }
+ return image;
+};
+export const read_fragments = (src, config, prefix = '', context = '') => {
+ if (!exists(src)) {
+ mkdir(src);
+ }
+ let fragments = files(src, '*.html');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, true), f, prefix, context);
+ });
+ fragments = files(src, '*.md');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, false), f, prefix, context);
+ });
+ return config;
+};
+export async function howto_content(howto, folder, fragments, templates) {
+ //const tags = data.v3_tags;
+ const howtoTags = [];
+ /*
+ for (const ht in howto.tags) {
+ const gt = tags.find((t) => t._id === ht);
+ if (gt) {
+ howtoTags.push(gt.label);
+ // logger.debug('resolved ' + ht + ' to ' + gt.label);
+ } else {
+ // logger.error('Cant resolve tag : ' + ht);
+ }
+ }
+*/
+ howto.slug = howto.slug.trim();
+ let s = '';
+ let step_template = "" + templates.step;
+ let invalid_step_images = false;
+ const step_image = (i) => {
+ if (!i.data || !i.data.short_url) {
+ logger.error('invalid image : ' + i.downloadUrl + ' : ' + howto.slug);
+ invalid_step_images = true;
+ return '\n';
+ }
+ return `\n${toMDImage(i)}`;
+ };
+ const step_file = (i) => {
+ const image = `/howtos/${howto.slug}/${encodeURIComponent(sanitize(i.name))}`;
+ return ``;
+ };
+ const step_files = (s) => {
+ const files = s.files.map(step_file).join('\n');
+ return `
+ ${files}
+
+ `;
+ };
+ const step_images = (s) => {
+ const images = s.images.map(step_image).join('\n');
+ return `${images}`;
+ };
+ const step_images_gallery = (s) => {
+ const images = s.images.map(step_image).join('');
+ return `\n${images}
`;
+ };
+ const step = (s, i) => {
+ const t = substitute(step_template, {
+ title: s.title,
+ text: createTextLinks_(escapeHtml(s.text.trim()).replace(/(?:\r\n|\r|\n)/g, '\n\n')),
+ step_number: i + 1,
+ images: s.images.length > 1 ? step_images_gallery(s) : step_images(s)
+ });
+ return t;
+ };
+ const steps = howto.steps.map((s, i) => step(s, i)).join('\n\n');
+ const attachments = howto.files.map((f) => {
+ return `[${sanitize(f.name)}](${f.downloadUrl})`;
+ });
+ howto.description = removeEmojis(howto.description);
+ howto.description = createTextLinks_(howto.description);
+ let authorName = (howto.user && howto.user.data && howto.user.data && howto.user.data.title) ? howto.user.data.title : (howto.user ? howto.user._id : 'OSR-Plastic');
+ if (authorName === 'Precious Plastic Headquarters') {
+ authorName = 'Precious Plastic Nantes';
+ }
+ let _3dFiles = [...files(path.resolve(`${folder}`), '**/**/*.step'), ...files(path.resolve(`${folder}`), '**/**/*.STEP'), ...files(path.resolve(`${folder}`), '**/**/*.stp')];
+ _3dFiles = _3dFiles.map((f) => {
+ return forward_slash(`${howto.slug}/${path.relative(path.resolve(folder), f)}`);
+ });
+ let previews = '';
+ if (_3dFiles.length) {
+ previews += '';
+ previews += '
';
+ _3dFiles = _3dFiles.map((f) => {
+ return `
+
+ 3D Step File: ${f.replace(howto.slug, '')} -
+
+ Preview
+
+ `;
+ });
+ previews += _3dFiles.join('');
+ previews += ' ';
+ }
+ if (invalid_step_images) {
+ return false;
+ }
+ let index = substitute(templates.howto, {
+ ...fragments,
+ image: `/howtos/${howto.slug}/${encodeURIComponent(sanitize(howto.cover_image.name))}`,
+ title: howto.title.trim(),
+ description: escapeHtml(howto.description.trim()) || "",
+ enabled: howto.moderation == "accepted" ? true : false,
+ steps: steps,
+ keywords: ['Precious plastic', 'Preciousplastic', 'plastichub', 'osr', ...howtoTags].join(','),
+ user: howto._createdBy,
+ files: `${attachments.join('\n')}`,
+ authorName: authorName,
+ authorUrl: `https://osr-plastic.org/users/${howto.user ? howto.user._id : 'https://osr-plastic.org/users/plastichub'}.html`,
+ // short: escapeHtml(howto.description.trim()).substring(0, 100) + '....',
+ slug: howto.slug,
+ previews3D: previews
+ });
+ const $ = cheerio.load(index, {
+ xmlMode: true
+ });
+ /*
+ $('a').each(function () {
+ const url = $(this).attr("href");
+ logger.debug('url : ' + url);
+ if(url.indexOf('dropbox')){
+
+ }
+ });*/
+ //write(index_md, pretty(index, { ocd: true }));
+ return removeEmojis(index);
+}
+export const createHowtoTopic = async (discourse, howto, create = true) => {
+ if (!howto.category || !howto.category.label) {
+ howto.category = DEFAULT_HT_CATEGORY;
+ logger.error(`create howto : invalid category: ${howto.category} : ${howto.slug}`);
+ }
+ const user = getHowtoUser(howto);
+ if (!user) {
+ logger.error(`create howto : invalid user : ${howto._createdBy} :: ${howto.title}`);
+ }
+ const howto_folder = kb_howto_folder(howto);
+ const howto_cover_image = kb_howto_file(howto, howto.cover_image.name);
+ if (!exists(howto_folder)) {
+ logger.error('howto folder doesnt exists', howto.title);
+ }
+ if (!exists(howto_cover_image)) {
+ logger.error('howto cover image doesnt exists', howto.title);
+ }
+ if (!user || !user.f_id) {
+ logger.error(`create howto : invalid user : ${howto._createdBy} :: ${howto.title}`);
+ return false;
+ }
+ howto.cover_image = await uploadImage(discourse, user, howto.cover_image, howto_cover_image);
+ updateHowtoFile(howto);
+ let invalid_images = false;
+ for (const step of howto.steps) {
+ let i = 0;
+ for await (const image of step.images) {
+ const image_name = sanitize(image.name);
+ const imagePath = path.resolve(path.join(howto_folder, sanitize(image_name)));
+ if (!exists(imagePath)) {
+ logger.error('step image doesnt exists : ' + image.name + ' in ' + howto.slug);
+ invalid_images = true;
+ continue;
+ }
+ step.images[i] = await uploadImage(discourse, user, step.images[i], imagePath);
+ updateHowtoFile(howto);
+ i++;
+ }
+ }
+ if (invalid_images) {
+ logger.error('invalid images : ' + howto.slug);
+ return false;
+ }
+ const cat = HT_CATS[howto.category.label];
+ if (!cat) {
+ logger.error('invalid kat');
+ return false;
+ }
+ const templatesRoot = path.resolve(resolve("${OSR_ROOT}/osr-templates/discourse"));
+ const cPath = path.resolve(`${templatesRoot}/base.json`);
+ logger.debug(`read config at ${cPath}`);
+ const config = read(cPath, 'json');
+ const templates = path.resolve(`${templatesRoot}/howto`);
+ if (!exists(templates)) {
+ logger.error(`\t Cant find templates at ${templates}, path doesn't exists`);
+ return;
+ }
+ let fragments = { ...config.variables };
+ read_fragments(templates, fragments, "product_rel_path_name", "machine");
+ let template = read(path.resolve(`${templates}/howto.md`), 'string');
+ let step = read(path.resolve(`${templates}/step.md`), 'string');
+ resolveConfig(fragments);
+ const content = await howto_content(howto, howto_folder, fragments, {
+ howto: template,
+ step: '' + step
+ });
+ if (!content) {
+ logger.error('invalid content : ' + howto.slug);
+ return;
+ }
+ let data;
+ if (create) {
+ data = await discourse.createPost(sanitize(howto.title), content, cat);
+ if (data) {
+ logger.debug('created topic : ' + howto.title + ' : ' + data.id);
+ if (data && data.id) {
+ howto.post_id = data.id;
+ howto.topic_id = data.topic_id;
+ updateHowtoFile(howto);
+ try {
+ logger.debug('change user to ', user._id);
+ await discourse.changeOwner(howto.post_id, howto.topic_id, get_user_name(user));
+ }
+ catch (e) {
+ logger.debug('changing owner ' + howto.title + ' failed!');
+ howto.oF = true;
+ updateHowtoFile(howto);
+ }
+ }
+ else {
+ logger.debug('creating ' + howto.title + ' failed!', data.errors);
+ howto.post_id = 'failed';
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + howto.slug);
+ howto.post_id = 'already';
+ }
+ }
+ updateHowtoFile(howto);
+ }
+ }
+ }
+ else {
+ data = await discourse.updatePost(howto.post_id, content);
+ howto._updatedContent1 = true;
+ updateHowtoFile(howto);
+ }
+};
+export const importHowto = async (discorse, howto) => {
+ //const howtos = getHowtos()
+ //const index = howtos.findIndex((u) => u._id == howto._id)
+ const ret = await createHowtoTopic(discorse, howto);
+ return ret;
+};
+export const importHowtos = async (discorse, options, howtos) => {
+ logger.debug('read howtos from ', path.resolve(getHowtosPath()));
+ howtos = mergeLatest(discorse, options, howtos);
+ howtos = howtos.filter((h) => {
+ if (h.title === 'Build a Fishing Canoe') {
+ //debugger
+ }
+ if (h.post_id || h.post_id < 0) {
+ return false;
+ }
+ if (h.post_id === 'failed') {
+ logger.debug('skip failed : ' + h.slug);
+ return false;
+ }
+ //if (u.alreadyExists || u.invalidData) {
+ // return false;
+ //}
+ return true;
+ });
+ return await BPromise.resolve(howtos).map((h) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = importHowto(discorse, h);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating howto ' + h._id, e);
+ }
+ }, { concurrency: 1 });
+};
+/////////////////////////////////////////////////////////////////////////
+//
+// Update Howtos
+//
+let _discorseTags;
+const getDiscourseTags = async (discourse) => {
+ if (!_discorseTags) {
+ _discorseTags = await discourse.getTags();
+ }
+ return _discorseTags;
+};
+export const updateHowto = async (discourse, howto, options) => {
+ const tags = read_tags(options.src);
+ let howtoTags = [];
+ for (const ht in howto.tags) {
+ const t = ht;
+ const gt = tags.find((t) => {
+ return t._id === ht;
+ });
+ if (gt) {
+ howtoTags.push(gt.label);
+ }
+ else {
+ // logger.error('Cant resolve tag : ' + ht);
+ }
+ }
+ howtoTags.push('oa-import');
+ let discorseTags = await getDiscourseTags(discourse);
+ const cat = HT_CATS[howto.category.label];
+ if (howtoTags && howtoTags.length) {
+ try {
+ const ret = await discourse.updateTopic(howto.topic_id, cat, sanitize(howto.title), howtoTags);
+ logger.debug('Updating howto tags : ' + howto.title);
+ }
+ catch (error) {
+ logger.error('Error updating post' + howto.title, howto.topic_id, cat, howtoTags, error);
+ howto['updateFailed1'] = 1;
+ updateHowtoFile(howto);
+ //debugger
+ }
+ }
+ howto.updatedTags = true;
+ updateHowtoFile(howto);
+ const _date = howto._modified || howto._created;
+ if (_date) {
+ let date = new Date(_date);
+ logger.debug('update ts ' + howto.slug + ' : ' + new Date(date).toLocaleDateString());
+ let offset = 0;
+ const valueOf = date.valueOf() - (offset) * 60000;
+ let ts = Math.floor(valueOf / 1000);
+ const tUpdate = await discourse.updateTopicTimestamp(howto.topic_id, ts, FUCKING_TOKEN);
+ if (tUpdate) {
+ howto.updatedTime8 = true;
+ updateHowtoFile(howto);
+ return true;
+ }
+ }
+ else {
+ logger.error('Have no ts : ' + howto.slug);
+ }
+};
+export const updateHowtos = async (discorse, options, howtos) => {
+ logger.debug('update howtos from ', path.resolve(getHowtosPath()));
+ howtos = mergeLatest(discorse, options, howtos);
+ const forceUpdateContent = true;
+ const forceUpdateMeta = true;
+ const updateContent = true;
+ const updateMeta = true;
+ howtos = howtos.filter((h) => {
+ if (!h.post_id || !h.topic_id) {
+ return false;
+ }
+ if (h.post_id === 'failed') {
+ logger.debug('skip failed : ' + h.slug);
+ return false;
+ }
+ if (forceUpdateContent || forceUpdateMeta) {
+ return true;
+ }
+ if (!h._updatedContent1) {
+ return true;
+ }
+ if (h.updatedTags && h.updatedTime8) {
+ return false;
+ }
+ if (!h.updatedTags || !h.updatedTime8) {
+ return true;
+ }
+ return true;
+ });
+ return await BPromise.resolve(howtos).map((h) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ if (updateContent) {
+ logger.debug('\t recook howto content', h.title);
+ let d = createHowtoTopic(discorse, h, false);
+ d.then(() => {
+ if (updateMeta) {
+ d = updateHowto(discorse, h, options);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }
+ else {
+ resolve(1);
+ }
+ });
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating howto ' + h._id, e);
+ }
+ }, { concurrency: 1 });
+};
+//# sourceMappingURL=howtos.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/howtos.js.map b/packages/discourse/dist/lib/oa/howtos.js.map
new file mode 100644
index 00000000..6f7996bc
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/howtos.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"howtos.js","sourceRoot":"","sources":["../../../src/lib/oa/howtos.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/index.d.ts b/packages/discourse/dist/lib/oa/index.d.ts
new file mode 100644
index 00000000..7966de83
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/index.d.ts
@@ -0,0 +1,3 @@
+export * from './lib';
+export * from './users';
+export * from './types';
diff --git a/packages/discourse/dist/lib/oa/index.js b/packages/discourse/dist/lib/oa/index.js
new file mode 100644
index 00000000..93399d18
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/index.js
@@ -0,0 +1,4 @@
+export * from './lib';
+export * from './users';
+export * from './types';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/index.js.map b/packages/discourse/dist/lib/oa/index.js.map
new file mode 100644
index 00000000..0bcd6c17
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/oa/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAA;AACrB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/lib.d.ts b/packages/discourse/dist/lib/oa/lib.d.ts
new file mode 100644
index 00000000..49c99ad8
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/lib.d.ts
@@ -0,0 +1,3 @@
+export declare const sanitize: (f: any) => string;
+export declare const getImageName: (url: any) => string;
+export declare const convert: (input: string) => any;
diff --git a/packages/discourse/dist/lib/oa/lib.js b/packages/discourse/dist/lib/oa/lib.js
new file mode 100644
index 00000000..cec1cfe1
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/lib.js
@@ -0,0 +1,191 @@
+const _sanitize = require("sanitize-filename");
+const URI = require("uri-js");
+import * as path from 'path';
+const filenamify = require('filenamify');
+var TurndownService = require('turndown');
+export const sanitize = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "");
+ if (str.startsWith('_')) {
+ str = str.substring(1);
+ }
+ return str;
+};
+export const getImageName = (url) => {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ const fileName = sanitize(decodeURIComponent(pParsed.base));
+ return fileName;
+};
+export const convert = (input) => {
+ var turndownService = new TurndownService();
+ return turndownService.turndown(input);
+};
+/*
+
+
+const getFUser = (users, user_name) => {
+ return users.find((u) => {
+ return u.name == user_name
+ })
+}
+
+
+const indexUsers = async (d, forum: string, detail) => {
+
+ const forumUsers = await getForumUsers(d, detail)
+ const raw = (read(path.resolve(forum + '/index.json'), 'json') as any)
+ const users_raw = raw.users
+ let users = []
+ for (let u in users_raw) {
+ const user = users_raw[u];
+ const avatar = getOAvatar(raw, u);
+ let aFileName = '';
+ let fUser = getFUser(forumUsers, u);
+ if (avatar) {
+ const parsed = URI.parse(avatar);
+ const pParsed = path.parse(parsed.path);
+ aFileName = pParsed.base;
+ }
+ users.push({
+ name: u,
+ avatar: avatar,
+ avatarFileName: aFileName,
+ user_id: fUser ? fUser.id : -1
+ });
+ }
+ write(path.resolve(forum + '/user.json'), users);
+}
+
+const _createUser = async (discorse, forum, name, email) => {
+
+ const users = getUsers()
+ const index = users.findIndex((u) => u.detail.name == name)
+ let user = await createUser(discorse, null)
+
+
+ if (user && users[index].upload_id) {
+ await discorse.setUserAvatar(name, users[index].upload_id);
+ //return users;
+ }
+
+ if (user > 0 && index) {
+ users[index].f_id = user;
+ console.log('created ' + name + ' ' + user);
+ write(getUsersPath(), users);
+ } else {
+ console.error('cant create user - error', name, user)
+ }
+}
+
+
+const _updateGroup = async (discorse, forum, name, id, forumUsers) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const index = users.findIndex((u) => u.name == name);
+ try {
+ const d = await discorse.updateGroup(name, pUserGroup);
+ console.log('updated user group for ' + name);
+ users[index].g_id = pUserGroup;
+ write(path.resolve(forum + '/user.json'), users);
+ if (users[index].upload_id) {
+ //await discorse.setUserAvatar(name, users[index].upload_id);
+ }
+ } catch (e) {
+ if (e.data && e.data.status == 422) {
+ users[index].g_id = pUserGroup;
+ write(path.resolve(forum + '/user.json'), users);
+ console.log('updated user group for ' + name);
+ }
+ }
+}
+
+const _updateAvatar = async (discorse, forum, name) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const index = users.findIndex((u) => u.name == name);
+ return new Promise((resolve, reject) => {
+ try {
+ setTimeout(() => {
+ discorse.setUserAvatar(name, users[index].upload_id).then(() => {
+ console.log('updated avatar for ' + name);
+ users[index].avatarSet = true;
+ write(path.resolve(forum + '/user.json'), users);
+ resolve(1);
+ });
+ }, 200);
+ } catch (e) {
+ console.error('-error setting avatar', e);
+ debugger;
+ }
+ });
+}
+
+
+const createUsers = async (d, forum) => {
+
+ const forumUsers = await getForumUsers(d, true)
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeCreated = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return false;
+ }
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+
+ console.log('Create Users ' + users.length + ' Total | Left: ' + toBeCreated.length);
+
+ return await BPromise.resolve(toBeCreated).map((u: any) => {
+ const t = _createUser(d, forum, u.name, u.email);
+ return t;
+ }, { concurrency: 1 })
+
+}
+
+const updateUserGroups = async (forum) => {
+ const forumUsers = (read(path.resolve(forum + '/fusers.json'), 'json') as any);
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeUpdated = users.filter((u) => {
+ if (u.g_id) {
+ return false;
+ }
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+ const d = getDiscourse();
+ console.log('Update Users ' + users.length + ' Total | Left: ' + toBeUpdated.length);
+ return await BPromise.resolve(toBeUpdated).map((u: any) => {
+ const t = _updateGroup(d, forum, u.name, u.f_id, forumUsers);
+ return t;
+ }, { concurrency: 1 })
+
+}
+
+const updateUserAvatars = async (forum) => {
+ const users = (read(path.resolve(forum + '/user.json'), 'json') as any);
+ const toBeUpdated = users.filter((u) => {
+ if (!u.upload_id) {
+ return false;
+ }
+
+ if (u.avatarSet) {
+ return false;
+ }
+
+ if (u.name === 'plastichub' || u.name === 'lu' || u.name === 'timberstar' || u.name === 'nickname') {
+ return false
+ }
+ return true;
+ });
+ const d = getDiscourse();
+ console.log('Update User Avatar ' + users.length + ' Total | Left: ' + toBeUpdated.length);
+ return await BPromise.resolve(toBeUpdated).map((u: any) => {
+ const t = _updateAvatar(d, forum, u.name);
+ return t;
+ }, { concurrency: 1 })
+
+}
+*/
+//# sourceMappingURL=lib.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/lib.js.map b/packages/discourse/dist/lib/oa/lib.js.map
new file mode 100644
index 00000000..2ba90cb9
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/lib.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../src/lib/oa/lib.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AACxC,IAAI,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC1B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACrB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;KACzB;IACD,OAAO,GAAG,CAAA;AACd,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,YAAY,GAAI,CAAC,GAAG,EAAE,EAAE;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,OAAO,QAAQ,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE;IACxC,IAAI,eAAe,GAAG,IAAI,eAAe,EAAE,CAAA;IAC3C,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuKE"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/types.d.ts b/packages/discourse/dist/lib/oa/types.d.ts
new file mode 100644
index 00000000..166527cd
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/types.d.ts
@@ -0,0 +1,91 @@
+import { IUploadedFileMeta, I_OSR_USER } from '@polymech/commons';
+export interface IOACategory {
+ _created: string;
+ _id: string;
+ _deleted: boolean;
+ label: string;
+ _modified: string;
+}
+export interface IOATag {
+ categories: string[];
+ image: string;
+ _created: string;
+ _deleted: boolean;
+ label: string;
+ _createdBy: string;
+ _modified: string;
+ _id: string;
+}
+export type IOADifficultyLevel = 'Easy' | 'Medium' | 'Hard' | 'Very Hard';
+export interface IDImage {
+ id: number;
+ url: string;
+ original_filename: string;
+ filesize: number;
+ width: number;
+ height: number;
+ thumbnail_width: number;
+ thumbnail_height: number;
+ extension: string;
+ short_url: string;
+ short_path: string;
+ retain_hours: any;
+ human_filesize: string;
+}
+export interface IOAHowto {
+ moderation: string;
+ category: IOACategory;
+ previousSlugs: string[];
+ total_downloads: number;
+ _createdBy: string;
+ slug: string;
+ cover_image: IUploadedFileMeta;
+ _modified: string;
+ files: any[];
+ description: string;
+ mentions: any[];
+ time: string;
+ _created: string;
+ fileLink: string;
+ steps: IOAStep[];
+ creatorCountry: string;
+ title: string;
+ tags: IOATags;
+ _id: string;
+ _deleted: boolean;
+ total_views: number;
+ difficulty_level: IOADifficultyLevel;
+ comments: any[];
+ user: IImportUser;
+ pics?: string[];
+}
+export interface IOAStep {
+ _animationKey: string;
+ images: IUploadedFileMeta[];
+ text: string;
+ title: string;
+}
+export interface IOATags {
+ [key: string]: boolean;
+}
+export type IOAHowtoImport = IOAHowto & {
+ post_id?: number | string;
+ topic_id?: number;
+ oF?: boolean;
+ updatedTags?: boolean;
+ updatedTime8?: boolean;
+ _updatedContent1?: boolean;
+};
+export interface IImportUser extends I_OSR_USER {
+ f_id: number;
+ upload_id: number;
+ avatar: string;
+ _didSetAvatar: boolean;
+ _didSetGroup: boolean;
+ alreadyExists: boolean;
+ invalidData: boolean;
+ didUpdateName: boolean;
+ profileHeader?: IDImage;
+ cardBackground?: IDImage;
+ avatarImage?: IDImage;
+}
diff --git a/packages/discourse/dist/lib/oa/types.js b/packages/discourse/dist/lib/oa/types.js
new file mode 100644
index 00000000..4513f1e0
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/types.js
@@ -0,0 +1,2 @@
+export {};
+//# sourceMappingURL=types.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/types.js.map b/packages/discourse/dist/lib/oa/types.js.map
new file mode 100644
index 00000000..8242903b
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/types.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/oa/types.ts"],"names":[],"mappings":""}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/users.d.ts b/packages/discourse/dist/lib/oa/users.d.ts
new file mode 100644
index 00000000..c5220331
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/users.d.ts
@@ -0,0 +1,29 @@
+import { I_OSR_USER } from '@polymech/commons';
+import { IImportUser, IDiscourseUser } from '../../';
+export declare const read_users: (src: string) => I_OSR_USER[];
+export declare const filter_valid: (users: IImportUser[]) => IImportUser[];
+export declare const filter_email_only: (users: any[]) => any[];
+export declare const filter_invalid: (users: any[]) => any[];
+export declare const filter_email_missing: (users: any[]) => any[];
+export declare const filter_accepted: (users: IImportUser[]) => IImportUser[];
+export declare const oa_user_email: (user: I_OSR_USER) => string | false;
+export declare const get_user_name: (user: IImportUser) => any;
+export declare const get_user_display_name: (user: IImportUser) => any;
+export declare const getDataPath: (_path?: string) => string;
+export declare const getUsersPath: () => string;
+export declare const getUsers: () => IImportUser[];
+export declare const _getForumUsers: (d: Discourser, page: any, detail: any) => any;
+export declare const getForumUsers: (d: any, detail: any) => Promise;
+export declare const createUser: (discourse: Discourser, oa_user: IImportUser) => Promise;
+export declare const uploadAvatar: (discourse: any, name: any, filePath: any) => Promise;
+export declare const updateUser: (discorse: Discourser, oa_user: IImportUser) => Promise;
+export declare const importUser: (discorse: Discourser, oa_user: IImportUser) => Promise;
+export declare const mergeLatestUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => IImportUser[];
+export declare const mergeLatestUsersTest: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => IImportUser[];
+export declare const importUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
+export declare const updateUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
+export declare const md_edit_wrap: (content: any, f: any, prefix?: string, context?: string) => any;
+export declare const toHTML: (path: any, markdown: any) => any;
+export declare const imageName: (url: any) => any;
+export declare const read_fragments: (src: any, config: any, prefix?: string, context?: string) => any;
+export declare const indexUsers: (discorse: any, options: IOptions, oa_users: I_OSR_USER[]) => Promise;
diff --git a/packages/discourse/dist/lib/oa/users.js b/packages/discourse/dist/lib/oa/users.js
new file mode 100644
index 00000000..34976f8f
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/users.js
@@ -0,0 +1,906 @@
+import { Promise as BPromise } from 'bluebird';
+import { getImageName, sanitize } from './lib';
+import { capitalize, replaceAll } from '@polymech/core/utils';
+import * as path from 'path';
+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 { logger } from '../../index';
+const slugify = require('slugify');
+import { substitute } from '@polymech/core';
+import { html_beautify } from 'js-beautify';
+import { sync as mkdir } from '@polymech/fs/dir';
+import { files } from '@polymech/commons';
+import { Converter } from 'showdown';
+const URI = require("uri-js");
+import { OA_USER_IMPORT_GROUP, LATEST_TEST, LATEST_TRACK, FETCH_DUSERS, F_USERS_ALL, F_USERS_NOW, DEFAULT_PASSWORD, DATA_PATH, OA_DIRECTORY_OVERVIEW_TOPIC } from '../discourse/constants';
+const filenamify = require('filenamify');
+const fg = require('fast-glob');
+const TEST = false;
+export const read_users = (src) => {
+ const raw = read(src, 'json');
+ return raw.v3_mappins.filter((f) => f.data != null);
+};
+export const filter_valid = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (!user.data.title) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.heroImageUrl) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ //return false
+ }
+ return true;
+ });
+};
+export const filter_email_only = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return false;
+ }
+ if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
+ return false;
+ }
+ return true;
+ });
+};
+export const filter_invalid = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return true;
+ }
+ if (user.data.urls.find((l) => l.name == 'Email') == undefined) {
+ return true;
+ }
+ if (user.moderation !== 'accepted') {
+ return true;
+ }
+ return false;
+ });
+};
+export const filter_email_missing = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (!user.detail) {
+ return false;
+ }
+ if (!user.detail.name) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ return false;
+ }
+ if (!user.data.urls.find((l) => l.name == 'Email')) {
+ return true;
+ }
+ return false;
+ });
+};
+export const filter_accepted = (users) => {
+ return users.filter((user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (!user.detail.heroImageUrl) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ if (user.moderation !== 'accepted') {
+ return false;
+ }
+ return true;
+ });
+};
+export const oa_user_email = (user) => {
+ if (!user.data) {
+ return false;
+ }
+ if (!user.geo) {
+ return false;
+ }
+ if (!user.data.urls) {
+ return false;
+ }
+ if (user.data && user.data.jsError) {
+ return false;
+ }
+ let u = user.data.urls.find((l) => l.name == 'Email');
+ if (u) {
+ return u.url.replace('mailto:', '');
+ }
+};
+export const get_user_name = (user) => {
+ let ret = replaceAll('--', '-', sanitize(filenamify(user._id)).replace(/^\-+/g, '').replace(/\-$/, ''));
+ ret = ret.replace(/\-$/, '');
+ ret = ret.replace(/\_$/, '');
+ if (!oa_user_email(user)) {
+ ret += '-uc';
+ }
+ return ret;
+};
+export const get_user_display_name = (user) => replaceAll('--', '-', sanitize(filenamify(user.data.title)).replace(/^\-+/g, '').replace(/\-$/, ''));
+export const getDataPath = (_path = '') => path.resolve(path.join(resolve(DATA_PATH), _path));
+export const getUsersPath = () => path.resolve(resolve(TEST ? LATEST_TEST : LATEST_TRACK));
+export const getUsers = () => read(path.resolve(getUsersPath()), 'json') || [];
+let uPage = 1;
+let usersAll = [];
+export const _getForumUsers = async (d, page, detail) => {
+ 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(path.resolve(F_USERS_NOW), usersAll);
+ let fUsers = read(path.resolve(F_USERS_ALL), '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) {
+ logger.debug('Retrieve User Detail ' + u.name);
+ setTimeout(() => {
+ d.getUser(fUser.id).then((detail) => {
+ if (detail) {
+ fUser.detail = detail;
+ }
+ write(path.resolve('./fusers-all.json'), 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) => {
+ if (!FETCH_DUSERS) {
+ return read(getDataPath(F_USERS_ALL), 'json') || [];
+ }
+ return _getForumUsers(d, uPage, detail);
+};
+export const createUser = async (discourse, oa_user) => {
+ /*
+ Bazar
+ https://shop.osr-plastic.org
+ Website
+ website2
+ Instagram
+ https://www.instagram.com/osr_plastic/
+ Directory / Map Url
+ https://www.google.com/maps/contrib/117674167598277014013
+ OSR - Marketplace Url
+ https://shop.osr-plastic.org/plastichub/
+ */
+ if (!oa_user.data.title) {
+ return -120;
+ }
+ let name = replaceAll('--', '-', get_user_display_name(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
+ let user_name = get_user_name(oa_user);
+ name = user_name.replace(/\-$/, '');
+ name = user_name.replace(/\_$/, '');
+ let opts = {
+ "name": name,
+ "email": oa_user_email(oa_user) || `${user_name}_uc@osr-plastic.org`,
+ "password": DEFAULT_PASSWORD(),
+ "username": user_name,
+ "active": true,
+ "approved": true,
+ "user_fields[1]": true
+ };
+ let user = await discourse.createUser(opts);
+ if (name.length < 4) {
+ return -120;
+ }
+ if (user_name.length > 50) {
+ return -120;
+ }
+ if (user && user.errors) {
+ if (user.message === "Username must be no more than 50 characters" ||
+ user.message === 'Username must not contain a sequence of 2 or more special chars (.-_)') {
+ return -120;
+ }
+ if (user.message === "Username must be unique" || user.message === "Primary email has already been taken") {
+ return -100;
+ }
+ if (user.errors.email && user.errors.username) {
+ user = await discourse.getUserByUsername(user_name);
+ if (user && user.id && !oa_user._didSetGroup) {
+ try {
+ let gret = await discourse.updateGroup(user_name, OA_USER_IMPORT_GROUP);
+ }
+ catch (e) {
+ logger.error('error adding to group', user_name);
+ }
+ return user.id;
+ }
+ ;
+ }
+ logger.error('Error creating user ' + user_name, user.errors);
+ }
+ if (user && user.user_id) {
+ try {
+ await discourse.updateGroup(user_name, OA_USER_IMPORT_GROUP);
+ return user.user_id;
+ }
+ catch (e) {
+ logger.error('error adding to group', user_name);
+ return user.user_id;
+ }
+ }
+ else {
+ if (user && user.message && user.message == 'Username must be unique\nPrimary email has already been taken') {
+ logger.error('already created', oa_user.detail.name);
+ return -10;
+ }
+ else if (user && user.message && user.message == 'Your account is activated and ready to use.') {
+ if (user.user_id) {
+ return user.user_id;
+ }
+ return -10;
+ }
+ else {
+ logger.debug('cant create user ' + oa_user.detail.name, user);
+ }
+ return null;
+ }
+ return null;
+};
+export const uploadAvatar = async (discourse, name, filePath) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u.detail.name == name);
+ try {
+ const upped = await discourse.upload(1, filePath);
+ const data = upped.data;
+ if (data && data.id) {
+ users[index].upload_id = data.id;
+ logger.debug('uploaded avatar ' + name + ' ' + data.id);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('upload - error', name);
+ }
+ return users;
+ }
+ catch (error) {
+ users[index].upload_id = -1;
+ logger.error('error uploading avatar', name);
+ write(getUsersPath(), users);
+ }
+};
+const uploadAvatars = async (discourse, users) => {
+ const toBeUploaded = users.filter((u) => {
+ if (u.upload_id) {
+ return false;
+ }
+ const hero = getImageName(u.detail.heroImageUrl);
+ const avatar = findAvatar(u, hero);
+ if (!avatar) {
+ logger.error('cant find avatar : ', u._id, hero);
+ return false;
+ }
+ u.avatar = avatar;
+ return true;
+ });
+ return await BPromise.resolve(toBeUploaded).map((u) => {
+ if (!u.detail.name) {
+ return;
+ }
+ logger.debug('upload avatar : ' + u._id);
+ const t = uploadAvatar(discourse, u.detail.name, u.avatar);
+ return t;
+ }, { concurrency: 1 });
+};
+const findAvatar = (user, filename) => {
+ const root = path.resolve(resolve(DATA_PATH));
+ const _path = path.resolve(`${root}/${user._id}/${filename}`);
+ if (exists(_path)) {
+ return _path;
+ }
+ const files = fg.sync('**/**/*' + filename + '*', { dot: true, cwd: root, absolute: true });
+ if (files.length == 0) {
+ return false;
+ }
+ return files[0];
+};
+/////////////////////////////////////////////////////
+//
+// users
+//
+export const updateUser = async (discorse, oa_user) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u.detail.name == oa_user.detail.name);
+ const user_name = replaceAll('--', '-', get_user_name(oa_user).replace(/^\-+/g, '').replace(/\-$/, ''));
+ let ret = null;
+ try {
+ ret = await discorse.updateUser(user_name, {
+ name: oa_user.data.title
+ });
+ try {
+ let location;
+ if (oa_user.geo) {
+ location = `${oa_user.geo.continent} / ${oa_user.geo.countryName} / ${oa_user.geo.city} `;
+ }
+ let website;
+ if (oa_user.data) {
+ website = oa_user.data.urls.find((l) => l.name == 'Website');
+ if (website) {
+ website = website.url;
+ }
+ }
+ let description;
+ if (oa_user.data) {
+ if (oa_user.data.description) {
+ description += oa_user.data.description;
+ }
+ description += '\n';
+ if (oa_user.data.services) {
+ let services = `### Services \n`;
+ let hasServices = false;
+ for (let s in oa_user.data.services[0]) {
+ if (oa_user.data.services[0][s]) {
+ services += `- [x] ${capitalize(s)}\n`;
+ hasServices = true;
+ }
+ }
+ if (hasServices) {
+ description += services;
+ }
+ }
+ }
+ let links = '';
+ if (oa_user.data.urls) {
+ links = oa_user.data.urls.filter((r) => r.name !== 'Bazar' && r.name !== 'sponsor the work').map((l) => {
+ let label = '' + l.name;
+ if (label === 'Social media') {
+ if (l.url.indexOf('facebook') !== -1) {
+ label = 'Facebook';
+ }
+ if (l.url.indexOf('instagram') !== -1) {
+ label = 'Instagram';
+ }
+ }
+ label += " - " + l.url;
+ label = label.replace("https://", "");
+ label = label.replace("http://", "");
+ label = label.replace("mailto:", "");
+ return `${label} `;
+ }).join(" \n");
+ description += '\n### Links\n';
+ description += links;
+ }
+ if (oa_user.location) {
+ description += `\n\n Get Directions \n`;
+ }
+ let updatePrefs = await discorse.updateUserProfile(user_name, {
+ bio_raw: replaceAll('undefined', '', description),
+ location,
+ website
+ });
+ }
+ catch (error) {
+ logger.error(`Error updating user prefs : ${user_name}`);
+ }
+ }
+ catch (error) {
+ logger.error('error updating user', oa_user._id, error.message);
+ return;
+ }
+ if (ret.status === 200) {
+ users[index].didUpdateName = true;
+ logger.debug('did update user', oa_user._id, ' # ', oa_user.data.title);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('did update user failed ', oa_user._id);
+ }
+};
+export const importUser = async (discorse, oa_user) => {
+ const users = getUsers();
+ const index = users.findIndex((u) => u._id == oa_user._id);
+ let user = null;
+ try {
+ user = await createUser(discorse, oa_user);
+ }
+ catch (error) {
+ debugger;
+ logger.error('error creating user', error);
+ return false;
+ }
+ if (user === -100) {
+ users[index].alreadyExists = true;
+ write(getUsersPath(), users);
+ return;
+ }
+ if (user === -120) {
+ users[index].invalidData = true;
+ write(getUsersPath(), users);
+ return;
+ }
+ if (user && users[index].upload_id && !users[index]._didSetAvatar) {
+ try {
+ await discorse.setUserAvatar(get_user_name(oa_user), users[index].upload_id);
+ }
+ catch (e) {
+ logger.error('error setting avatar', get_user_name(oa_user));
+ }
+ }
+ const _t = users[index];
+ if (user > 0) {
+ users[index].f_id = user;
+ users[index]._didSetAvatar = true;
+ users[index]._didSetGroup = true;
+ logger.debug('\t created ' + oa_user.data.title);
+ write(getUsersPath(), users);
+ }
+ else {
+ logger.error('cant create user - error', oa_user.detail.name, user);
+ }
+ return users[index];
+};
+export const mergeLatestUsers = (discorse, options, oa_users) => {
+ const users = getUsers();
+ oa_users.forEach((u) => {
+ const tUser = users.find((tu) => {
+ return tu._id === u._id;
+ });
+ if (!tUser) {
+ users.push(u);
+ }
+ });
+ logger.debug(`Merged users to ${getUsersPath()}`);
+ write(getUsersPath(), users);
+ return users;
+};
+export const mergeLatestUsersTest = (discorse, options, oa_users) => {
+ const users = (read(LATEST_TEST, 'json') || []);
+ oa_users.forEach((u) => {
+ const tUser = users.find((u) => {
+ return u._id === u._id;
+ });
+ if (!tUser) {
+ users.push(u);
+ }
+ });
+ write(options.track, users);
+ return users;
+};
+export const importUsers = async (discorse, options, oa_users) => {
+ logger.debug('read users from ', path.resolve(getUsersPath()));
+ let users = mergeLatestUsers(discorse, options, oa_users);
+ //const users = mergeLatestUsersTest(discorse, options, oa_users)
+ users = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return false;
+ }
+ if (u.detail.name === 'plastichub' || u.detail.name === 'lu' || u.detail.name === 'timberstar' || u.detail.name === 'nickname') {
+ return false;
+ }
+ if (u.alreadyExists || u.invalidData) {
+ return false;
+ }
+ return true;
+ });
+ logger.debug('Create Users ' + users.length + ' Total | Left: ' + users.length);
+ await uploadAvatars(discorse, users);
+ return await BPromise.resolve(users).map((u) => {
+ logger.debug('import user ' + get_user_name(u));
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = importUser(discorse, u);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 500);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e);
+ }
+ }, { concurrency: 1 });
+};
+export const updateUsers = async (discorse, options, oa_users) => {
+ // https://forum.osr-plastic.org/u/easymoulds/preferences/profile
+ const users = mergeLatestUsers(discorse, options, oa_users);
+ //const users = mergeLatestUsersTest(discorse, options, oa_users)
+ let toBeCreated = users.filter((u) => {
+ if (u.f_id || u.f_id < 0) {
+ return true;
+ }
+ if (u.didUpdateName) {
+ return false;
+ }
+ return true;
+ });
+ const testUser = 'easymoulds';
+ const test = toBeCreated.find((u) => {
+ return u._id === testUser;
+ });
+ // toBeCreated = [test]
+ return await BPromise.resolve(toBeCreated).map((u) => {
+ /*
+ if (u.didUpdateName) {
+ return false
+ }
+ */
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = updateUser(discorse, u);
+ if (d) {
+ d.then(resolve);
+ }
+ else {
+ reject();
+ }
+ }, 200);
+ });
+ }
+ catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e);
+ }
+ }, { concurrency: 1 });
+};
+export const md_edit_wrap = (content, f, prefix = '', context = '') => {
+ return html_beautify(`${content}
`);
+};
+export const toHTML = (path, markdown) => {
+ const content = read(path, 'string');
+ if (!markdown) {
+ let converter = new Converter({ tables: true });
+ converter.setOption('literalMidWordUnderscores', 'true');
+ return converter.makeHtml(content);
+ }
+ else {
+ return content;
+ }
+};
+export const imageName = (url) => {
+ if (!url) {
+ return "";
+ }
+ try {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ return sanitize(decodeURIComponent(pParsed.base));
+ }
+ catch (error) {
+ logger.error('error image name : ', url);
+ return "";
+ }
+};
+export const read_fragments = (src, config, prefix = '', context = '') => {
+ if (!exists(src)) {
+ //debug.warn(`Create template folder ${src}`);
+ mkdir(src);
+ }
+ let fragments = files(src, '*.html');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, true), f, prefix, context);
+ });
+ fragments = files(src, '*.md');
+ fragments.map((f) => {
+ config[path.parse(f).name] = md_edit_wrap(toHTML(f, false), f, prefix, context);
+ });
+ return config;
+};
+export const indexUsers = async (discorse, options, oa_users) => {
+ let users = mergeLatestUsers(discorse, options, oa_users);
+ users = users.filter((u) => {
+ if (u.f_id && u.data && u.geo) {
+ return true;
+ }
+ return false;
+ });
+ const continents = [];
+ const countries = [];
+ const navIndex = [];
+ users.forEach((u) => {
+ if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
+ return;
+ }
+ if (!u.detail.heroImageUrl) {
+ return;
+ }
+ let code = null;
+ if (u.geo.continent && continents.indexOf(u.geo.continent) == -1) {
+ continents.push(u.geo.continent);
+ navIndex.push({
+ title: u.geo.continent,
+ url: `/users/${slugify(u.geo.continent)}.html`,
+ children: [],
+ code: u.geo.continentCode
+ // code:u.geo.continentCode
+ });
+ }
+ if (countries.indexOf(u.geo.countryName) == -1) {
+ countries.push(u.geo.countryName);
+ }
+ const c = navIndex.find((c) => c.title === u.geo.continent);
+ if (c) {
+ const cc = c.children.find((i) => i.title == u.geo.countryName);
+ if (!cc) {
+ c.children.push({
+ title: u.geo.countryName,
+ url: `/users/${slugify(c.title)}.html#${slugify(u.geo.countryName.toLocaleLowerCase())}`,
+ postTitle: `Directory - ${u.geo.countryName}`
+ });
+ }
+ }
+ });
+ navIndex.sort((a, b) => {
+ if (a.title < b.title) {
+ return -1;
+ }
+ if (a.title > b.title) {
+ return 1;
+ }
+ return 0;
+ });
+ navIndex.forEach((c) => {
+ c.children.sort((a, b) => {
+ if (a.title < b.title) {
+ return -1;
+ }
+ if (a.title > b.title) {
+ return 1;
+ }
+ return 0;
+ });
+ });
+ const directoryRoot = path.resolve(resolve('${OSR_ROOT}/osr-directory/pp'));
+ const createContinentPage = (continent) => {
+ const templates_path = path.resolve(`${directoryRoot}/templates`);
+ if (!exists(templates_path)) {
+ logger.error(`\t Cant find templates at ${templates_path}, path doesn't exists`);
+ return;
+ }
+ const cPath = path.resolve(`${directoryRoot}/templates/config.json`);
+ const config = read(cPath, 'json');
+ let fragments = { ...config };
+ read_fragments(templates_path, fragments, "product_rel_path_name", "machine");
+ let templateCountry = read(path.resolve(`${templates_path}/country_users.md`), 'string');
+ const ccountries = {};
+ let code = null;
+ users.forEach((u) => {
+ if (!u.geo || !u.data || u.data.jsError || !u.detail || !u.detail.heroImageUrl) {
+ return;
+ }
+ if (!u.detail.heroImageUrl) {
+ return;
+ }
+ if (u.geo.continent && u.geo.continent === continent) {
+ if (!code) {
+ code = u.geo.continentCode;
+ }
+ if (!ccountries[u.geo.countryName]) {
+ ccountries[u.geo.countryName] = [];
+ }
+ ccountries[u.geo.countryName].push(u);
+ }
+ });
+ if (continent === 'Africa') {
+ //debugger;
+ }
+ let weight = 100;
+ for (var country in ccountries) {
+ let cPage = "";
+ if (country === 'Kenya') {
+ //debugger;
+ }
+ cPage += `\n#### ${slugify(country)}\n\n`;
+ if (country === 'undefined' || country === 'unknown' || !country) {
+ return;
+ }
+ cPage += '';
+ cPage += '
';
+ let cusers = ccountries[country];
+ cusers = cusers.sort((a, b) => a.type === b.type ? 1 : -1);
+ const cUsersC = cusers.map((u) => {
+ const prefix = u.moderation === 'rejected' ? "
Censored " : "";
+ const image = `/users/${u._id}/${encodeURIComponent(sanitize(imageName(u.detail.heroImageUrl)))}`;
+ const title = u.data && u.data.title ? u.data.title : u._id;
+ const uUrl = `/directory/users/${u._id}`;
+ let censored = u.moderation === 'rejected' ? '
Yes ' : 'No';
+ return `
+
+
+
+
${title}
+
Type: ${u.type}
+
Censored: ${censored}
+
+
${u.geo.principalSubdivision} / ${u.geo.locality} - ${u.geo.principalSubdivisionCode} - ${u.geo.postcode}
+
+
`;
+ });
+ cPage += cUsersC.join('');
+ cPage += '
';
+ country = country.replace(' (the)', '');
+ /*
+ const cPagePath = path.resolve(`${kb}/src/directory/users_${sanitize(slugify(country))}-${code}.md`)
+
+ const title = 'Users - ' + country;
+
+ cPage = substitute(templateCountry, {
+ ...fragments,
+ title: title,
+ keywords: 'Precious Plastic, Precious Plastic Users - ' + country,
+ content: html_beautify(cPage),
+ continent: slugify(continent),
+ country: slugify(country),
+ identifier: country + "-" + continent,
+ weight: weight
+ });
+
+ weight++;
+ write(cPagePath, cPage);
+ console.log('write ' + cPagePath);
+ */
+ }
+ /*
+ content = substitute(template, {
+ ...fragments,
+ title: 'Precious Plastic - Users ' + continent,
+ keywords: 'Precious Plastic, Precious Plastic Users - ' + continent,
+ content: content,
+ continent: slugify(continent)
+ });
+ */
+ //const index_md = path.resolve(`${root}/_pages/users_${code}.md`);
+ //write(index_md, content);
+ };
+ const templates_path = path.resolve(`${directoryRoot}/templates`);
+ const createCountryPages = async (index, indexPath) => {
+ let i = 0;
+ for await (const continent of index) {
+ const countries = continent.children;
+ for await (const country of countries) {
+ const d = 0;
+ }
+ }
+ };
+ await createCountryPages(navIndex, './');
+ const createIntroPage = async (users, index, dst) => {
+ let template = read(path.resolve(`${templates_path}/intro_users.md`));
+ let content = "";
+ const usersPerCountry = (country) => {
+ return users.filter((u) => u.geo.countryName === country);
+ };
+ index.forEach((i) => {
+ const heading = `## ${i.title}`;
+ let countries = '';
+ i.children.forEach((c) => {
+ let title = c.title.replace(/ *\([^)]*\) */g, "");
+ const nb = usersPerCountry(c.title).length;
+ title = `${title} \(${nb}\)`;
+ const cPagePath = `/directory/users_${sanitize(slugify(c.title))}-${i.code}`;
+ countries += `- [${(title)}](${cPagePath.toLowerCase()})\n`;
+ });
+ content += `${heading}\n ${countries}`;
+ });
+ write(dst, substitute(template, {
+ content: content,
+ /*hidden: data.v3_mappins.filter((u) => u.moderation !== "accepted").length,
+ total: data.v3_mappins.length*/
+ }));
+ let data;
+ try {
+ data = await discorse.updatePost(OA_DIRECTORY_OVERVIEW_TOPIC, content);
+ debugger;
+ //logger.debug('update post : ' + options.title + ' : ' + data.id + ' | topic id ' + data.topic_id)
+ }
+ catch (e) {
+ return false;
+ }
+ };
+ // await createIntroPage(users, navIndex, './index.md')
+ /*
+
+ return await BPromise.resolve(users).map((u: IImportUser) => {
+ try {
+ return new Promise((resolve, reject) => {
+ setTimeout(() => {
+ const d = updateUser(discorse, u)
+ if (d) {
+ d.then(resolve)
+ } else {
+ reject()
+ }
+ }, 200)
+
+ })
+
+ } catch (e) {
+ debugger;
+ logger.error('error creating user ' + u._id, e)
+ }
+ }, { concurrency: 1 })
+
+ */
+};
+//# sourceMappingURL=users.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/users.js.map b/packages/discourse/dist/lib/oa/users.js.map
new file mode 100644
index 00000000..a2a7ed69
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/users.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/lib/oa/users.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/utils.d.ts b/packages/discourse/dist/lib/oa/utils.d.ts
new file mode 100644
index 00000000..42e9e105
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/utils.d.ts
@@ -0,0 +1,25 @@
+export declare const uploadFile: (discourse: any, forum: any, name: any, filePath: any) => Promise;
+export declare const findReplyPage: (b: any, pages: any) => any;
+export declare const findReplyUpload: (u: any, page: any) => any;
+export declare const getPages: (topics: any, topic: any) => any;
+export declare const getReplies: (topics: any, topic: any) => any[];
+export declare const findFile: (folder: any, filename: any) => any;
+export declare const topicFolder: (forum: any, folder: any, title: any) => string;
+export declare const getFUser: (users: any, user_name: any) => any;
+export declare const dOptions: {
+ host: string;
+ key: string;
+ username: string;
+ rateLimitConcurrency: number;
+};
+export declare const getOAvatar: (index: any, user: any) => any;
+export declare const getTopics: (index: any) => any[];
+export declare const convert: (input: string) => any;
+export declare const getDiscourse: () => any;
+export declare function inspect(arg: any): string;
+export declare function log(...args: any[]): void;
+export declare function mkdirp(path: string): Promise;
+export declare function readJSON(path: string): Promise;
+export declare function writeJSON(path: string, data: object): Promise;
+export declare function exists(path: string): Promise;
+export declare function escape(path: string): string;
diff --git a/packages/discourse/dist/lib/oa/utils.js b/packages/discourse/dist/lib/oa/utils.js
new file mode 100644
index 00000000..f89864fd
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/utils.js
@@ -0,0 +1,150 @@
+import fs from 'fs';
+import { inspect as utilInspect } from 'util';
+const cwd = process.cwd();
+var TurndownService = require('turndown');
+import { Discourser } from '../index';
+import * as path from 'path';
+const fg = require('fast-glob');
+import slugify from "slugify";
+var sanitize = require("sanitize-filename");
+//import { replaceAll } from '../../lib';
+var mom = require('moment');
+export const uploadFile = async (discourse, forum, name, filePath) => {
+ return await discourse.upload(1, filePath);
+};
+export const findReplyPage = (b, pages) => {
+ return pages.find((p) => {
+ return p.replies.find((r) => {
+ return r.replyBody == b;
+ });
+ });
+};
+export const findReplyUpload = (u, page) => {
+ const f_pics = page.f_pics || [];
+ return f_pics.find((p) => {
+ return p.url === u;
+ });
+};
+export const getPages = (topics, topic) => {
+ return topics.filter((t) => {
+ return t.title == topic.title;
+ });
+};
+export const getReplies = (topics, topic) => {
+ if (topic.nextPages) {
+ const all = topics.filter((t) => {
+ return t.title == topic.title;
+ });
+ let replies = all.map((t) => t.replies);
+ replies = [].concat.apply([], replies);
+ replies = replies.sort((a, b) => {
+ const d1 = mom(a.replyDate, 'DD/MM/YYYY AT HH:mm').toDate();
+ const d2 = mom(b.replyDate, 'DD/MM/YYYY AT HH:mm').toDate();
+ return new Date(d1).getTime() > new Date(d2).getTime() ? 1 : -1;
+ });
+ return replies;
+ /*
+ const findReply = (b, pages) => {
+ return pages.find((p) => {
+ return p.replies.find((r) => {
+ return r.replyBody == b;
+ })
+ })
+ }
+ const p = findReply('\n\n\nsounds great, let me get Old Tony´s Schaeubling 13 and a surface grinder first, after that I can do the parts for the espresso machine in the best maker porn fashion possible, no seriously, every time I thought I know something, there’s just another video around the next corner making me cry like a baby, incl. the coffee machine
\n', all);
+ debugger;
+ */
+ }
+ return [];
+};
+export const findFile = (folder, filename) => {
+ const files = fg.sync('**/**/*' + filename + '*', { dot: true, cwd: folder, absolute: true });
+ if (files.length == 0) {
+ return false;
+ }
+ return files[0];
+};
+export const topicFolder = (forum, folder, title) => {
+ const _title = sanitize(slugify(title));
+ const tf = path.resolve(forum + '/' + folder + '/' + _title);
+ return tf;
+};
+export const getFUser = (users, user_name) => {
+ return users.find((u) => {
+ return u.name == user_name;
+ });
+};
+export const dOptions = {
+ host: 'https://forum.osr-plastic.org',
+ key: 'f624b8385fb2219cb49de63d1e22883afdf7b7367a0bebf822523f49f2678031',
+ username: 'admin',
+ rateLimitConcurrency: 1
+};
+export const getOAvatar = (index, user) => {
+ const topics = getTopics(index);
+ let topic = topics.find((t) => {
+ return t.authorName == user;
+ });
+ if (topic) {
+ return topic.authorImage;
+ }
+ for (let i = 0; i < topics.length; i++) {
+ const t = topics[i];
+ if (t.replies) {
+ const r = t.replies.find((r) => {
+ return r.user == user;
+ });
+ if (r) {
+ return r.avatar;
+ }
+ }
+ }
+ return null;
+};
+export const getTopics = (index) => {
+ let topics = [];
+ for (let t in index) {
+ topics.push(index[t]);
+ }
+ return topics;
+};
+export const convert = (input) => {
+ var turndownService = new TurndownService();
+ return turndownService.turndown(input);
+};
+export const getDiscourse = () => {
+ return new Discourser(dOptions);
+};
+export function inspect(arg) {
+ return utilInspect(arg, {
+ depth: 5,
+ colors: true,
+ });
+}
+export function log(...args) {
+ console.log(...args.map((arg) => inspect(arg)));
+}
+export async function mkdirp(path) {
+ try {
+ await fs.promises.mkdir(path);
+ }
+ catch (err) {
+ // don't care if it already exists
+ }
+}
+export async function readJSON(path) {
+ const text = await fs.promises.readFile(path, 'utf8');
+ return JSON.parse(text);
+}
+export function writeJSON(path, data) {
+ return fs.promises.writeFile(path, JSON.stringify(data));
+}
+export function exists(path) {
+ return new Promise(function (resolve) {
+ fs.exists(path, resolve);
+ });
+}
+export function escape(path) {
+ return path.replace(/[^\w]/g, '-').replace(/-+/, '-');
+}
+//# sourceMappingURL=utils.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/oa/utils.js.map b/packages/discourse/dist/lib/oa/utils.js.map
new file mode 100644
index 00000000..fd905b13
--- /dev/null
+++ b/packages/discourse/dist/lib/oa/utils.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/oa/utils.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/osr/index.d.ts b/packages/discourse/dist/lib/osr/index.d.ts
new file mode 100644
index 00000000..ffd16f3f
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/index.d.ts
@@ -0,0 +1 @@
+export * from './urls';
diff --git a/packages/discourse/dist/lib/osr/index.js b/packages/discourse/dist/lib/osr/index.js
new file mode 100644
index 00000000..9dcea789
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/index.js
@@ -0,0 +1,2 @@
+export * from './urls';
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/osr/index.js.map b/packages/discourse/dist/lib/osr/index.js.map
new file mode 100644
index 00000000..4b439433
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/osr/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/osr/urls.d.ts b/packages/discourse/dist/lib/osr/urls.d.ts
new file mode 100644
index 00000000..84d162bd
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/urls.d.ts
@@ -0,0 +1 @@
+export declare const marketplaceUrl: (store: any, product_id: any) => string;
diff --git a/packages/discourse/dist/lib/osr/urls.js b/packages/discourse/dist/lib/osr/urls.js
new file mode 100644
index 00000000..ba78533d
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/urls.js
@@ -0,0 +1,2 @@
+export const marketplaceUrl = (store, product_id) => `${store}/dispatch=products.view&product_id=${product_id}`;
+//# sourceMappingURL=urls.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/osr/urls.js.map b/packages/discourse/dist/lib/osr/urls.js.map
new file mode 100644
index 00000000..f8445620
--- /dev/null
+++ b/packages/discourse/dist/lib/osr/urls.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../../src/lib/osr/urls.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAChD,GAAG,KAAK,sCAAsC,UAAU,EAAE,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/commons.d.ts b/packages/discourse/dist/lib/sync/commons.d.ts
new file mode 100644
index 00000000..add67f4d
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/commons.d.ts
@@ -0,0 +1,11 @@
+///
+export declare const fileAsBuffer: (path: string) => Buffer;
+export declare const images_urls: (content: string) => any[];
+export declare const adjustUrls: (content: string, options: IOptionsSync) => any;
+export declare const fromJSON: (content: string, file: string, options: IOptionsSyncComponent) => void;
+export declare const fromYAML: (content: string, options: IOptionsSync) => {
+ attributes: any;
+ body: any;
+};
+export declare const option: (option: string, taskOptions: any, col: any, _default?: any) => any;
+export declare const createContent: (file: any, _options: any) => Promise;
diff --git a/packages/discourse/dist/lib/sync/commons.js b/packages/discourse/dist/lib/sync/commons.js
new file mode 100644
index 00000000..27d517ff
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/commons.js
@@ -0,0 +1,164 @@
+import * as path from 'path';
+import { Engine as engine } from '@plastichub/osrl/Engine';
+import { parse } from '@plastichub/osrl/options';
+import { pathInfo } from '@polymech/commons/glob';
+import { resolve } from '@polymech/commons';
+import { logger } from '../../';
+import { sync as exists } from '@polymech/fs/exists';
+import { sync as read } from '@polymech/fs/read';
+import { sync as write } from '@polymech/fs/write';
+import { Promise as BPromise } from 'bluebird';
+import { MODULE_NAME } from '../../constants';
+const chokidar = require("chokidar");
+const cheerio = require('cheerio');
+const frontMatter = require('front-matter');
+export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-");
+import { get_cached, set_cached } from '@plastichub/osr-cache/lib';
+import { OSR_CACHE } from '@polymech/commons';
+import * as md5 from 'md5';
+import { RMark, toHTML } from '../markdown';
+export const images_urls = (content) => {
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = [];
+ const links = [];
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ return images;
+};
+export const adjustUrls = (content, options) => {
+ let ret = new RMark({
+ images: (match, capture, arg1, arg2) => ``,
+ //links: (match, capture, arg1, arg2) => `[${capture}](${arg1})`
+ }).render(content);
+ return ret;
+};
+export const fromJSON = (content, file, options) => {
+};
+export const fromYAML = (content, options) => {
+ if (frontMatter.test(content)) {
+ const fm = frontMatter(content);
+ return {
+ attributes: fm.attributes,
+ body: fm.body
+ };
+ }
+ else {
+ return {
+ attributes: {},
+ body: content
+ };
+ }
+};
+// to be changed to osr-defaults
+export const option = (option, taskOptions, col, _default) => {
+ // support grunt or yargs
+ const val = col.option ? col.option : (option) => col[option];
+ let ret = taskOptions[option] !== undefined ? taskOptions[option] : _default;
+ if (val(option) !== undefined) {
+ ret = val(option);
+ }
+ return ret;
+};
+export const createContent = async (file, _options) => {
+ const parts = path.parse(file);
+ const rel = path.relative(_options.root, file);
+ let output = _options.output;
+ let outputInfo = pathInfo(_options.output);
+ const variables = {
+ root: '.',
+ cwd: _options.cwd || path.resolve('.'),
+ ..._options.variables
+ };
+ if (!outputInfo.FILE_EXT) {
+ output = path.resolve(`${_options.output}/${path.parse(rel).dir}/${parts.name}.md`);
+ }
+ else {
+ output = path.resolve(resolve(output, false, variables));
+ }
+ const defaults = {
+ language: _options.lang,
+ debug: _options.debug,
+ profile: _options.profile,
+ output: output,
+ plugins: _options.plugins,
+ env: _options.env || 'library',
+ cwd: _options.cwd || path.resolve('.'),
+ source: file,
+ variables
+ };
+ const options = parse(defaults, defaults);
+ const eOptions = {
+ ...options,
+ root: [
+ ...options.profile.includes,
+ path.parse(file).dir
+ ],
+ toHTML: false,
+ cache: false,
+ keepOutputType: true,
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: false
+ };
+ const Engine = new engine(eOptions);
+ options.source = path.resolve(options.source);
+ const osr_cache = OSR_CACHE();
+ const cached = await get_cached(options.source, eOptions, _options.module || MODULE_NAME);
+ if (osr_cache && cached && _options.cache !== false) {
+ options.debug && logger.info('Compile file serving from cache: ' + options.source);
+ let md5Src = md5(Buffer.from(cached));
+ let md5Dst = md5(fileAsBuffer(options.output));
+ if (!exists(options.output) || md5Src !== md5Dst) {
+ write(options.output, cached);
+ }
+ return cached;
+ }
+ options.debug && logger.info('Compile file ' + file, eOptions);
+ let content = await Engine.render(options.source, options.variables);
+ if (_options.onCompiled) {
+ content = await _options.onCompiled(options.source, output, content);
+ }
+ if (osr_cache && _options.cache !== false) {
+ options.debug && logger.info('Write output to cache', output);
+ await set_cached(options.source, eOptions, _options.module || MODULE_NAME, content);
+ }
+ let dst = path.resolve(resolve(output, false, options.variables));
+ _options.debug && logger.info('Write output to: ', dst);
+ write(dst, content);
+ if (_options.onCompileDone) {
+ await _options.onCompileDone(options.source, dst, options, content);
+ }
+ return content;
+};
+const watch = async (src, options) => {
+ src = path.resolve(src);
+ const watcher = chokidar.watch(`${src}`, {
+ ignored: /(^|[\/\\])\../,
+ persistent: true
+ });
+ watcher.on('change', async (path) => {
+ await createContent(path, options);
+ });
+ return watcher;
+};
+const compileAll = async (files, options) => {
+ return await BPromise.resolve(files).map((f) => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ createContent(f, options).then(() => resolve(true));
+ }, 50);
+ });
+ }, { concurrency: 1 });
+};
+const compileAllEx = async (files, options) => {
+ return await BPromise.resolve(files).map((f) => {
+ return createContent(f, options);
+ }, { concurrency: 1 });
+};
+//# sourceMappingURL=commons.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/commons.js.map b/packages/discourse/dist/lib/sync/commons.js.map
new file mode 100644
index 00000000..f4d39a65
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/commons.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/lib/sync/commons.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/component.d.ts b/packages/discourse/dist/lib/sync/component.d.ts
new file mode 100644
index 00000000..dbb8790e
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/component.d.ts
@@ -0,0 +1,4 @@
+export declare const createPost: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updatePost: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncComponent: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse/dist/lib/sync/component.js b/packages/discourse/dist/lib/sync/component.js
new file mode 100644
index 00000000..f6e1c4fd
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/component.js
@@ -0,0 +1,366 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { createContent } from './osrl';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+const md5 = require('md5');
+import { imageName, downloadFile } from './download';
+import { toHTML } from '../markdown';
+import { isNumber } from '@polymech/core/primitives';
+import { fromJSON, tracking, trackingPath } from './';
+import { cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { images_urls } from './commons';
+import { isValidLibraryComponent, readOSRConfig } from '@plastichub/osr-fs-utils';
+import { logger } from '../../index';
+import { forward_slash } from '@polymech/commons';
+const CONTENT_TEST = false;
+const SKIP_EXISTING = false;
+export const createPost = async (discourse, options, content) => {
+ if (!isNumber(options.cat)) {
+ logger.error(`category not a number! ${options.title} `);
+ }
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ logger.debug('created topic : ' + options.title + ' : ' + data.id + ' | topic id :' + data.topic_id);
+ return true;
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors, data);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+ else {
+ return false;
+ }
+};
+export const updatePost = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ logger.debug('update post : ' + options.title + ' : ' + data.id + ' | topic id ' + data.topic_id);
+ }
+ catch (e) {
+ return false;
+ }
+ if (data) {
+ if (data && data.id) {
+ try {
+ // logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await new Promise(f => setTimeout(f, 1000));
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ return true;
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ return false;
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ return false;
+ }
+ }
+ }
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = trackingPath(root);
+ const track = tracking(root);
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ if ($(this).attr('src') && $(this).attr('src').length > 5) {
+ images.push($(this).attr('src'));
+ }
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.length < 10) {
+ continue;
+ }
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ try {
+ await downloadFile(url, cache_path);
+ }
+ catch (e) {
+ continue;
+ }
+ }
+ if (!exists(image_local)) {
+ continue;
+ }
+ if (!track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && (!track[url] || options.cache === false)) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let config = fromJSON(file, options) || {};
+ const componentDir = path.parse(file).dir;
+ // ph3 back sync
+ const rel = forward_slash(path.relative(options.root, componentDir));
+ const productConfigPath = path.join(options.product_root, rel, 'config.json');
+ let body = await createContent(componentDir, options);
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i]) {
+ body = body.replace(i, images_track[i].short_url);
+ }
+ else {
+ logger.warn(`Cant resolve image url : ${i} - ${componentDir} ! Image Upload track invalid`);
+ }
+ });
+ }
+ logger.debug(`Processing ${componentDir}`);
+ const output = path.join(componentDir, '.osr/discourse_raw.md');
+ let dst = path.resolve(resolve(output));
+ options.debug && logger.info('Write output to: ', dst);
+ write(dst, body);
+ let post_id, topic_id;
+ let dOpts = {
+ ...options,
+ cat: config.forumCategory,
+ id: options.id,
+ owner: config.forumUserId || 1,
+ tags: config.forumTags,
+ title: config.name,
+ topic_id: config.forumTopicId,
+ post_id: config.forumPostId
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ const hash = md5(JSON.stringify({
+ cat: dOpts.cat,
+ tags: dOpts.tags,
+ owner: dOpts.owner,
+ body,
+ title: dOpts.title
+ }, null));
+ // const cats = await cacheCategories(options, discourse)
+ // const tags = await cacheTags(options, discourse)
+ const users = await cacheUsers(options, discourse);
+ await new Promise(f => setTimeout(f, 1000));
+ let search = await discourse.search(dOpts.title);
+ await new Promise(f => setTimeout(f, 2000));
+ let dTopic;
+ let dPost;
+ if (search && search.posts && search.topics) {
+ search.topics.forEach((t, i) => {
+ if (t.title === dOpts.title) {
+ dTopic = t;
+ dPost = search.posts[i];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ });
+ }
+ if (!dTopic || !dPost) {
+ console.error('!dTopic || !dPost : cant find ' + dOpts.title);
+ // return
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ if (SKIP_EXISTING && hash === config.forumPostHash &&
+ config.forumTopicId && config.forumPostId) {
+ return;
+ }
+ if (CONTENT_TEST) {
+ return;
+ }
+ if (post_id) {
+ if (await updatePost(discourse, options, post_id, body)) {
+ if (topic_id) {
+ await new Promise(f => setTimeout(f, 2000));
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ logger.error(`Error updating post ${dOpts.title}`);
+ }
+ }
+ else {
+ if (await createPost(discourse, options, body)) {
+ await new Promise(f => setTimeout(f, 1000));
+ await discourse.updateTopic(options.topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ else {
+ logger.error('Creating post failed !', dOpts.title);
+ }
+ }
+ // const visStatus = await discourse.updateTopicVisibility(topic_id, true)
+ // re-read without defaults
+ config = readOSRConfig(file);
+ config.forumPostHash = hash;
+ if (dTopic) {
+ config.forumTopicId = dTopic.id;
+ }
+ else if (topic_id) {
+ config.forumTopicId = topic_id;
+ }
+ if (dPost) {
+ config.forumPostId = dPost.id;
+ }
+ else if (post_id) {
+ config.forumPostId = post_id;
+ }
+ write(file, config);
+ //ph3 products
+ if (exists(productConfigPath)) {
+ let pConfig = readOSRConfig(productConfigPath);
+ logger.debug(`Updating product config ${productConfigPath}`);
+ pConfig = {
+ ...config
+ //...pConfig,
+ //...
+ /*
+ forumTopicId:config.forumTopicId,
+ forumPostId:config.forumPostId,
+ forumPostHash: config.forumPostHash
+ */
+ };
+ write(productConfigPath, pConfig);
+ }
+ return body;
+};
+export const syncComponent = async (options) => {
+ let components = options.srcInfo.FILES.filter(isValidLibraryComponent);
+ //let components = options.srcInfo.FILES.filter((c) => {
+ //components = components.filter((c) => {
+ /*
+try {
+ const config = readOSRConfig(c) as IComponentConfig
+ if (config) {
+ if (config.forum === false) {
+ return false
+ }
+ // return !config.code && !config.cscartId && !config.steps
+ return !!config.name
+ }
+ return false
+} catch (error) {
+ logger.error(`Invalid config : ${c}`)
+}
+})*/
+ const skipExisting = options.skip;
+ /*
+ [
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/asterix-pp/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/asterix-sm-morren/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/bicycle-shredder/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/idefix/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/obelix/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/pp-v3.3/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/components/shredder_v21-light-ex/config.json",
+ "C:/Users/mc007/Desktop/osr/osr-machines/shredder/components/shredder_v31-light/config.json",
+ ]
+ */
+ if (skipExisting) {
+ components = components.filter((f) => {
+ const config = readOSRConfig(f);
+ if (config.forumPostId && config.forumTopicId) {
+ return false;
+ }
+ return true;
+ });
+ }
+ //components = [components[0]]
+ logger.info(`Syncing ${components.length} components`, components);
+ await BPromise.resolve(components).map((f) => {
+ try {
+ return syncFile(f, options);
+ }
+ catch (error) {
+ debugger;
+ }
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncComponent(options);
+};
+//# sourceMappingURL=component.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/component.js.map b/packages/discourse/dist/lib/sync/component.js.map
new file mode 100644
index 00000000..ad4cb218
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/component.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"component.js","sourceRoot":"","sources":["../../../src/lib/sync/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,EAAE,IAAI,IAAI,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,UAAU,CAAA;AAG9C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AAClC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEpD,OAAO,EAAiB,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAOpE,OAAO,EAIH,UAAU,EACb,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAEH,QAAQ,EACX,MAAM,cAAc,CAAA;AAErB,OAAO,EACH,WAAW,EACd,MAAM,WAAW,CAAA;AAUlB,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,MAAM,YAAY,GAAG,KAAK,CAAA;AAC1B,MAAM,aAAa,GAAG,KAAK,CAAA;AAE3B,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,SAAqB,EAAE,OAAqB,EAAE,OAAO,EAAE,EAAE;IAEtF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,CAAC,KAAK,GAAG,CAAC,CAAA;KAC3D;IAED,IAAI,IAAS,CAAA;IACb,IAAI;QACA,IAAI,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAa,CAAC,CAAA;KACnF;IAAC,OAAO,CAAC,EAAE;QACR,QAAQ,CAAA;KACX;IAED,IAAI,IAAI,EAAE;QACN,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;YACjB,IAAI;gBACA,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;gBAChC,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;gBACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACrG,OAAO,IAAI,CAAA;aACd;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,EAAE,CAAC,CAAC,CAAA;aAClE;SACJ;aAAM;YACH,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,6BAA6B,EAAE;oBACpE,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;iBACxD;aACJ;SACJ;KACJ;SAAM;QACH,OAAO,KAAK,CAAA;KACf;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,SAAqB,EAAE,OAAqB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAEhG,IAAI,IAAS,CAAA;IACb,IAAI;QACA,IAAI,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACpD,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;KACrG;IAAC,OAAO,CAAC,EAAE;QACR,OAAO,KAAK,CAAA;KACf;IAED,IAAI,IAAI,EAAE;QACN,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;YACjB,IAAI;gBACA,kDAAkD;gBAClD,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;gBAChC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;gBAClE,OAAO,IAAI,CAAA;aACd;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,iBAAiB,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,CAAA;gBAC5D,OAAO,KAAK,CAAA;aACf;SACJ;aAAM;YACH,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACnE,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,6BAA6B,EAAE;oBACpE,MAAM,CAAC,KAAK,CAAC,uBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;iBACxD;gBACD,OAAO,KAAK,CAAA;aACf;SACJ;KACJ;AACL,CAAC,CAAA;AAID,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,SAAqB,EAAE,OAAqB,EAAE,EAAE;IAEzF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACf,OAAO,KAAK,CAAA;KACf;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;QACzB,OAAO,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IAEnC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QACV,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACvD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;SACnC;IACL,CAAC,CAAC,CAAA;IAEF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC9C,MAAM,GAAG,GAAW,KAAK,CAAC,CAAC,CAAC,CAAA;QAE5B,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,EAAE;YACjB,SAAQ;SACX;QAED,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC3B,SAAQ;SACX;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAEhD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,GAAG,WAAW,CAAC,CAAC,CAAA;YAC3F,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;gBACrB,GAAG,CAAC,UAAU,CAAC,CAAA;aAClB;YACD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;YACjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YACrD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;gBACtB,IAAI;oBACA,MAAM,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;iBACtC;gBAAC,OAAO,CAAC,EAAE;oBACR,SAAQ;iBACX;aACJ;YACD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;gBACtB,SAAQ;aACX;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACb,MAAM,KAAK,GAAQ,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;gBACzE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;oBACjB,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;oBACjB,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;iBAC3B;qBAAM;oBACH,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;iBACzC;aACJ;YAED,SAAQ;SACX;QAED,IAAI,OAAO,CAAC,WAAW,EAAE;YACrB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACvC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;gBAChE,MAAM,KAAK,GAAQ,MAAM,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;gBACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;oBACjB,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;oBACjB,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;iBAC3B;qBAAM;oBACH,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;iBACzC;aACJ;SACJ;KACJ;IAED,OAAO,KAAK,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,IAAY,EAAE,OAAqB,EAAE,EAAE;IAE3D,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAA6B,CAAC,CAAA;IAEvE,IAAI,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAsB,CAAA;IAE9D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAA;IAEzC,gBAAgB;IAChB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAA;IACpE,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,EAAE,aAAa,CAAC,CAAA;IAE7E,IAAI,IAAI,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IAErD,IAAI,YAAY,CAAA;IAEhB,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE;QAC7C,YAAY,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QACpC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE;gBACjB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;aACpD;iBAAM;gBACH,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,MAAM,YAAY,+BAA+B,CAAC,CAAA;aAC9F;QACL,CAAC,CAAC,CAAA;KACL;IAID,MAAM,CAAC,KAAK,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAA;IAC/D,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACvC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAA;IACtD,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEhB,IAAI,OAAO,EAAE,QAAQ,CAAA;IAErB,IAAI,KAAK,GAA8B;QACnC,GAAG,OAAO;QACV,GAAG,EAAE,MAAM,CAAC,aAAa;QACzB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,MAAM,CAAC,WAAW,IAAI,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC,SAAmB;QAChC,KAAK,EAAE,MAAM,CAAC,IAAI;QAClB,QAAQ,EAAE,MAAM,CAAC,YAAY;QAC7B,OAAO,EAAE,MAAM,CAAC,WAAW;KAC9B,CAAA;IAED,OAAO,GAAG;QACN,GAAG,OAAO;QACV,GAAG,KAAK;KACX,CAAA;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,EAAE,IAAI,CAAC,CAAC,CAAA;IAKT,yDAAyD;IACzD,mDAAmD;IAEnD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAClD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5C,IAAI,MAAoB,CAAA;IACxB,IAAI,KAAkB,CAAA;IAEtB,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE;gBACzB,MAAM,GAAG,CAAC,CAAA;gBACV,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;gBACvB,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAA;gBACpB,OAAO,GAAG,KAAK,CAAC,EAAE,CAAA;aACrB;QACL,CAAC,CAAC,CAAA;KACL;IAED,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7D,SAAS;KACZ;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1B,OAAO,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,KAAK,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,EAAE;QACP,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5C,OAAO,KAAK,CAAA;KACf;IAED,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAA;IAEjC,IAAI,aAAa,IAAI,IAAI,KAAK,MAAM,CAAC,aAAa;QAC9C,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,EAAE;QAC3C,OAAM;KACT;IAED,IAAI,YAAY,EAAE;QACd,OAAM;KACT;IAED,IAAI,OAAO,EAAE;QACT,IAAI,MAAM,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;YACrD,IAAI,QAAQ,EAAE;gBACV,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,MAAM,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAa,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;aACnH;SACJ;aAAM;YACH,MAAM,CAAC,KAAK,CAAC,uBAAuB,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;SACrD;KACJ;SAAM;QACH,IAAI,MAAM,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;YAC5C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAC5C,MAAM,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAa,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;SAC3H;aAAM;YACH,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;SACtD;KACJ;IAED,0EAA0E;IAE1E,2BAA2B;IAC3B,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAE5B,MAAM,CAAC,aAAa,GAAG,IAAI,CAAA;IAE3B,IAAI,MAAM,EAAE;QACR,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,EAAE,CAAA;KAClC;SAAM,IAAI,QAAQ,EAAE;QACjB,MAAM,CAAC,YAAY,GAAG,QAAQ,CAAA;KACjC;IAED,IAAI,KAAK,EAAE;QACP,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,EAAE,CAAA;KAChC;SAAM,IAAI,OAAO,EAAE;QAChB,MAAM,CAAC,WAAW,GAAG,OAAO,CAAA;KAC/B;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAEnB,cAAc;IACd,IAAI,MAAM,CAAC,iBAAiB,CAAC,EAAE;QAC3B,IAAI,OAAO,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAA;QAC9C,MAAM,CAAC,KAAK,CAAC,2BAA2B,iBAAiB,EAAE,CAAC,CAAA;QAC5D,OAAO,GAAG;YACN,GAAG,MAAM;YACT,aAAa;YACb,KAAK;YACL;;;;cAIE;SACL,CAAA;QACD,KAAK,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAA;KACpC;IACD,OAAO,IAAI,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,OAAqB,EAAE,EAAE;IAEzD,IAAI,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAA;IACtE,wDAAwD;IACxD,0CAA0C;IAC1C;;;;;;;;;;;;;;IAcA;IAEA,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAA;IACjC;;;;;;;;;;;QAWI;IACJ,IAAI,YAAY,EAAE;QACd,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACjC,MAAM,MAAM,GAAG,aAAa,CAAC,CAAC,CAAqB,CAAA;YACnD,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE;gBAC3C,OAAO,KAAK,CAAA;aACf;YACD,OAAO,IAAI,CAAA;QACf,CAAC,CAAC,CAAA;KACL;IAED,8BAA8B;IAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,aAAa,EAAE,UAAU,CAAC,CAAA;IAClE,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,IAAI;YACA,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;SAC9B;QAAC,OAAO,KAAK,EAAE;YACZ,QAAQ,CAAA;SACX;IACL,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;AAE1B,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,OAAqB,EAAE,EAAE;IAChD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAA;AACjC,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/directory.d.ts b/packages/discourse/dist/lib/sync/directory.d.ts
new file mode 100644
index 00000000..4081ef8d
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/directory.d.ts
@@ -0,0 +1,4 @@
+export declare const createTopic: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updateTopic: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncComponent: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse/dist/lib/sync/directory.js b/packages/discourse/dist/lib/sync/directory.js
new file mode 100644
index 00000000..aa9bed71
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/directory.js
@@ -0,0 +1,313 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { createContent } from './osrl';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+import { imageName, downloadFile } from './download';
+import { toHTML } from '../markdown';
+import { fromJSON, tracking, trackingPath } from './';
+import { cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { images_urls } from './commons';
+import * as md5 from 'md5';
+import { isValidLibraryComponent, readOSRConfig } from '@plastichub/osr-fs-utils';
+import { logger } from '../../index';
+const fromYAML = (content, options) => {
+ if (frontMatter.test(content)) {
+ const fm = frontMatter(content);
+ return {
+ attributes: fm.attributes,
+ body: fm.body
+ };
+ }
+ else {
+ return {
+ attributes: {},
+ body: content
+ };
+ }
+};
+export const createTopic = async (discourse, options, content) => {
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+export const updateTopic = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ }
+ catch (e) {
+ return false;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ return true;
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ return false;
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ return false;
+ }
+ }
+ }
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = trackingPath(root);
+ const track = tracking(root);
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ if ($(this).attr('src') && $(this).attr('src').length > 5) {
+ images.push($(this).attr('src'));
+ }
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.length < 10) {
+ continue;
+ }
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ try {
+ await downloadFile(url, cache_path);
+ }
+ catch (e) {
+ continue;
+ }
+ }
+ if (!exists(image_local)) {
+ continue;
+ }
+ if (!track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && !track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let config = fromJSON(file, options) || {};
+ const componentDir = path.parse(file).dir;
+ let body = await createContent(componentDir, options);
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i]) {
+ body = body.replace(i, images_track[i].short_url);
+ }
+ else {
+ logger.warn(`Cant resolve image url : ${i}`);
+ }
+ });
+ }
+ const output = path.join(componentDir, '.osr/discourse_raw.md');
+ let dst = path.resolve(resolve(output));
+ options.debug && logger.info('Write output to: ', dst);
+ write(dst, body);
+ let dOpts = {
+ ...options,
+ cat: config.forumCategory,
+ id: options.id,
+ owner: config.forumUserId || 1,
+ tags: config.forumTags,
+ title: config.name
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ // const cats = await cacheCategories(options, discourse)
+ // const tags = await cacheTags(options, discourse)
+ const users = await cacheUsers(options, discourse);
+ let search = await discourse.search(dOpts.title);
+ let post_id, topic_id;
+ if (options.yaml) {
+ post_id = dOpts.post_id;
+ topic_id = dOpts.topic_id;
+ }
+ let dTopic;
+ let dPost;
+ if (search && search.posts && search.topics
+ && search.posts[0] && search.topics[0]
+ && search.topics[0].title === dOpts.title) {
+ dPost = search.posts[0];
+ dTopic = search.topics[0];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ else if (post_id && topic_id) {
+ }
+ if (!dTopic || !dPost) {
+ console.error('cant find ' + dOpts.title);
+ // return
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ let topic = null;
+ if (post_id) {
+ await updateTopic(discourse, options, post_id, body);
+ if (topic_id) {
+ topic = await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ const d = await createTopic(discourse, options, body);
+ if (options.topic_id) {
+ topic_id = options.topic_id;
+ post_id = options.post_id;
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ else {
+ logger.error('Creating topic failed !');
+ }
+ }
+ // const visStatus = await discourse.updateTopicVisibility(topic_id, true)
+ // re-read without defaults
+ config = readOSRConfig(file);
+ if (dTopic) {
+ options.topic_id = dTopic.id;
+ config.forumTopicId = dTopic.id;
+ }
+ if (dPost) {
+ options.post_id = dPost.id;
+ config.forumPostId = dPost.id;
+ }
+ write(file, config);
+ return body;
+};
+export const syncComponent = async (options) => {
+ // let components = options.srcInfo.FILES.filter(isValidLibraryComponent)
+ let components = options.srcInfo.FILES.filter(isValidLibraryComponent);
+ //components = options.srcInfo.FILES.filter((c) => {
+ components = components.filter((c) => {
+ try {
+ const config = readOSRConfig(c);
+ if (config) {
+ // return !config.code && !config.cscartId && !config.steps
+ return !!config.name;
+ }
+ return false;
+ }
+ catch (error) {
+ logger.error(`Invalid config : ${c}`);
+ }
+ });
+ const skipExisting = false;
+ if (skipExisting) {
+ components = components.filter((f) => {
+ const config = readOSRConfig(f);
+ if (config.forumPostId && config.forumTopicId) {
+ return false;
+ }
+ return true;
+ });
+ }
+ //components = [components[0]]
+ await BPromise.resolve(components).map((f) => {
+ try {
+ return syncFile(f, options);
+ }
+ catch (error) {
+ debugger;
+ }
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncComponent(options);
+};
+//# sourceMappingURL=directory.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/directory.js.map b/packages/discourse/dist/lib/sync/directory.js.map
new file mode 100644
index 00000000..b154f308
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/directory.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../../src/lib/sync/directory.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/download.d.ts b/packages/discourse/dist/lib/sync/download.d.ts
new file mode 100644
index 00000000..668cfd3d
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/download.d.ts
@@ -0,0 +1,5 @@
+export declare const sanitize: (f: any) => string;
+export declare const sanitize_ex: (f: any) => string;
+export declare const filename: (_url: any) => string;
+export declare const imageName: (url: any) => string;
+export declare const downloadFile: (_url: string, dir: string) => Promise;
diff --git a/packages/discourse/dist/lib/sync/download.js b/packages/discourse/dist/lib/sync/download.js
new file mode 100644
index 00000000..469067ee
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/download.js
@@ -0,0 +1,40 @@
+import * as path from 'path';
+const _sanitize = require("sanitize-filename");
+const filenamify = require('filenamify');
+import * as download from 'download';
+const URI = require("uri-js");
+import * as url from 'url';
+export const sanitize = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "");
+ if (str.startsWith('_')) {
+ str = str.substring(1);
+ }
+ return str;
+};
+export const sanitize_ex = (f) => {
+ let str = filenamify(_sanitize(f)).replace(/[^\x00-\x7F]/g, "").replace('_', '');
+ return str;
+};
+export const filename = (_url) => {
+ return path.basename(url.parse(_url).path);
+};
+export const imageName = (url) => {
+ if (!url) {
+ return "";
+ }
+ try {
+ const parsed = URI.parse(decodeURIComponent(url));
+ const pParsed = path.parse(parsed.path);
+ return sanitize(decodeURIComponent(pParsed.base));
+ }
+ catch (error) {
+ console.error('error image name : ', url);
+ return "";
+ }
+};
+export const downloadFile = async (_url, dir) => {
+ return download(_url, dir, {
+ filename: imageName(_url)
+ });
+};
+//# sourceMappingURL=download.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/download.js.map b/packages/discourse/dist/lib/sync/download.js.map
new file mode 100644
index 00000000..39089e0a
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/download.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../src/lib/sync/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAE9C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;AACxC,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAE7B,OAAO,KAAK,GAAG,MAAM,KAAK,CAAA;AAE1B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC1B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IACxE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;QACrB,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;KAC1B;IACD,OAAO,GAAG,CAAC;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE;IAC7B,IAAI,GAAG,GAAW,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;IAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC,CAAA;AAGD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE;IAC7B,IAAG,CAAC,GAAG,EAAC;QACJ,OAAO,EAAE,CAAA;KACZ;IACD,IAAI;QACA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;KACrD;IAAC,OAAO,KAAK,EAAE;QACZ,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAC,GAAG,CAAC,CAAA;QACxC,OAAO,EAAE,CAAA;KACZ;AACL,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAW,EAAE,GAAU,EAAE,EAAE;IAC1D,OAAO,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAA;AACN,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/file.d.ts b/packages/discourse/dist/lib/sync/file.d.ts
new file mode 100644
index 00000000..44a3adce
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/file.d.ts
@@ -0,0 +1,4 @@
+export declare const createTopic: (discourse: Discourser, options: IOptionsSync, content: any) => Promise;
+export declare const updateTopic: (discourse: Discourser, options: IOptionsSync, topic_id: any, content: any) => Promise;
+export declare const syncYAML: (options: IOptionsSync) => Promise;
+export declare const sync: (options: IOptionsSync) => Promise;
diff --git a/packages/discourse/dist/lib/sync/file.js b/packages/discourse/dist/lib/sync/file.js
new file mode 100644
index 00000000..ce59d7b1
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/file.js
@@ -0,0 +1,246 @@
+import * as path from 'path';
+import { sync as exists } from "@polymech/fs/exists";
+import { sync as dir } from "@polymech/fs/dir";
+import { sync as write } from "@polymech/fs/write";
+import { sync as read } from "@polymech/fs/read";
+import { resolve } from "@polymech/commons";
+import { Promise as BPromise } from 'bluebird';
+import { imageName, downloadFile } from './download';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+import { toHTML } from '../markdown';
+import { SYNC_TRACK_FILENAME } from '../discourse/constants';
+import { cacheCategories, cacheTags, cacheUsers } from '../discourse/cache';
+import { Instance } from '../discourse';
+import { fromYAML } from './commons';
+import { logger } from "../../index";
+import * as md5 from 'md5';
+export const createTopic = async (discourse, options, content) => {
+ let data;
+ try {
+ data = await discourse.createPost(options.title, content, options.cat);
+ }
+ catch (e) {
+ debugger;
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(options.post_id, options.topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.error('changing owner ' + options.title + ' failed!', e);
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+export const updateTopic = async (discourse, options, topic_id, content) => {
+ let data;
+ try {
+ data = await discourse.updatePost(topic_id, content);
+ }
+ catch (e) {
+ }
+ if (data) {
+ logger.debug('created topic : ' + options.title + ' : ' + data.id);
+ if (data && data.id) {
+ try {
+ logger.debug('change user to ', options.owner);
+ options.post_id = data.id;
+ options.topic_id = data.topic_id;
+ await discourse.changeOwner(topic_id, topic_id, options.user_name);
+ }
+ catch (e) {
+ logger.debug('changing owner ' + options.title + ' failed!');
+ }
+ }
+ else {
+ logger.debug('creating ' + options.title + ' failed!', data.errors);
+ if (data.errors) {
+ if (data.errors[0] && data.errors[0] === 'Title has already been used') {
+ logger.error('title already used : ' + options.title);
+ }
+ }
+ }
+ }
+};
+const images_urls = (content) => {
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = [];
+ const links = [];
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ return images;
+};
+const uploadImages = async (content, discourse, options) => {
+ const root = path.resolve(resolve(options.root));
+ if (!exists(root)) {
+ return false;
+ }
+ const track_path = path.join(root, SYNC_TRACK_FILENAME);
+ const track = read(track_path, 'json') || {};
+ const html = toHTML(content);
+ const $ = cheerio.load(html, {
+ xmlMode: true
+ });
+ const images = images_urls(content);
+ $('img').each(function () {
+ images.push($(this).attr('src'));
+ });
+ for await (const image of Object.entries(images)) {
+ const url = image[1];
+ if (url.startsWith('upload:')) {
+ continue;
+ }
+ if (options.uploadRemote && url.startsWith('http')) {
+ const contentHash = md5(content).substring(0, 5);
+ const cache_path = path.resolve(resolve('${OSR_CACHE}/discourse-downloads/' + contentHash));
+ if (!exists(cache_path)) {
+ dir(cache_path);
+ }
+ const image_name = imageName(url);
+ const image_local = path.join(cache_path, image_name);
+ if (!exists(image_local)) {
+ await downloadFile(url, cache_path);
+ }
+ if (exists(image_local)) {
+ const upped = await discourse.uploadFile(options.owner, image_local);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ continue;
+ }
+ if (options.uploadLocal) {
+ const image_path = path.join(root, url);
+ if (exists(image_path) && !track[url]) {
+ const upped = await discourse.uploadFile(options.owner, image_path);
+ const data = upped.data;
+ if (data && data.id) {
+ track[url] = data;
+ write(track_path, track);
+ }
+ else {
+ console.error('error uploading image');
+ }
+ }
+ }
+ }
+ return track;
+};
+const syncFile = async (file, options) => {
+ const discourse = Instance(null, options.config);
+ let content = read(file);
+ const fm = fromYAML(content, options) || {};
+ let body = "" + fm.body;
+ let images_track;
+ if (options.uploadLocal || options.uploadRemote) {
+ images_track = await uploadImages(body, discourse, options);
+ const image_urls = images_urls(body);
+ image_urls.forEach((i) => {
+ if (images_track[i])
+ body = body.replace(i, images_track[i].short_url);
+ });
+ }
+ write('./out/md.md', body);
+ let dOpts = options.yaml ? fm.attributes : {
+ cat: options.cat,
+ id: options.id,
+ owner: options.owner,
+ tags: options.tags,
+ title: options.title
+ };
+ options = {
+ ...options,
+ ...dOpts
+ };
+ const cats = await cacheCategories(options, discourse);
+ const tags = await cacheTags(options, discourse);
+ const users = await cacheUsers(options, discourse);
+ const search = await discourse.search(dOpts.title);
+ let post_id, topic_id;
+ if (options.yaml) {
+ post_id = dOpts.post_id;
+ topic_id = dOpts.topic_id;
+ }
+ let dTopic;
+ let dPost;
+ if (search.posts && search.topics
+ && search.posts[0] && search.topics[0]
+ && search.topics[0].title === dOpts.title) {
+ dPost = search.posts[0];
+ dTopic = search.topics[0];
+ topic_id = dTopic.id;
+ post_id = dPost.id;
+ }
+ else if (post_id && topic_id) {
+ }
+ const user = users.find((u) => {
+ return u.id === dOpts.owner;
+ });
+ if (!user) {
+ logger.error('Invalid user : ', dOpts.owner);
+ return false;
+ }
+ options.user_name = user.username;
+ let topic = null;
+ if (post_id) {
+ topic = await updateTopic(discourse, options, post_id, body);
+ if (topic_id) {
+ topic = await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ }
+ else {
+ await createTopic(discourse, options, body);
+ topic_id = options.topic_id;
+ post_id = options.post_id;
+ await discourse.updateTopic(topic_id, dOpts.cat, dOpts.title, dOpts.tags ? dOpts.tags.split(',') : []);
+ }
+ if (dTopic) {
+ options.topic_id = dTopic.id;
+ }
+ if (dPost) {
+ options.post_id = dPost.id;
+ }
+ if (options.yaml) {
+ let contentOut = `---\n`;
+ contentOut += YAML.stringify({
+ ...fm.attributes,
+ topic_id: topic_id,
+ post_id: post_id
+ });
+ contentOut += `---\n`;
+ contentOut += fm.body;
+ write(file, contentOut);
+ }
+ return content;
+};
+export const syncYAML = async (options) => {
+ await BPromise.resolve(options.srcInfo.FILES).map((f) => {
+ return syncFile(f, options);
+ }, { concurrency: 1 });
+};
+export const sync = async (options) => {
+ return syncYAML(options);
+};
+//# sourceMappingURL=file.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/file.js.map b/packages/discourse/dist/lib/sync/file.js.map
new file mode 100644
index 00000000..4afe1aa2
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/file.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/lib/sync/file.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/index.js b/packages/discourse/dist/lib/sync/index.js
new file mode 100644
index 00000000..e8c97160
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/index.js
@@ -0,0 +1,29 @@
+import * as path from 'path';
+import { sync as read } from "@polymech/fs/read";
+import { SYNC_TRACK_FILENAME } from '../discourse/constants';
+const YAML = require('json-to-pretty-yaml');
+const cheerio = require('cheerio');
+const findUp = require('find-up');
+const frontMatter = require('front-matter');
+import { readOSRConfig } from '@plastichub/osr-fs-utils';
+export const trackingPath = (root) => path.join(root, SYNC_TRACK_FILENAME);
+export const tracking = (root) => read(trackingPath(root), 'json') || {};
+export const defaultConfig = (configFile, options) => {
+ let defaultsJSON = findUp.sync('defaults.json', {
+ cwd: path.parse(configFile).dir,
+ stopAt: options.root
+ });
+ if (defaultsJSON) {
+ return readOSRConfig(defaultsJSON);
+ }
+ return {};
+};
+export const fromJSON = (configFile, options) => {
+ const defaults = defaultConfig(configFile, options);
+ const config = readOSRConfig(configFile);
+ return {
+ ...defaults,
+ ...config
+ };
+};
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/index.js.map b/packages/discourse/dist/lib/sync/index.js.map
new file mode 100644
index 00000000..ea0db7a2
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EACH,mBAAmB,EACtB,MAAM,wBAAwB,CAAA;AAc/B,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AAClC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;AAI3C,OAAO,EAA2B,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAEjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,CACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAA;AAGxC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,OAAqB,EAAoB,EAAE;IACzF,IAAI,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;QAC5C,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG;QAC/B,MAAM,EAAE,OAAO,CAAC,IAAI;KACvB,CAAC,CAAA;IACF,IAAI,YAAY,EAAE;QACd,OAAO,aAAa,CAAC,YAAY,CAAC,CAAA;KACrC;IACD,OAAO,EAEc,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAAE,OAAqB,EAAoB,EAAE;IACpF,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IACxC,OAAO;QACH,GAAG,QAAQ;QACX,GAAG,MAAM;KACZ,CAAA;AACL,CAAC,CAAA"}
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/osrl.d.ts b/packages/discourse/dist/lib/sync/osrl.d.ts
new file mode 100644
index 00000000..2db09400
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/osrl.d.ts
@@ -0,0 +1,3 @@
+///
+export declare const fileAsBuffer: (path: string) => Buffer;
+export declare const createContent: (component: any, _options: IOptionsSyncComponent) => Promise;
diff --git a/packages/discourse/dist/lib/sync/osrl.js b/packages/discourse/dist/lib/sync/osrl.js
new file mode 100644
index 00000000..e6d028e5
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/osrl.js
@@ -0,0 +1,70 @@
+import * as path from 'path';
+import { Engine as engine } from '@plastichub/osrl/Engine';
+import { parse } from '@plastichub/osrl/options';
+import { forward_slash } from '@polymech/commons/glob';
+import { resolve } from '@polymech/commons';
+import { logger } from '../../index';
+import { git_status } from '../git';
+import * as moment from 'moment';
+import { sync as read } from '@polymech/fs/read';
+export const fileAsBuffer = (path) => read(path, 'buffer') || Buffer.from("-");
+const variable_extras = async (component, rel, options) => {
+ const root = path.resolve(resolve('${OSR_LIBRARY_MACHINES}'));
+ const gitStats = await git_status(root, rel);
+ const latest = gitStats.latest;
+ return {
+ "GIT_LAST": moment(latest.date).format('LLLL'),
+ "GIT_AUTHOR": latest.author_name,
+ "GIT_MESSAGE": latest.message,
+ "GIT_COMMIT": latest.hash
+ };
+};
+export const createContent = async (component, _options) => {
+ const parts = path.parse(component);
+ const rel = forward_slash(path.relative(_options.root, component));
+ const extras = await variable_extras(component, rel, _options);
+ const variables = {
+ root: _options.root,
+ cwd: _options.cwd,
+ ..._options.variables,
+ product: rel,
+ product_rel: rel,
+ product_rel_min: rel,
+ ...extras
+ };
+ const defaults = {
+ language: _options.language,
+ debug: false,
+ profile: _options.profile,
+ // output: output,
+ plugins: [],
+ env: _options.env || 'forum',
+ cwd: _options.cwd,
+ source: _options.src,
+ variables
+ };
+ const options = parse(defaults, defaults);
+ const eOptions = {
+ ...options,
+ root: [
+ ...options.profile.includes,
+ component
+ ],
+ toHTML: false,
+ cache: false,
+ keepOutputType: true,
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: false
+ };
+ const Engine = new engine(eOptions);
+ options.debug && logger.info('Compile file ' + component, eOptions);
+ let content = await Engine.render(options.source, {
+ ...options.variables,
+ ...extras
+ });
+ return content;
+};
+//# sourceMappingURL=osrl.js.map
\ No newline at end of file
diff --git a/packages/discourse/dist/lib/sync/osrl.js.map b/packages/discourse/dist/lib/sync/osrl.js.map
new file mode 100644
index 00000000..ec3b9517
--- /dev/null
+++ b/packages/discourse/dist/lib/sync/osrl.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"osrl.js","sourceRoot":"","sources":["../../../src/lib/sync/osrl.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/packages/discourse/dist/main.d.ts b/packages/discourse/dist/main.d.ts
new file mode 100644
index 00000000..d1ebc9c7
--- /dev/null
+++ b/packages/discourse/dist/main.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/packages/discourse/dist/main.js b/packages/discourse/dist/main.js
new file mode 100644
index 00000000..5d7319eb
--- /dev/null
+++ b/packages/discourse/dist/main.js
@@ -0,0 +1,26 @@
+#!/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);
+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/main.js.map b/packages/discourse/dist/main.js.map
new file mode 100644
index 00000000..f96906e4
--- /dev/null
+++ b/packages/discourse/dist/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;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAAC,QAAQ,EAAE,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AAChF,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAAC,aAAa,CAAC,GAAG,CAAC,CAAA;AAEnF,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAAC,gBAAgB,CAAC,GAAG,CAAC,CAAA;AACnG,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAAC,sBAAsB,CAAC,GAAG,CAAC,CAAA;AAEhH,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAAC,YAAY,CAAC,GAAG,CAAC,CAAA;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAAC,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAE5G,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/options.d.ts b/packages/discourse/dist/options.d.ts
new file mode 100644
index 00000000..3cbe1c97
--- /dev/null
+++ b/packages/discourse/dist/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/options.js b/packages/discourse/dist/options.js
new file mode 100644
index 00000000..2c836b9d
--- /dev/null
+++ b/packages/discourse/dist/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/options.js.map b/packages/discourse/dist/options.js.map
new file mode 100644
index 00000000..397e143c
--- /dev/null
+++ b/packages/discourse/dist/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/types.d.ts b/packages/discourse/dist/types.d.ts
new file mode 100644
index 00000000..216f5eb7
--- /dev/null
+++ b/packages/discourse/dist/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/types.js b/packages/discourse/dist/types.js
new file mode 100644
index 00000000..be91ef3e
--- /dev/null
+++ b/packages/discourse/dist/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/types.js.map b/packages/discourse/dist/types.js.map
new file mode 100644
index 00000000..5eacbb6d
--- /dev/null
+++ b/packages/discourse/dist/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/package.json b/packages/discourse/package.json
index db38b116..05211651 100644
--- a/packages/discourse/package.json
+++ b/packages/discourse/package.json
@@ -34,6 +34,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",
@@ -47,7 +48,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",
@@ -68,7 +68,11 @@
"docs": "npx typedoc src/index.ts",
"dev-test-watch": "mocha-typescript-watch",
"typesafe-i18n": "typesafe-i18n",
- "link-dev": "sh scripts/link-dev.sh"
+ "link-dev": "sh scripts/link-dev.sh",
+ "test:e2e": "vitest run"
+ },
+ "devDependencies": {
+ "vitest": "^3.0.0"
},
"homepage": "https://git.osr-plastic.org/plastichub/lib-content",
"repository": {
@@ -82,4 +86,4 @@
"keywords": [
"typescript"
]
-}
+}
\ No newline at end of file
diff --git a/packages/discourse/src/_cli.ts b/packages/discourse/src/_cli.ts
index 78047a29..5e136a74 100644
--- a/packages/discourse/src/_cli.ts
+++ b/packages/discourse/src/_cli.ts
@@ -1,15 +1,8 @@
import { sync as exists } from '@polymech/fs/exists'
-import { IOptions, IOptionsSync } from './types'
-import { logger } from './'
+import { IOptions, IOptionsSync } from './types.js'
+import { logger } from './index.js'
import * as path from 'path'
-import { forward_slash, pathInfo } from "@polymech/commons"
-import { isFile, resolve } from "@polymech/commons"
-
-import { substitute } from './index'
-
-const globBase = require('glob-base')
-
export const defaults = () => {
// default command
const DefaultCommand = 'info';
diff --git a/packages/discourse/src/lib/discourse/cache.ts b/packages/discourse/src/lib/discourse/cache.ts
index 97413f1c..f3e7e13c 100644
--- a/packages/discourse/src/lib/discourse/cache.ts
+++ b/packages/discourse/src/lib/discourse/cache.ts
@@ -4,59 +4,33 @@ 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 { sync as mkdir } from '@polymech/fs/dir'
-import { files } from '@polymech/commons'
-import { IUploadedFileMeta } from '@polymech/commons'
-import { forward_slash } from '@polymech/commons'
import {
- IOptions,
- IImportUser,
- IOAHowto,
- IOACategory,
- IOATags,
- IOAHowtoImport,
IDiscourseUser
-} from '../../'
+} from '../../index.js'
+
import {
- logger
-} from '../../index'
-
-import {
- HT_CATS,
DISCOURSE_CATEGORY_CACHE,
DISCOURSE_TAGS_CACHE,
- DISCOURSE_TOPICS_CACHE,
DISCOURSE_USER_CACHE,
- OSR_CACHE_ROOT,
- OSR_DISCOURSE_CACHE,
-} from '../discourse/constants'
+} from '../discourse/constants.js'
-import { Discourser } from '../index'
+import { Discourser } from '../index.js'
import * as path from 'path'
-import * as cheerio from 'cheerio'
-
-import { html_beautify } from 'js-beautify'
-import { Converter } from 'showdown'
-
-const escapeHtml = require('escape-html')
-const pretty = require('pretty')
-
export const fileAsBuffer = (path: string) => read(path, 'buffer') as Buffer || Buffer.from("-")
-import { get_cached, set_cached } from '@plastichub/osr-cache/lib'
+import { get_cached, set_cached } from '@polymech/cache/lib'
import { OSR_CACHE } from '@polymech/commons'
-import * as md5 from 'md5'
import {
MODULE_NAME
-} from '../../constants'
+} from '../../constants.js'
export const cacheCategories = async (options: any, discourse: Discourser) => {
diff --git a/packages/discourse/src/lib/discourse/index.ts b/packages/discourse/src/lib/discourse/index.ts
index ac4c0412..cf19b5d4 100644
--- a/packages/discourse/src/lib/discourse/index.ts
+++ b/packages/discourse/src/lib/discourse/index.ts
@@ -1,10 +1,10 @@
-import { MODULE_NAME } from '../../constants'
+import { MODULE_NAME } from '../../constants.js'
import { CONFIG_DEFAULT } from '@polymech/commons'
import { IOSRConfig, IDiscourseConfig } from '@polymech/commons/types'
-import { logger as _logger } from '@polymech/core/debug'
+import { logger as _logger } from '../index.js'
export const logger: any = _logger(MODULE_NAME)
@@ -16,21 +16,23 @@ import PromisePool from 'native-promise-pool'
import { join } from 'path'
-import axios from 'axios'
+import * as _axios from 'axios'
+const axios = (_axios as any).default || _axios
import * as fs from 'fs'
import * as path from 'path'
-import * as FormData from 'form-data'
+import * as _FormData from 'form-data'
+const FormData: any = (_FormData as any).default || _FormData
-const https = require('https')
-const request = require("request")
-const fetch = require('isomorphic-unfetch')
+import * as https from 'https'
+import * as _fetch from 'isomorphic-unfetch'
+const fetch = (_fetch as any).default || _fetch
export const escape = (path: string) =>
path.replace(/[^\w]/g, '-').replace(/-+/, '-')
import { generate } from 'generate-password'
-import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types'
+import { TPostStatus, TPostStatusUpdate, UserPreferencesUpdate } from './types.js'
// types
import {
@@ -59,11 +61,9 @@ import {
TagsResponse,
Tag,
TopicUpdateBasicTopic
-} from './types';
+} from './types.js';
import { IDiscourseUser } from '@polymech/commons'
-import { EDiscourseConfigKey } from './constants'
-import { IDImage } from '../oa/index'
-
+import { EDiscourseConfigKey } from './constants.js'
/**
@@ -136,7 +136,7 @@ export class Discourser {
/** Fetch a discourse API URL, with rate limit retries */
private async _post(url, data): Promise {
- const opts: RequestInit = {
+ const opts = {
headers: {
'Api-Key': this.key,
'Api-Username': this.username,
@@ -471,98 +471,6 @@ export class Discourser {
const url = `${this.host}/t/${topicID}/change-timestamp`
- let ret = await fetch(url, {
- "headers": {
-
- "accept-language": "en-GB,en-US;q=0.9,en;q=0.8,de;q=0.7,es;q=0.6,fr;q=0.5",
- "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
- "x-csrf-token": token,
- "x-requested-with": "XMLHttpRequest",
- "cookie": "_bypass_cache=true; _ga_MBZGKNMDWC=GS1.1.1685892974.20.1.1685893082.0.0.0; _ga_P4SR15V1XR=GS1.1.1687459978.51.1.1687460537.0.0.0; _ga_H8W78Y3P2B=GS1.1.1687604701.23.0.1687604701.0.0.0; _ga=GA1.1.401826746.1678337758; _t=xQ05qW5JFxLM9Pq0lIwG6ez74Z1q2OLpak0DzRx8VdFYE5eI3oJXhLURPrdm2zIcHmYcBj9q%2BKdHhGz5N6j9mXitYzcMwkXHL3K9GYKdO4gJ8tBQimpmd1HFaRhB9Ml9aJ8WviqQWDZDOYwEUKFcWw3wbAalfQtbdIbUSX8gH9sG6DLFU3HiEg7tWModRy%2BoFrTm6QOalDuajRW3nBazau%2FiY8ZCVm2g30Y10CBDfqJHL1ztV8XM4kEIeulLNTzGVtSb7uuO1OcjZRSb--aDgCPEalq7SIpnH5--HWCNf5readaeij3oDl9b9w%3D%3D; __profilin=p%3Dt%2Ca%3Deef38e031f99cc8240f3518e1b8811cf; _forum_session=RkEWuzKI1QXBYCnP6KRamD8mweZ3h9%2B6G%2Fi23gAWUgy8gp8FuiyQD5lKU0Fbx3FzzaM4SiQcvnIiEAnb5P4OYjlvstqwWlfRp%2B9is7iX8StwYGiYsncHQ5LrzSbV3y9mR7sj%2F8JZ8evQOe2ZZjZB3iEkppsGrmyFrw5PsUgSphRTZm70SKIw96JrW17yK4hhLqtk%2BaQPgNu4oJl42YfXAr%2FCBldcBUKXFeHppYmv61WECV0531hCo7GcA4t06B9QpSr%2BeoiM1Ok9tpQrAlZf36Ka4lVCTyXXu3SNvbtvfd9tZMJCWDYv69jdMsezuOaEP870pk9qYPaL4x6nAY5EXO3u9usCggqQ1B1EydCK9uMy7ZUCIo9wONw7QOIgEQ%3D%3D--GMqYSb2H7xXVDky6--R9gVciBqwC0IL9LefywrFw%3D%3D; _ga_GVR8PEPG6C=GS1.1.1687710574.106.1.1687710599.0.0.0",
- 'Api-Key': this.key,
- 'Api-Username': this.username
- },
- "body": `timestamp=${time}`,
- "method": "PUT"
- });
-
- if (ret && ret.status === 200) {
- return true
- }
- return
-
- /*
- let data = new FormData();
- data.append('timestamp', time);
-
- try {
- let ret = await axios.put(url, data, {
- headers: {
- //'Accept-Language': 'en-US,en;q=0.8',
- //'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
- //'Content-Type': `multipart/form-data; boundary=${data._boundary}`,
- 'Api-Key': this.key,
- 'Api-Username': this.username
- }
- });
- debugger
- } catch (error) {
- debugger
- }
-
-
- return
- */
-
- /*
- var options = {
- method: 'PUT',
- url: url,
- headers:
- {
- 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
- 'Api-Key': this.key,
- 'Api-Username': this.username
- },
- body: `timestamp=${time}`
- };
-
- new Promise((resolve, reject) => {
- request(options, function (error, response, body) {
- if (error) {
- throw new Error(error);
- } else {
- resolve(body);
- }
- });
- });
- */
-
- /*
- var options = {
- method: 'POST',
- url: url,
- headers:
- {
- 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
- 'Api-Key': this.key,
- 'Api-Username': this.username
- },
- body
- }
-
-
- return new Promise((resolve, reject) => {
- request(options, function (error, response, body) {
- if (error) {
- throw new Error(error);
- } else {
- resolve(body);
- }
- });
- });
-*/
-
// prepare the request
const request: TopicUpdateTimestampRequest = {
@@ -747,31 +655,23 @@ export class Discourser {
const url = `${this.host}/posts.json`;
- let data: any = new FormData();
- data.append('topic_id', '' + postId);
- data.append('raw', raw);
- data.append('nested_post', 'true');
- data.append('category', category);
- var options = {
- method: 'POST',
- url: url,
- headers:
- {
+ 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
- },
- "body": `raw=${raw}&unlist_topic=false&category=${category}&topic_id=${postId}&is_warning=false&archetype=regular&featured_link=&shared_draft=false&nested_post=true`,
- };
-
- return new Promise((resolve, reject) => {
- request(options, function (error, response, body) {
- if (error) {
- throw new Error(error);
- } else {
- resolve(body);
- }
- });
+ }
});
}
@@ -779,28 +679,16 @@ export class Discourser {
async changeOwner(postId: string | number, topicId: string | number, owner: string
) {
const url = `${this.host}/t/${topicId}/change-owner.json`;
- var options = {
- method: 'POST',
- url: url,
- headers:
- {
+
+ 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
- },
- body: `post_ids%5B%5D=${postId}&username=${owner}`
- };
-
-
- return new Promise((resolve, reject) => {
- request(options, function (error, response, body) {
- if (error) {
- throw new Error(error);
- } else {
- resolve(body);
- }
- });
- });
+ }
+ })
}
async createUser(data): Promise {
@@ -881,7 +769,7 @@ export class Discourser {
data.append('upload_type', 'avatar');
data.append('file', fs.createReadStream(file));
- return await axios.post(url, data, {
+ return (await axios.post(url, data, {
headers: {
'accept': 'application/json',
'Accept-Language': 'en-US,en;q=0.8',
@@ -889,7 +777,7 @@ export class Discourser {
'Api-Key': this.key,
'Api-Username': this.username
}
- });
+ })).data;
}
async uploadFile(userId, file): Promise {
@@ -902,7 +790,7 @@ export class Discourser {
data.append('upload_type', 'composer');
data.append('file', fs.createReadStream(file));
- return await axios.post(url, data, {
+ return (await axios.post(url, data, {
headers: {
'accept': 'application/json',
'Accept-Language': 'en-US,en;q=0.8',
@@ -910,7 +798,7 @@ export class Discourser {
'Api-Key': this.key,
'Api-Username': this.username
}
- });
+ })).data;
}
// =================================
diff --git a/packages/discourse/src/lib/index.ts b/packages/discourse/src/lib/index.ts
index 80bc51e3..707f272f 100644
--- a/packages/discourse/src/lib/index.ts
+++ b/packages/discourse/src/lib/index.ts
@@ -1,3 +1,3 @@
-export * from './discourse'
-export * from './discourse/types'
+export * from './discourse/index.js'
+export * from './discourse/types.js'